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.
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
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.
vérifier https://github.com/pytorch/pytorch/issues/2575#issuecomment -523657178
Je l'ai résolu en import sklearn, puis en import tensorflow. L'ordre d'importation entraîne cette erreur.
Commentaire le plus utile
Je l'ai résolu en import sklearn, puis en import tensorflow. L'ordre d'importation entraîne cette erreur.