Scikit-learn: ImportError: dlopen: ne peut plus charger d'objet avec TLS statique avec la torche construite avec gcc 5.5

Créé le 26 juil. 2019  ·  12Commentaires  ·  Source: scikit-learn/scikit-learn

Je ne sais pas s'il s'agit d'un bug PyTorch, d'un bug scikit-learn ou d'un numba, mais cela fonctionnait dans scikit-learn 0.20.3 et a cessé de fonctionner dans la série 0.21.0, donc pour l'instant je vais m'aventurer une supposition qu'il s'agit d'une régression dans scikit learn.

Lorsque je fais la série d'importations suivante (minimisée par rapport à l'importation d'origine, qui était de import librosa ), le chargement du programme suivant échoue :

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

avec

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 rétrogradation vers scikit-learn 0.20.3 fait disparaître le problème.

Versions

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

Aussi, vous pourriez être intéressé par :

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 construction de la torche doit être effectuée avec gcc 5.5.0 pour provoquer ce problème ; d'autres versions de gcc sont connues pour ne pas causer ce problème.

Pour faciliter la reproduction, vous pouvez utiliser l'image docker suivante ezyang/scikit-learn-tls-repro:1 https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro Une fois

Commentaire le plus utile

Je l'ai résolu en import sklearn, puis en import tensorflow. L'ordre d'importation entraîne cette erreur.

Tous les 12 commentaires

Merci pour le rapport. Comment avez-vous construit/installé sklearn ?

pip install scikit-learn

Avez-vous le journal pour cela? A-t-il été construit à partir de la source ou avez-vous installé une roue ?

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, vous voudrez peut-être partager le Dockerfile si c'est possible.

Si quelqu'un souhaite reproduire cette erreur, la bonne incantation docker à utiliser est quelque chose comme ceci :

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

Notez que vous devez spécifier la balise, c'est- 1 dire

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.

Je n'ai aucune idée de pourquoi cela se produirait, mais il me semble que de nombreux rapports de bogues liés à cela, par exemple avec pytorch et OpenCV https://github.com/pytorch/pytorch/issues/2083 ou OpenCV et Tensorflow https://github.com /tensorflow/models/issues/523. Dans l'ensemble, je suppose que ce n'est pas un bug scikit-learn.

Le fait que cela dépende de l'ordre d'importation est louche, par exemple cela fonctionne dans votre image docker :

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

Remarque J'ai essayé de reproduire dans un environnement conda (à l'intérieur de votre image docker pour faire bonne mesure) et je n'ai pas pu ( scikit-learn 0.21.2 et pytorch 1.1.0 ), donc je suppose que cela pourrait être lié à certains changements dans pytorch dev version.

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  

Je suppose qu'il serait utile et utile d'obtenir un bisect sur scikit-learn, si le problème se reproduit sur une version de développement.

D'une manière générale, mon sentiment est que l'expertise sur ce genre de problèmes est du côté de PyTorch. Personnellement, je n'ai jamais entendu parler de TLS statique auparavant et je suppose que c'est le cas de nombreux autres développeurs principaux de scikit-learn, bien que je puisse me tromper sur la dernière déclaration.

IIUC, vous avez initialement vu le problème avec scikit-learn 0.21.2 et une version de développement de pytorch. Je ne peux pas reproduire le problème sur scikit-learn 0.21.2 et pytorch 1.1.0 comme indiqué dans https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977. Si je devais essayer de comprendre cela plus en détail, je couperais en deux sur PyTorch.

Le problème lié à @ezyang contient de nombreuses informations sur ce problème TLS (thread local store).
Voici quelques informations que j'ai déterrées auparavant : https://github.com/pytorch/pytorch/issues/2575#issuecomment -369892859

;TLDR : quelque chose dans la chaîne d'importation n'a pas été compilé en C/C++ avec l'indicateur -gPIC . L'importation de cette bibliothèque provoque un problème qui transforme toutes les importations en « TLS statique ». Il existe un nombre maximal de tels emplacements " TLS statiques " (les noms que j'utilise ici sont sûrement incorrects). Le nombre exact d'emplacements dépend du système d'exploitation et de la manière dont il a été compilé.

Dans le numéro 2575 de pytorch lié, il est mentionné que c'est OpenMP qui a été compilé sans le drapeau provoquant la cascade.
Ce problème scikit-learn peut être dû à l'introduction d'une nouvelle bibliothèque ou à un changement, ne consommant que quelques emplacements TLS statiques supplémentaires.

Remarque : pas un vrai expert. Il pourrait y avoir d'autres sources pour cette erreur que "une/une bibliothèque manquant le drapeau `-gPIC' lors de sa compilation". Je n'en ai pas trouvé par contre.

Y a-t-il eu des mises à jour à ce sujet ? Je rencontre également ce problème, également lors de l'importation de librosa.

Je l'ai résolu en import sklearn, puis en import tensorflow. L'ordre d'importation entraîne cette erreur.

Cette page vous a été utile?
0 / 5 - 0 notes