Scikit-learn: ImportError: dlopen: no se pueden cargar más objetos con TLS estático con antorcha construida con gcc 5.5

Creado en 26 jul. 2019  ·  12Comentarios  ·  Fuente: scikit-learn/scikit-learn

No estoy seguro si esto es un error de PyTorch, un error de scikit-learn o un numba, pero esto solía funcionar en scikit-learn 0.20.3 y dejó de funcionar en la serie 0.21.0, así que por ahora me voy a aventurar una suposición de que es una regresión en scikit learn.

Cuando hago la siguiente serie de importaciones (minimizadas de la importación original, que era import librosa ), la carga del siguiente programa falla:

import torch
import soundfile
import scipy.signal
import numba
import sklearn

con

Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/site-packages/sklearn/__check_build/__init__.py", line 44, in <module>
    from ._check_build import check_build  # noqa
ImportError: dlopen: cannot load any more object with static TLS

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test_torch.py", line 5, in <module>
    import sklearn
  File "/opt/conda/lib/python3.6/site-packages/sklearn/__init__.py", line 75, in <module>
    from . import __check_build
  File "/opt/conda/lib/python3.6/site-packages/sklearn/__check_build/__init__.py", line 46, in <module>
    raise_build_error(e)
  File "/opt/conda/lib/python3.6/site-packages/sklearn/__check_build/__init__.py", line 41, in raise_build_error
    %s""" % (e, local_dir, ''.join(dir_content).strip(), msg))
ImportError: dlopen: cannot load any more object with static TLS
___________________________________________________________________________
Contents of /opt/conda/lib/python3.6/site-packages/sklearn/__check_build:
_check_build.cpython-36m-x86_64-linux-gnu.so__pycache__               __init__.py
setup.py
___________________________________________________________________________
It seems that scikit-learn has not been built correctly.

If you have installed scikit-learn from source, please do not forget
to build the package before using it: run `python setup.py install` or
`make` in the source directory.

If you have used an installer, please check that it is suited for your
Python version, your operating system and your platform.

La degradación a scikit-learn 0.20.3 hace que el problema desaparezca.

Versiones

jenkins<strong i="15">@260bf77532d0</strong>:~/workspace/test$ python
Python 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 01:22:34) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn; sklearn.show_versions()

System:
    python: 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 01:22:34)  [GCC 7.3.0]
executable: /opt/conda/bin/python
   machine: Linux-4.15.0-29-generic-x86_64-with-debian-jessie-sid

BLAS:
    macros: SCIPY_MKL_H=None, HAVE_CBLAS=None
  lib_dirs: /opt/conda/lib
cblas_libs: mkl_rt, pthread

Python deps:
       pip: 19.1.1
setuptools: 41.0.1
   sklearn: 0.21.2
     numpy: 1.16.4
     scipy: 1.1.0
    Cython: None
    pandas: None

Además, te puede interesar:

jenkins<strong i="19">@260bf77532d0</strong>:~/workspace/test$ pip list | grep numba
numba                  0.43.1         
jenkins<strong i="20">@260bf77532d0</strong>:~/workspace/test$ pip list | grep torch
torch                  1.2.0a0+ab800ad

La construcción de la antorcha debe realizarse con gcc 5.5.0 para causar este problema; Se sabe que otras versiones de gcc no causan este problema.

Para facilitar la reproducción, puede utilizar la siguiente imagen de la ventana acoplable ezyang/scikit-learn-tls-repro:1 https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro Una vez dentro, siga las instrucciones de reproducción descritas anteriormente. (EDITAR En el momento de escribir este artículo, la imagen de Docker todavía se está cargando. Debería hacerse pronto).

Comentario más útil

Lo resolví importando sklearn, luego importando tensorflow. La orden de importación da como resultado este error.

Todos 12 comentarios

Gracias por el informe. ¿Cómo construiste / instalaste sklearn?

pip install scikit-learn

¿Tiene el registro para eso? ¿Se construyó a partir de la fuente o instaló una rueda?

Collecting scikit-learn                                                                           
  Using cached https://files.pythonhosted.org/packages/85/04/49633f490f726da6e454fddc8e938bbb5bfed
2001681118d3814c219b723/scikit_learn-0.21.2-cp36-cp36m-manylinux1_x86_64.whl    

@ezyang, es posible que desee compartir el Dockerfile si es posible.

Si alguien está interesado en reproducir este error, el encantamiento de la ventana acoplable correcto para usar es algo como esto:

docker run -it ezyang/scikit-learn-tls-repro:1 bash

Tenga en cuenta que debe especificar la etiqueta, es decir, 1 explícitamente; de ​​lo contrario, obtendrá un mensaje de error críptico (la etiqueta 'más reciente' no existe):

Unable to find image 'ezyang/scikit-learn-tls-repro:latest' locally
docker: Error response from daemon: manifest for ezyang/scikit-learn-tls-repro:latest not found.

No tengo idea de por qué sucedería esto, pero me parecen numerosos informes de errores relacionados con esto, por ejemplo, con pytorch y OpenCV https://github.com/pytorch/pytorch/issues/2083 u OpenCV y Tensorflow https://github.com / tensorflow / models / issues / 523. Con todo, supongo que esto no es un error de scikit-learn.

El hecho de que dependa del orden de importación es sospechoso, por ejemplo, esto funciona en su imagen de la ventana acoplable:

python -c 'import torch; import sklearn; import soundfile; import scipy.signal; import numba'

Tenga en cuenta que traté de reproducir dentro de un entorno conda (dentro de su imagen de la ventana acoplable por si acaso) y no pude ( scikit-learn 0.21.2 y pytorch 1.1.0 ), así que supongo que esto podría estar vinculado a algunos cambios en pytorch dev versión.

conda create -n test -c pytorch pytorch scikit-learn scipy numba scikit-learn -y
conda activate test
pip install soundfile
python -c 'import torch; import soundfile; import scipy.signal; import numba; import sklearn'
$ conda list
# packages in environment at /opt/conda/envs/test:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main  
blas                      1.0                         mkl  
ca-certificates           2019.5.15                     0  
certifi                   2019.6.16                py37_1  
cffi                      1.12.3           py37h2e261b9_0  
cudatoolkit               10.0.130                      0  
intel-openmp              2019.4                      243  
joblib                    0.13.2                   py37_0  
libedit                   3.1.20181209         hc058e9b_0  
libffi                    3.2.1                hd88cf55_4  
libgcc-ng                 9.1.0                hdf63c60_0  
libgfortran-ng            7.3.0                hdf63c60_0  
libstdcxx-ng              9.1.0                hdf63c60_0  
llvmlite                  0.29.0           py37hd408876_0  
mkl                       2019.4                      243  
mkl-service               2.0.2            py37h7b6447c_0  
mkl_fft                   1.0.12           py37ha843d7b_0  
mkl_random                1.0.2            py37hd81dba3_0  
ncurses                   6.1                  he6710b0_1  
ninja                     1.9.0            py37hfd86e86_0  
numba                     0.45.0           py37h962f231_0  
numpy                     1.16.4           py37h7e9f1db_0  
numpy-base                1.16.4           py37hde5b4d6_0  
openssl                   1.1.1c               h7b6447c_1  
pip                       19.1.1                   py37_0  
pycparser                 2.19                     py37_0  
python                    3.7.3                h0371630_0  
pytorch                   1.1.0           py3.7_cuda10.0.130_cudnn7.5.1_0    pytorch
readline                  7.0                  h7b6447c_5  
scikit-learn              0.21.2           py37hd81dba3_0  
scipy                     1.3.0            py37h7c811a0_0  
setuptools                41.0.1                   py37_0  
six                       1.12.0                   py37_0  
soundfile                 0.10.2                   pypi_0    pypi
sqlite                    3.29.0               h7b6447c_0  
tk                        8.6.8                hbc83047_0  
wheel                     0.33.4                   py37_0  
xz                        5.2.4                h14c3975_4  
zlib                      1.2.11               h7b6447c_3  

Supongo que sería útil y útil obtener una bisección en scikit-learn, si el problema se reproduce en una compilación de desarrollo.

En términos generales, mi sensación es que la experiencia en este tipo de problemas está del lado de PyTorch. Personalmente, nunca antes había oído hablar de TLS estático y supongo que este es el caso de muchos otros desarrolladores principales de scikit-learn, aunque podría estar equivocado sobre la última declaración.

IIUC, originalmente vio el problema con scikit-learn 0.21.2 y una versión de desarrollo de pytorch. No puedo reproducir el problema en scikit-learn 0.21.2 y pytorch 1.1.0 como se indica en https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977. Si intentara entender esto con más detalles, me dividiría en PyTorch.

El problema vinculado a @ezyang tiene
Aquí hay algo de información que desenterré antes: https://github.com/pytorch/pytorch/issues/2575#issuecomment -369892859

; TLDR: Algo en la cadena de importaciones no fue compilado en C / C ++ con la bandera -gPIC . La importación de esa biblioteca provoca un problema que convierte todas las importaciones en "TLS estático". Hay una cantidad máxima de tales ranuras "TLS estáticas" (los nombres que uso aquí son seguramente incorrectos). El número exacto de ranuras depende del sistema operativo y de cómo se compiló.

En el número 2575 de pytorch vinculado, se menciona que es OpenMP el que se compiló sin la bandera que provocó la cascada.
Este problema de scikit-learn podría deberse a la introducción de una nueva biblioteca o algún cambio, consumiendo solo unas pocas ranuras TLS estáticas más.

Nota: No es un verdadero experto. Puede haber otras fuentes para este error además de "a una / alguna lib le falta el indicador '-gPIC' cuando se compiló". Aunque no he encontrado uno.

¿Ha habido alguna actualización sobre esto? También me encuentro con este problema, también al importar librosa.

Lo resolví importando sklearn, luego importando tensorflow. La orden de importación da como resultado este error.

¿Fue útil esta página
0 / 5 - 0 calificaciones