如何确定我的 R 安装正在使用哪些矩阵库?

Posted

技术标签:

【中文标题】如何确定我的 R 安装正在使用哪些矩阵库?【英文标题】:How can I determine which matrix libraries my R install is using? 【发布时间】:2015-06-05 00:55:39 【问题描述】:

在我的大学使用计算机集群时出现矩阵错误,无法在本地计算机上重现。我认为这可能是由于矩阵库(BLAS、LAPACK、ATLAS 等)的不同。除了我读过的here 之外,我对这些库了解不多,但我认为应该有一种方法让 R 告诉我它安装了哪些矩阵库(即它正在使用哪些矩阵库) ,类似于 sessionInfo() 告诉我它正在使用哪个版本的 R 包。

【问题讨论】:

【参考方案1】:

虽然可能没有明确的 R 函数,但也许您可以利用 shell 命令(例如,fileldd)获得一些线索,而无需重建 R 或集群上的 root 访问权限:

(rpath <- Sys.which("R"))
#            R
# "/usr/bin/R"

要确保ldd 可以正常工作,请查看它是什么类型的文件:

system2("file", rpath)
# /usr/bin/R: Bourne-Again shell script, ASCII text executable

如果您的显示一个实际的可执行文件(例如ELF 64-bit LSB executable, x86-64, ...),则跳过这一步。

script <- readLines(rpath)
script[grepl("/bin/", script)]
# [1] "#!/bin/bash"
# [2] "     if [ -x \"/usr/$libnn/R/bin/exec/R\" ]; then"
# [3] "     elif [ -x \"/usr/$libnn_fallback/R/bin/exec/R\" ]; then"
# [4] "## some systems have a more portable sed, e.g. /usr/xpg4/bin/sed on Solaris,"
# [5] "SED=/bin/sed"
# [6] "      exec sh \"$R_HOME/bin/Rcmd\" \"$@\" ;;"
# [7] "R_binary=\"$R_HOME/bin/exec$R_ARCH/R\""

这告诉我实际的可执行文件是/usr/lib/R/bin/exec/R(或/usr/lib64/...)。它正在采取一些推论,但这是一个步骤。这对我在 ubuntu 上使用 R-3.3.2 有效,所以我只能假设它在不同的操作系统上是相似的。如果这没有提供信息,您也可以使用 grep 查找 "/lib""/exec"(或者只检查整个脚本文件以获取其他线索)。

一旦您知道脚本调用的路径(或者如果它不是开始的脚本),找到共享库依赖项:

system2("ldd", "/usr/lib/R/bin/exec/R")
#         linux-vdso.so.1 =>  (0x00007ffcfadcd000)
#         libR.so => /usr/lib/R/lib/libR.so (0x00007f746f615000)
#         libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f746f3eb000)
#         libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f746f025000)
#         libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f746eda8000)
#         libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f746eaa2000)
#         libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f746e85b000)
#         libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f746e61d000)
#         liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f746e3fb000)
#         libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f746e1ea000)
#         libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f746dfd1000)
#         librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f746ddc9000)
#         libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f746dbc4000)
#         libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f746d9b5000)
#         /lib64/ld-linux-x86-64.so.2 (0x0000560abd5fa000)
#         libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f746d78b000)

此输出的第 5 行表明 R 正在使用 BLAS 库,特别是 libblas3

【讨论】:

感谢您全面详细的回答。我永远不会自己弄清楚。遗憾的是 R 没有“关于我”的功能,比如 "R --version" ,但也许它可以被称为 "R --buildoptions"。【参考方案2】:

据我所知,没有特定的函数(尤其是在 base R 中)可以为您提供 BLAS 版本。 R 很可能会使用系统附带的标准库(除非有人使用特定 BLAS 版本从源代码构建它)。

你必须从终端输入

locate libblas.so

它可能位于/usr/lib/libblas.so/usr/lib64/libblas.so,并且该位置可能是一个符号链接。所以点击链接

ls -l /usr/lib/libblas.so

如果您想更改符号链接以指向不同的 BLAS 库,您可以这样做 update-alternatives --config libblas.so.3gf 并选择您要使用的版本。这篇文章非常详细地解释了它:https://www.r-bloggers.com/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/

确定您使用的版本的另一种方法是安装您想要的任何 BLAS 实现 - 例如 OpenBLAS,然后用指向新库的符号链接替换标准 R BLAS 库。确保使用--with-shared-blas 选项安装 R,如下所述:https://cran.r-project.org/doc/manuals/r-release/R-admin.html#BLAS 然后你只需要:

# navigate to your R directory
cd  …/path-to-R-installation/lib/R/lib
# backup the original 
mv libRblas.so libRblas.backup 
# create simlink
ln –s …/path-to-new-0blas-library/new-lib.so libRblas.so

【讨论】:

很好的解释。我也猜想@rcorty 可以用它来发现 Blas 是否真的是问题的原因。通过安装一系列 Blas 库并更新符号链接来一次测试一个,看看它是否会复制错误。 感谢您的回复。我特别感兴趣的情况是,我与之共享机器的其他人使用指定的矩阵数学库从源代码构建 R,例如。 ATLAS、BLAS、OpenBLAS 等。如果我的问题不够清楚,我深表歉意。我很好奇我是否能弄清楚他做了什么。【参考方案3】:

谷歌搜索一下就够了吗?: http://www.stat.cmu.edu/~nmv/2013/07/09/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/

【讨论】:

感谢您的回复。根据我对那篇文章的阅读,它提供了有关如何使用不同矩阵库构建 R 的信息,但不能帮助我确定在现有构建中使用了哪个矩阵库。

以上是关于如何确定我的 R 安装正在使用哪些矩阵库?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定哪些正在运行的应用程序正在使用 .Net

如何确定最快的链接顺序?

R中存在哪些技术来可视化“距离矩阵”?

我需要在 multiplyMatrixByConstant 方法中使用矩阵数组,但我不确定如何

如何确定哪个旧版本的 R 包与我的 R 版本兼容

如何创建密钥库?