Scikit-learn: ImportError: dlopen: não é possível carregar mais nenhum objeto com TLS estático com tocha construída com gcc 5.5

Criado em 26 jul. 2019  ·  12Comentários  ·  Fonte: scikit-learn/scikit-learn

Não tenho certeza se este é um bug do PyTorch, um bug do scikit-learn ou um numba, mas isso costumava funcionar no scikit-learn 0.20.3 e parou de funcionar na série 0.21.0, então por agora vou me aventurar um palpite de que é uma regressão no scikit learn.

Quando faço a seguinte série de importações (minimizada da importação original, que era import librosa ), o carregamento do seguinte programa falha:

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

com

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.

Fazer o downgrade para o scikit-learn 0.20.3 resolve o problema.

Versões

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

Além disso, você pode estar interessado em:

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

A construção da tocha deve ser feita com gcc 5.5.0 para causar este problema; outras versões do gcc são conhecidas por não causar esse problema.

Para facilitar a reprodução, você pode usar a seguinte imagem docker ezyang/scikit-learn-tls-repro:1 https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro Uma vez dentro, siga as instruções de reprodução conforme descrito acima. (EDITAR No momento da escrita, a imagem Docker ainda está sendo carregada. Deve ser feito em breve.)

Comentários muito úteis

Resolvi o problema importando sklearn e, em seguida, importando tensorflow. A ordem de importação resultou neste erro.

Todos 12 comentários

Obrigado pelo relatório. Como você construiu / instalou o sklearn?

pip install scikit-learn

Você tem o log para isso? Foi construído a partir da fonte ou você instalou uma roda?

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, você pode querer compartilhar Dockerfile se isso for possível.

Se alguém estiver interessado em reproduzir este erro, o feitiço docker certo a ser usado é algo como este:

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

Observe que você precisa especificar a tag, ou seja, 1 explicitamente, caso contrário, você receberá uma mensagem de erro criptografada (a tag 'mais recente' não 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.

Não tenho ideia de por que isso aconteceria, mas tenho visto vários relatórios de bug relacionados a isso, por exemplo, com pytorch e OpenCV https://github.com/pytorch/pytorch/issues/2083 ou OpenCV e Tensorflow https://github.com / tensorflow / models / issues / 523. Resumindo, acho que esse não é um bug do scikit-learn.

O fato de depender da ordem de importação é duvidoso, por exemplo, isso funciona na imagem do docker:

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

Nota Eu tentei reproduzir dentro de um ambiente conda (dentro de sua imagem docker para uma boa medida) e não consegui ( scikit-learn 0.21.2 e pytorch 1.1.0 ), então eu acho que isso pode estar ligado a algumas mudanças no pytorch dev versão.

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  

Eu acho que seria útil e útil obter uma bisect no scikit-learn, se o problema se reproduz em uma construção de dev.

De modo geral, minha impressão é que a expertise nesse tipo de problema está do lado de PyTorch. Pessoalmente, nunca ouvi falar de TLS estático antes e acho que esse é o caso de muitos outros desenvolvedores principais do scikit-learn, embora eu possa estar errado sobre a última afirmação.

IIUC originalmente você viu o problema com o scikit-learn 0.21.2 e uma versão dev pytorch. Não consigo reproduzir o problema no scikit-learn 0.21.2 e no pytorch 1.1.0 conforme observado em https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977. Se eu fosse tentar entender isso em mais detalhes, dividiria em duas partes em PyTorch.

O problema do link @ezyang contém
Aqui estão algumas informações que eu desenterrei antes: https://github.com/pytorch/pytorch/issues/2575#issuecomment -369892859

; TLDR: algo na cadeia de importações não foi compilado em C / C ++ com a bandeira -gPIC . A importação dessa biblioteca causa um problema que transforma todas as importações em "TLS estático". Há uma quantidade máxima de tais slots "TLS estático" (os nomes que uso aqui são certamente incorretos). O N exato de slots depende do sistema operacional e de como ele foi compilado.

No número 2575 do pytorch vinculado, há uma menção de que é o OpenMP que foi compilado sem o flag causando a cascata.
Esse problema de scikit-learn pode ser devido a alguma nova biblioteca sendo introduzida ou alguma mudança, consumindo apenas mais alguns slots TLS estáticos.

Nota: Não é um verdadeiro especialista. Pode haver outras fontes para este erro além de "uma / alguma lib faltando o sinalizador` -gPIC 'quando foi compilado ". Ainda não encontrei um.

Houve alguma atualização sobre isso? Também estou encontrando esse problema, ao importar librosa.

Resolvi o problema importando sklearn e, em seguida, importando tensorflow. A ordem de importação resultou neste erro.

Esta página foi útil?
0 / 5 - 0 avaliações