Durante los últimos 5 días, estoy tratando de hacer que los paquetes de Keras/Tensorflow funcionen en R. Estoy usando RStudio para la instalación y he usado conda , miniconda , virtualenv pero al final falla cada vez. Instalar una biblioteca no debería ser una pesadilla, especialmente cuando hablamos de R ( uno de los mejores lenguajes estadísticos ) y TensorFlow ( una de las mejores bibliotecas de aprendizaje profundo ). ¿Alguien puede compartir una forma confiable de instalar Keras/Tensorflow en CentOS 7?
Los siguientes son los pasos que estoy usando para instalar tensorflow en RStudio.
Dado que RStudio simplemente se bloquea cada vez que ejecuto tensorflow::tf_config() , no tengo forma de verificar qué está fallando.
devtools::install_github("rstudio/reticulate") devtools::install_github("rstudio/keras") # This package also installs tensorflow library(reticulate) reticulate::install_miniconda() reticulate::use_miniconda("r-reticulate") library(tensorflow) tensorflow::tf_config() **# Crashes at this point** sessionInfo() R version 3.6.0 (2019-04-26) Platform: x86_64-redhat-linux-gnu (64-bit) Running under: CentOS Linux 7 (Core) Matrix products: default BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] tensorflow_2.7.0.9000 keras_2.7.0.9000 reticulate_1.22-9000 loaded via a namespace (and not attached): [1] Rcpp_1.0.7 lattice_0.20-45 png_0.1-7 zeallot_0.1.0 [5] rappdirs_0.3.3 grid_3.6.0 R6_2.5.1 jsonlite_1.7.2 [9] magrittr_2.0.1 tfruns_1.5.0 rlang_0.4.12 whisker_0.4 [13] Matrix_1.3-4 generics_0.1.1 tools_3.6.0 compiler_3.6.0 [17] base64enc_0.1-3Actualización 1 La única forma en que RStudio no falla al instalar tensorflow es ejecutando los siguientes pasos:
Primero, creé un nuevo entorno virtual usando conda
conda create --name py38 python=3.8.0 conda activate py38 conda install tensorflow=2.4Luego, desde RStudio, instalé reticulate y activé el entorno virtual que creé anteriormente usando conda
devtools::install_github("rstudio/reticulate") library(reticulate) reticulate::use_condaenv("/root/.conda/envs/py38", required = TRUE) reticulate::use_python("/root/.conda/envs/py38/bin/python3.8", required = TRUE) reticulate::py_available(initialize = TRUE) ts <- reticulate::import("tensorflow") Tan pronto como intento importar tensorflow en RStudio, carga la biblioteca /lib64/libstdc++.so.6 en lugar de /root/.conda/envs/py38/lib/libstdc++.so.6 y aparece el siguiente error:
Error in py_module_import(module, convert = convert) : ImportError: Traceback (most recent call last): File "/root/.conda/envs/py38/lib/python3.8/site-packages/tensorflow/python/pywrap_tensorflow.py", line 64, in <module> from tensorflow.python._pywrap_tensorflow_internal import * File "/home/R/x86_64-redhat-linux-gnu-library/3.6/reticulate/python/rpytools/loader.py", line 39, in _import_hook module = _import( ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /root/.conda/envs/py38/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so) Failed to load the native TensorFlow runtime. See https://www.tensorflow.org/install/errors for some common reasons and solutions. Include the entire stack trace above this error message when asking for help. Esto es lo que hay dentro /lib64/libstdc++.so.6
> strings /lib64/libstdc++.so.6 | grep GLIBC GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBCXX_3.4.15 GLIBCXX_3.4.16 GLIBCXX_3.4.17 GLIBCXX_3.4.18 GLIBCXX_3.4.19 GLIBC_2.3 GLIBC_2.2.5 GLIBC_2.14 GLIBC_2.4 GLIBC_2.3.2 GLIBCXX_DEBUG_MESSAGE_LENGTH Para resolver el problema de la biblioteca, agregué la ruta de la libstdc++.so.6 que tiene GLIBCXX_3.4.20 en RStudio.
system('export LD_LIBRARY_PATH=/root/.conda/envs/py38/lib/:$LD_LIBRARY_PATH')y también
Sys.setenv("LD_LIBRARY_PATH" = "/root/.conda/envs/py38/lib") Pero aún recibo el mismo error ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' . De alguna manera, RStudio todavía carga /lib64/libstdc++.so.6 primero en lugar de /root/.conda/envs/py38/lib/libstdc++.so.6
En lugar de RStudio , si ejecuto los pasos anteriores en la consola R , también obtengo exactamente el mismo error.
Actualización 2: Aquí se publica una solución
Quizás mis intentos fallidos ayuden a alguien más a resolver este problema; mi acercamiento:
sudo yum install epel-release sudo yum install R sudo yum install libxml2-devel sudo yum install openssl-devel sudo yum install libcurl-devel sudo yum install libXcomposite libXcursor libXi libXtst libXrandr alsa-lib mesa-libEGL libXdamage mesa-libGL libXScrnSaver conda init conda create --name tf conda activate tf conda install -c conda-forge tensorflow**Desde dentro de este conda env puede importar tensorflow en python sin error; ahora para acceder a tf a través de R
sudo yum install centos-release-scl sudo yum install devtoolset-7-gcc* scl enable devtoolset-7 R install.packages("remotes") remotes::install_github('rstudio/reticulate') reticulate::use_condaenv("tf", conda = "~/anaconda3/bin/conda") reticulate::repl_python() # This works as expected but the command "import tensorflow" crashes R # Error: *** caught segfault *** address 0xf8, cause 'memory not mapped' # Also tried: install.packages("devtools") devtools::install_github('rstudio/tensorflow') devtools::install_github('rstudio/keras') library(tensorflow) install_tensorflow() # "successful" tensorflow::tf_config() # Error: *** caught segfault *** address 0xf8, cause 'memory not mapped' devtools::install_github('rstudio/tensorflow@v2.4.0') devtools::install_github('rstudio/keras@v2.4.0') library(tensorflow) tf_config() # Error: *** caught segfault *** address 0xf8, cause 'memory not mapped' # deactivate conda sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm export R_VERSION=4.0.0 curl -O https://cdn.rstudio.com/r/centos-7/pkgs/R-${R_VERSION}-1-1.x86_64.rpm sudo yum install R-${R_VERSION}-1-1.x86_64.rpm scl enable devtoolset-7 /opt/R/4.0.0/bin/R install.packages("devtools") devtools::install_github('rstudio/reticulate') reticulate::use_condaenv("tf", conda = "~/anaconda3/bin/conda") reticulate::repl_python() # 'import tensorflow' resulted in "core dumped"Supongo que el problema es con R/CentOS, ya que puede importar y usar tensorflow a través de Python normalmente, pero no estoy seguro de qué más probar.
También me gustaría decir que no tuve problemas con Ubuntu (que es específicamente compatible con tensorflow, junto con macOS y Windows), y encontré estos documentos que podrían ser de ayuda: https://wiki.hpcc.msu. edu/display/ITH/Instalación+TensorFlow+usando+anaconda / https://wiki.hpcc.msu.edu/pages/viewpage.action?pageId=22709999
Me tomó más de 15 días y finalmente resolví este problema.
Inicie una máquina virtual CentOS 7 limpia, instale R y dependencias (tomado de la respuesta de Jared):
yum install epel-release yum install R yum install libxml2-devel yum install openssl-devel yum install libcurl-devel yum install libXcomposite libXcursor libXi libXtst libXrandr alsa-lib mesa-libEGL libXdamage mesa-libGL libXScrnSaverAhora, crea un entorno conda.
yum install conda conda clean -a # Clean cache and remove old packages, if you already have conda installed # Install all the packages together and let conda handle versioning. It is important to give a Python version while setting up the environment. Since Tensorflow supports python 3.9.0, I have used this version conda create -y -n "tf" python=3.9.0 ipython tensorflow keras r-essentials r-reticulate r-tensorflow conda activate tf Abra un nuevo puerto ( 7878 o elija cualquier número de puerto que desee) en el servidor para acceder a RStudio con nuevas bibliotecas de entorno conda
iptables -A INPUT -p tcp --dport 7878 -j ACCEPT /sbin/service iptables saveluego inicie RStudio de la siguiente manera:
/usr/lib/rstudio-server/bin/rserver \ --server-daemonize=0 \ --www-port 7878 \ --rsession-which-r=$(which R) \ --rsession-ld-library-path=$CONDA_PREFIX/lib Tendrá su entorno anterior intacto en el puerto predeterminado 8787 y un nuevo entorno con Tensorflow y Keras en el 7878 .
El siguiente código ahora funciona bien en RStudio
install.packages("reticulate") install.packages("tensorflow") library(reticulate) library(tensorflow) ts <- reticulate::import("tensorflow")