Scikit-learn: ImportError:dlopen:gcc5.5で構築されたトーチを使用した静的TLSでこれ以上オブジェクトをロードできません

作成日 2019年07月26日  ·  12コメント  ·  ソース: scikit-learn/scikit-learn

これがPyTorchのバグなのか、scikit-learnのバグなのか、numbaなのかはわかりませんが、これはscikit-learn 0.20.3で機能し、0.21.0シリーズでは機能しなくなったため、今は冒険します。それはscikitlearnの回帰であると推測します。

次の一連のインポート(元のインポートであるimport librosaから最小化)を実行すると、次のプログラムのロードに失敗します。

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

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.

scikit-learn 0.20.3にダウングレードすると、問題は解決します。

バージョン

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

また、あなたは興味があるかもしれません:

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

この問題を引き起こすには、トーチのビルドをgcc5.5.0で実行する必要があります。 他のバージョンのgccは、この問題を引き起こさないことが知られています。

再現を容易にするために、次のDockerイメージを使用できますezyang/scikit-learn-tls-repro:1 https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro一度、上記の複製手順に従ってください。 (編集執筆時点では、Dockerイメージはまだアップロード中です。すぐに実行する必要があります。)

最も参考になるコメント

import sklearn、次にimport tensorflowで解決しました。インポート順序により、このエラーが発生します。

全てのコメント12件

レポートをありがとう。 sklearnをどのように構築/インストールしましたか?

pip install scikit-learn

そのためのログはありますか? ソースからビルドしましたか、それともホイールをインストールしましたか?

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可能であればDockerfileを共有することをお勧めします。

誰かがこのエラーを再現することに興味がある場合、使用する適切なDockerの呪文は次のようなものです。

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

タグ、つまり1明示的に指定する必要があることに注意してください。そうしないと、不可解なエラーメッセージが表示されます(「最新の」タグは存在しません)。

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.

なぜこれが発生するのかわかりませんが、これに関連するバグレポートが多数あるようです。たとえば、pytorchとOpenCVhttps ://github.com/pytorch/pytorch/issues/2083またはOpenCVとTensorflowhttps ://github.com / tensorflow / models / issues / 523。 全体として、これはscikit-learnのバグではないと思います。

インポートの順序に依存するという事実は怪しいです。たとえば、これはDockerイメージで機能します。

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

conda環境内(適切な測定のためにdockerイメージ内)で再現しようとしましたが、再現できなかった( scikit-learn 0.21.2およびpytorch 1.1.0 )ので、これはpytorchdevのいくつかの変更にリンクされている可能性があります。バージョン。

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  

問題が開発ビルドで再現される場合は、scikit-learnでバイセクトを取得すると便利で役立つと思います。

一般的に言って、この種の問題に関する専門知識はPyTorch側にあると私は感じています。 個人的には、静的TLSについてはこれまで聞いたことがありません。最後のステートメントについては間違っている可能性がありますが、これは他の多くのコアscikit-learn開発者の場合だと思います。

IIUCは、scikit-learn0.21.2とpytorchdevバージョンで最初に問題が発生しました。 https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977に記載されているように、scikit-learn0.21.2およびpytorch1.1.0で問題を再現できません。 これをより詳細に理解しようとすると、PyTorchで二分します。

@ezyangがリンクしている問題には、このTLS(スレッドローカルストア)の問題に関する多くの情報があります。
以前に掘り下げた情報は次のとおりです: https

; TLDR:インポートのチェーン内の何かが-gPICフラグでコンパイルされたC / C ++ではありません

リンクされたpytorchの問題2575には、カスケードを引き起こすフラグなしでコンパイルされたOpenMPであるという記述があります。
このscikit-learnの問題は、いくつかの新しいライブラリが導入されたか、いくつかの変更が原因で、静的TLSスロットが少し増えたことが原因である可能性があります。

注:本当の専門家ではありません。 このエラーの原因は、「コンパイル時に1つまたは一部のlibに `-gPIC 'フラグがない」以外にある可能性があります。 まだ見つかりませんでした。

これに関する更新はありましたか? librosaをインポートするときにも、この問題が発生します。

import sklearn、次にimport tensorflowで解決しました。インポート順序により、このエラーが発生します。

このページは役に立ちましたか?
0 / 5 - 0 評価