2015-03-31 13 views
10

Mam błąd macierzy podczas używania klastra komputerowego na mojej uczelni, którego nie mogę odtworzyć na komputerze lokalnym. Myślę, że może to wynikać z różnicy bibliotek macierzy (BLAS, LAPACK, ATLAS itp.). Nie wiem zbyt wiele o tych bibliotekach poza tym, co przeczytałem: here, ale myślę, że powinien istnieć sposób, aby R powiedział mi, z których bibliotek macierzy został zainstalowany (tj. Które z nich używa), analogiczny do sessionInfo(), aby mi powiedzieć, której wersji pakietów R używa.Jak określić, których bibliotek macierzy używa moja instalacja R?

Odpowiedz

5

Choć może nie być wyraźny funkcja R za to, być może można wykorzystać poleceń powłoki (np , file i ldd), aby uzyskać pewne wskazówki, bez konieczności odbudowy R ani korzenia dostęp na klastrze:

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

aby upewnić się, że ldd będzie działać, zobaczyć, jaki typ pliku jest:

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

Jeśli twój pokazuje rzeczywisty plik wykonywalny (taki jak ELF 64-bit LSB executable, x86-64, ...), pomiń ten krok.

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\"" 

Ten mówi mi, że rzeczywisty wykonywalny jest /usr/lib/R/bin/exec/R (lub /usr/lib64/...). To wymaga pewnego wnioskowania, ale jest to krok. Działa to dla mnie z R-3.3.2 na Ubuntu, więc mogę tylko założyć, że będzie podobny w różnych systemach operacyjnych. Jeśli jest to mało informatywne, możesz również grep dla "/lib" lub "/exec" (lub po prostu sprawdzić cały plik skryptu dla innych wskazówek).

Gdy wiesz ścieżkę zwaną przez skrypt (lub, jeśli nie jest to scenariusz na początek), znaleźć bibliotek współdzielonych wymaga:

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) 

Linia 5. tego wyjścia sugeruje, że R jest przy użyciu biblioteki BLAS, w szczególności libblas3.

+0

Dziękujemy za dokładną i szczegółową odpowiedź. Nigdy bym tego nie wymyślił. Szkoda, że ​​R nie ma funkcji "o mnie", takiej jak "R --version", ale może można ją nazwać "R --buildoptions". – rcorty

4

O ile jestem świadomy, że nie jest specyficzna funkcja (szczególnie nie w podstawowej R), który daje wersję Blas. R najprawdopodobniej użyje standardowej biblioteki dołączonej do twojego systemu (chyba że ktoś zbudował ją ze źródła z konkretną wersją BLAS).

Trzeba to zrobić z terminalu typu

locate libblas.so 

To prawdopodobnie będzie w /usr/lib/libblas.so lub /usr/lib64/libblas.so, a lokalizacja jest prawdopodobnie dowiązaniem. Więc skorzystać z linków

ls -l /usr/lib/libblas.so 

Jeśli chcesz zmienić linki symboliczne aby wskazać inną biblioteką Blas, można zrobić update-alternatives --config libblas.so.3gf i wybrać wersję, której chcesz użyć. Ten post wyjaśnia to bardzo szczegółowo: https://www.r-bloggers.com/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/

Innym sposobem, aby zdecydowanie wiedzieć, jakiej wersji używasz, byłoby zainstalowanie dowolnej implementacji BLAS, którą chcesz - na przykład OpenBLAS, a następnie zastąpienie standardowej biblioteki R BLAS dowiązanie symboliczne do nowej biblioteki. Upewnij się, aby zainstalować R z --with-shared-blas opcji, jak wyjaśniono tutaj: https://cran.r-project.org/doc/manuals/r-release/R-admin.html#BLAS Potem wystarczy:

# 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 
+0

Ładne wyjaśnienie. Sądzę też, że @rcorty może użyć tego do odkrycia, czy Blas naprawdę jest przyczyną problemu. Poprzez zainstalowanie szeregu bibliotek Blas i aktualizację dowiązania symbolicznego, aby przetestować jeden na raz, aby zobaczyć, czy to powtarza błąd. – dww

+0

Dziękuję za odpowiedź. Szczególnie interesuje mnie sytuacja, w której ktoś inny, komu udostępniam maszynę, zbudował R ze źródła z określoną biblioteką matematyczną, np. ATLAS, BLAS, OpenBLAS itd. Przepraszam, jeśli nie byłem wystarczająco jasny na moje pytanie. Jestem ciekawy, czy potrafię rozgryźć, co zrobił. – rcorty

Powiązane problemy