Scikit-learn: ImportError: dlopen: tidak dapat memuat objek lagi dengan TLS statis dengan obor yang dibuat dengan gcc 5.5

Dibuat pada 26 Jul 2019  ·  12Komentar  ·  Sumber: scikit-learn/scikit-learn

Saya tidak yakin apakah ini bug PyTorch, bug scikit-learn atau numba, tetapi ini dulu berfungsi di scikit-learn 0.20.3 dan berhenti bekerja di seri 0.21.0, jadi untuk saat ini saya akan menjelajah tebakan itu adalah regresi dalam scikit belajar.

Ketika saya melakukan serangkaian impor berikut (diminimalkan dari impor asli, yaitu import librosa ), memuat program berikut gagal:

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

dengan

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.

Menurunkan versi ke scikit-learn 0.20.3 membuat masalah hilang.

Versi

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

Juga, Anda mungkin tertarik pada:

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

Pembuatan obor harus dilakukan dengan gcc 5.5.0 untuk menyebabkan masalah ini; versi lain dari gcc diketahui tidak menyebabkan masalah ini.

Untuk kemudahan reproduksi, Anda dapat menggunakan gambar buruh pelabuhan berikut ezyang/scikit-learn-tls-repro:1 https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro Setelah masuk, ikuti petunjuk reproduksi seperti dijelaskan di atas. (EDIT Pada saat penulisan, gambar Docker masih diunggah. Harus segera dilakukan.)

Komentar yang paling membantu

Saya menyelesaikannya dengan mengimpor sklearn, lalu mengimpor tensorflow. Urutan impor menghasilkan kesalahan ini.

Semua 12 komentar

Terima kasih atas laporannya. Bagaimana Anda membangun/menginstal sklearn?

pip install scikit-learn

Apakah Anda memiliki log untuk itu? Apakah itu membangun dari sumber atau apakah Anda memasang 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 Anda mungkin ingin berbagi Dockerfile jika memungkinkan.

Jika ada yang tertarik untuk mereproduksi kesalahan ini, mantra buruh pelabuhan yang tepat untuk digunakan adalah seperti ini:

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

Perhatikan bahwa Anda perlu menentukan tag yaitu 1 secara eksplisit jika tidak, Anda akan mendapatkan pesan kesalahan samar (tag 'terbaru' tidak ada):

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.

Saya tidak tahu mengapa ini akan terjadi, tetapi sepertinya saya memiliki banyak laporan bug yang terkait dengan ini misalnya dengan pytorch dan OpenCV https://github.com/pytorch/pytorch/issues/2083 atau OpenCV dan Tensorflow https://github.com /tensorflow/models/issues/523. Secara keseluruhan saya kira ini bukan bug scikit-learn.

Fakta bahwa itu tergantung pada urutan impor mencurigakan, misalnya ini berfungsi di gambar buruh pelabuhan Anda:

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

Catatan saya mencoba mereproduksi di dalam lingkungan conda (di dalam gambar buruh pelabuhan Anda untuk ukuran yang baik) dan tidak bisa ( scikit-learn 0.21.2 dan pytorch 1.1.0 ), jadi saya kira ini dapat ditautkan ke beberapa perubahan dalam pytorch dev Versi: kapan.

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  

Saya kira akan berguna dan membantu untuk mendapatkan dua bagian pada scikit-learn, jika masalah mereproduksi pada dev build.

Secara umum, perasaan saya adalah bahwa keahlian dalam masalah semacam ini ada di pihak PyTorch. Secara pribadi, saya belum pernah mendengar tentang TLS statis sebelumnya dan saya kira ini adalah kasus dari banyak pengembang scikit-learn inti lainnya meskipun saya bisa saja salah tentang pernyataan terakhir.

IIUC Anda awalnya melihat masalah dengan scikit-learn 0.21.2 dan versi pytorch dev. Saya tidak dapat mereproduksi masalah pada scikit-learn 0.21.2 dan pytorch 1.1.0 seperti yang tercantum dalam https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977 . Jika saya mencoba memahami ini secara lebih rinci, saya akan membagi dua pada PyTorch.

Masalah yang ditautkan @ezyang memiliki banyak informasi tentang masalah TLS (utas toko lokal) ini.
Berikut beberapa info yang saya gali sebelumnya: https://github.com/pytorch/pytorch/issues/2575#issuecomment -369892859

;TLDR: Sesuatu dalam rantai impor bukan C/C++ yang dikompilasi dengan flag -gPIC . Mengimpor perpustakaan itu menyebabkan masalah yang mengubah semua impor menjadi "TLS statis". Ada jumlah maksimum slot "TLS statis" seperti itu (nama yang saya gunakan di sini pasti salah). N slot yang tepat tergantung pada OS, dan bagaimana itu dikompilasi.

Dalam masalah pytorch tertaut 2575, disebutkan bahwa itu adalah OpenMP yang dikompilasi tanpa tanda yang menyebabkan kaskade.
Masalah scikit-learn ini mungkin disebabkan oleh beberapa perpustakaan baru yang diperkenalkan atau beberapa perubahan, hanya memakan beberapa slot TLS statis.

Catatan: Bukan ahli sejati. Mungkin ada sumber lain untuk kesalahan ini selain "satu/beberapa lib hilang tanda `-gPIC' ketika dikompilasi". Belum menemukan satu sekalipun.

Apakah ada pembaruan tentang ini? Saya juga mengalami masalah ini, juga saat mengimpor librosa.

Saya menyelesaikannya dengan mengimpor sklearn, lalu mengimpor tensorflow. Urutan impor menghasilkan kesalahan ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat