我在尝试加载Rmpi时遇到问题,并收到以下错误消息:
> library('Rmpi')
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared library '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
In addition: Warning message:
.Last.lib failed in detach() for 'Rmpi', details:
call: dyn.unload(file.path(libpath, "libs", paste("Rmpi", .Platform$dynlib.ext,
error: dynamic/shared library '/usr/lib64/R/library/Rmpi/libs/Rmpi.so' was not loaded
Error in library("Rmpi") : .First.lib failed for 'Rmpi'
但是,当我以root用户身份登录时,不会发生此错误。
它似乎不是权限问题。我检查了libmpi.so.0的权限:
[meehan@cnl10 /]$ ll /usr/lib64/lam/lib/
total 7.4M
-rw-r--r-- 1 root root 207 May 25 2008 lam.module
-rw-r--r-- 1 root root 885K May 25 2008 liblam.a
-rw-r--r-- 1 root root 361K May 25 2008 liblamf77mpi.a
lrwxrwxrwx 1 root root 21 Apr 12 2010 liblamf77mpi.so -> liblamf77mpi.so.0.0.0
lrwxrwxrwx 1 root root 21 Apr 12 2010 liblamf77mpi.so.0 -> liblamf77mpi.so.0.0.0
-rwxr-xr-x 1 root root 73K May 25 2008 liblamf77mpi.so.0.0.0
-rw-r--r-- 1 root root 2.2M May 25 2008 liblammpi++.a
-rw-r--r-- 1 root root 509K May 25 2008 liblammpio.a
lrwxrwxrwx 1 root root 20 Apr 12 2010 liblammpi++.so -> liblammpi++.so.0.0.0
lrwxrwxrwx 1 root root 20 Apr 12 2010 liblammpi++.so.0 -> liblammpi++.so.0.0.0
-rwxr-xr-x 1 root root 167K May 25 2008 liblammpi++.so.0.0.0
lrwxrwxrwx 1 root root 15 Apr 12 2010 liblam.so -> liblam.so.0.0.0
lrwxrwxrwx 1 root root 15 Apr 12 2010 liblam.so.0 -> liblam.so.0.0.0
-rwxr-xr-x 1 root root 332K May 25 2008 liblam.so.0.0.0
-rw-r--r-- 1 root root 2.2M May 25 2008 libmpi.a
lrwxrwxrwx 1 root root 15 Apr 12 2010 libmpi.so -> libmpi.so.0.0.0
lrwxrwxrwx 1 root root 15 Apr 12 2010 libmpi.so.0 -> libmpi.so.0.0.0
-rwxr-xr-x 1 root root 655K May 25 2008 libmpi.so.0.0.0
和Rmpi.so:
[meehan@cnl10 /]$ ll /usr/lib64/R/library/Rmpi/libs/
total 108K
-rwxr-xr-x 1 root root 104K Jan 20 2011 Rmpi.so
无论如何,我正在以sudo的身份运行R。
相关系统信息:
-Linux发行版:CentOS 5.5
-R版本:2.11.1(2010-05-31)
-Rmpi版本:0.5-8
-MPI实现是openmpi
[meehan@cnl10 /]$ echo $LD_LIBRARY_PATH
/opt/lib:/opt/open-mpi/tcp-`gnu41/lib:/opt/intel/mkl/10.2/lib/em64t:/opt/intel/fce/11.1/lib:/opt/intel/cce/11.1/lib:`
非常感激任何的帮助!
最佳答案
这里的问题是,默认情况下,OpenMPI不会向系统链接器注册其库目录。这就是为什么一些安装指南建议您将其目录放在LD_LIBRARY_PATH
变量中,以便可以在运行时找到这些库的原因。但是,每次加载新的Shell时,都必须执行“将目录添加到LD_LIBRARY_PATH”,这就是为什么这些指南建议将其放入~/.bashrc
或类似内容中,以便在每次登录时恢复设置。
但是,~/.bashrc
文件(或~/.profile
或任何此类文件)是用户特定的设置。假设在安装openmpi和Rmpi等时以root身份登录,这似乎是可能的,这意味着添加到这些用户特定文件中只会在以root身份运行时设置库路径,而不是通常的运行时用户。 。
通常,解决方法是告诉链接器可以在哪里找到这些文件。在运行CentOS 7,OpenMPI 1.10.0(使用Scientific Linux RPM),R 3.2.3和Rmpi 0.6-5的我自己的系统上,当我无法设置库路径时会发生以下情况:
[dchurch@workstation ~]$ R -q -e "library('Rmpi')"
> library('Rmpi')
Error : .onLoad failed in loadNamespace() for 'Rmpi', details:
call: dyn.load(file, DLLpath = DLLpath, ...)
error: unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.12: cannot open shared object file: No such file or directory
Error: package or namespace load failed for ‘Rmpi’
Execution halted
如果我使用一个临时变量临时设置链接器路径,则该路径可用于以下调用:
[dchurch@workstation ~]$ LD_LIBRARY_PATH=/usr/lib64/openmpi/lib R -q -e "library('Rmpi')"
> library('Rmpi')
>
>
但是,要使此更改永久生效,最好的方法是通过在
/etc/ld.so.conf.d
中创建一个新文件并运行ldconfig
,向系统链接器本身注册openmpi库目录,如下所示:[dchurch@workstation ~]$ sudo sh -c 'echo /usr/lib64/openmpi/lib > /etc/ld.so.conf.d/openmpi.conf; ldconfig'
[dchurch@workstation ~]$ R -q -e "library('Rmpi')"
> library('Rmpi')
>
>
完成此操作后,无论环境变量如何,都应该能够为任何用户加载Rmpi。
关于Rmpi无法以非root用户身份加载共享库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19120927/