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
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
.
jest trochę googlowania dość ?: http://www.stat.cmu.edu/~nmv/2013/07/09/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/
Dziękuję za odpowiedź. Z mojego czytania tego artykułu, dostarcza informacji na temat budowania R z różnymi bibliotekami macierzy, ale nie pomaga mi dowiedzieć się, która biblioteka matryc została użyta w istniejącej kompilacji. – rcorty
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
Ł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
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
- 1. Jak określić nazwy bibliotek boost dla CMake
- 2. jak określić etykiety wierzchołków w R
- 3. Dude, gdzie jest moja instalacja Django?
- 4. Jak określić autora pakietu R?
- 5. Moja instalacja Xcode zajmuje mnóstwo miejsca.
- 6. R: konwersja macierzy rzadkiej
- 7. Odwrotność macierzy w R
- 8. Jak określić, dlaczego moja aplikacja na Androida wymaga pewnych uprawnień?
- 9. Mnożenie macierzy wielowymiarowych w R
- 10. Usuwanie nieużywanych bibliotek w R
- 11. Jak wykluczyć pola, w których Jackson nie używa adnotacji?
- 12. Jak określić słoiki, od których zależą zależności w pom.xml użytkownika?
- 13. duplikat wektor do macierzy R
- 14. Jak zmienić typ kolumny macierzy w R
- 15. Kiedy/jak moja aplikacja .NET używa swojego pliku App.Config?
- 16. Jak zmienić serializer, który moja podklasa multiprocessing.mangers.BaseManager używa do cPickle?
- 17. R: Lista indeksów do macierzy binarnej
- 18. Tworzenie macierzy projektowej w r
- 19. Łączenie macierzy w macierz w R
- 20. ponowna instalacja R linux ubuntu: unmet dependencies R
- 21. R dostępu do wektora kolumny macierzy nazwy
- 22. Determinant złożonej macierzy w R
- 23. dotyczące porównania macierzy w R
- 24. Tworzenie macierzy symetrycznej w R
- 25. Jak mogę określić zależności bibliotek przy użyciu SystemJS?
- 26. Jak określić zależności bibliotek dla wtyczki IntelliJ IDEA?
- 27. Jak określić, kiedy moja aplikacja ma zostać zakończona w tle?
- 28. R ggplot2 - Jak określić kolor poza granicami
- 29. Zastosowanie funkcji do macierzy odległości w R
- 30. Wykonaj nieujemną faktoryzacji macierzy w R
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