Как определить, какие библиотеки библиотек использует моя R-установка?

У меня есть матричная ошибка при использовании компьютерного кластера в моем университете, который я не могу воспроизвести на своей локальной машине. Я думаю, что это может быть связано с различием матричных библиотек (BLAS, LAPACK, ATLAS и т.д.). Я не знаю много об этих библиотеках, кроме того, что я читал здесь, но я думаю, что должен быть способ заставить R сказать мне, какая матрица библиотеки, которые были установлены с (то есть, какие из них он использует), аналогично sessionInfo(), чтобы сообщить мне, какую версию R пакетов он использует.

Ответ 1

Хотя для этого не может быть явной функции R, возможно, вы можете использовать команды оболочки (например, file и ldd), чтобы получить некоторые подсказки, не требуя восстановления 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/...). Он принимает некоторые выводы, но это шаг. Это работает для меня с R-3.3.2 на ubuntu, поэтому я могу только предположить, что он будет похож на разные ОС. Если это неинформативно, вы можете также grep для "/lib" или "/exec" (или просто просмотреть весь файл script для других подсказок).

Как только вы узнаете путь, вызванный script (или если он не является script), найдите зависимости разделяемой библиотеки:

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.

Ответ 2

Насколько мне известно, не существует определенной функции (особенно не в базе 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 символической ссылкой на вашу новую библиотеку. Обязательно установите R с параметром --with-shared-blas, как описано здесь: 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