Scikit-learn: ImportError: dlopen: gcc 5.5๋กœ ๋นŒ๋“œ๋œ ํ† ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  TLS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ด์ƒ ๊ฐœ์ฒด๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 07์›” 26์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: scikit-learn/scikit-learn

์ด๊ฒƒ์ด PyTorch ๋ฒ„๊ทธ์ธ์ง€, scikit-learn ๋ฒ„๊ทธ์ธ์ง€ ๋˜๋Š” ์ˆซ์ž์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, ์ด๊ฒƒ์€ scikit-learn 0.20.3์—์„œ ์ž‘๋™ํ•˜๊ณ  0.21.0 ์‹œ๋ฆฌ์ฆˆ์—์„œ ์ž‘๋™์„ ๋ฉˆ์ท„์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ ๋ชจํ—˜์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. scikit learn์˜ ํšŒ๊ท€๋ผ๊ณ  ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ผ๋ จ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ( 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

์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋ ค๋ฉด ํ† ์น˜ ๋นŒ๋“œ๋ฅผ gcc 5.5.0์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฒ„์ „์˜ gcc๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ์˜ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ ๋„์ปค ์ด๋ฏธ์ง€ ezyang/scikit-learn-tls-repro:1 https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์žฌ์ƒ์‚ฐ ์ง€์นจ์„ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค. (ํŽธ์ง‘ ์ž‘์„ฑ ๋‹น์‹œ Docker ์ด๋ฏธ์ง€๋Š” ์•„์ง ์—…๋กœ๋“œ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ณง ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

import sklearn์œผ๋กœ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ 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 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์œผ๋กœ์ด ์˜ˆ์— ๊ด€๋ จ๋œ ๋‹ค์ˆ˜์˜ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๋ฅผ ๋ณด์ผํ•˜๊ณ  OpenCV์˜ https://github.com/pytorch/pytorch/issues/2083 ๋˜๋Š” OpenCV์˜ ๋ฐ Tensorflow https://github.com /tensorflow/models/issues/523. ๋Œ€์ฒด๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์ด scikit-learn ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ ์ˆœ์„œ์— ์˜์กดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋น„์ •์ƒ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์€ ๋„์ปค ์ด๋ฏธ์ง€์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

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

์ฐธ๊ณ  ๋‚˜๋Š” conda ํ™˜๊ฒฝ(์ข‹์€ ์ธก์ •์„ ์œ„ํ•ด ๋„์ปค ์ด๋ฏธ์ง€ ๋‚ด๋ถ€) ๋‚ด์—์„œ ์žฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค( scikit-learn 0.21.2 ๋ฐ pytorch 1.1.0 ). ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์ด pytorch dev์˜ ์ผ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „.

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  

dev ๋นŒ๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žฌํ˜„๋˜๋Š” ๊ฒฝ์šฐ scikit-learn์—์„œ ์ด๋“ฑ๋ถ„์„ ์–ป๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๊ณ  ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ „๋ฌธ ์ง€์‹์€ PyTorch ์ธก์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์ „์— ์ •์  TLS์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์—†์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ๋งŽ์€ ํ•ต์‹ฌ scikit-learn ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝ์šฐ๋ผ๊ณ  ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งˆ์ง€๋ง‰ ์ง„์ˆ ์— ๋Œ€ํ•ด์„œ๋Š” ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IIUC์—์„œ๋Š” ์›๋ž˜ scikit-learn 0.21.2 ๋ฐ pytorch dev ๋ฒ„์ „์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977์— ๋ช…์‹œ๋œ ๋Œ€๋กœ scikit-learn 0.21.2 ๋ฐ pytorch 1.1.0์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋” ์ž์„ธํžˆ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•˜๋ฉด PyTorch๋ฅผ ์ด๋“ฑ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ezyang ๋งํฌ๋œ ๋ฌธ์ œ์—๋Š” ์ด TLS(์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์ €์žฅ์†Œ) ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ด์ „์— ํŒŒํ—ค์นœ ์ •๋ณด์ž…๋‹ˆ๋‹ค. https://github.com/pytorch/pytorch/issues/2575#issuecomment -369892859

;TLDR: ๊ฐ€์ ธ์˜ค๊ธฐ ์ฒด์ธ์˜ ๋ฌด์–ธ๊ฐ€๊ฐ€ -gPIC ํ”Œ๋ž˜๊ทธ๋กœ C/C++ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ "์ •์  TLS"๋กœ ๋ฐ”๋€Œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ "์ •์  TLS" ์Šฌ๋กฏ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์€ ํ™•์‹คํžˆ ํ‹€๋ฆฝ๋‹ˆ๋‹ค). ์ •ํ™•ํ•œ ์Šฌ๋กฏ N์€ OS์™€ ์ปดํŒŒ์ผ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ๋œ pytorch ๋ฌธ์ œ 2575์—๋Š” ์บ์Šค์ผ€์ด๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ํ”Œ๋ž˜๊ทธ ์—†์ด ์ปดํŒŒ์ผ๋œ ๊ฒƒ์ด OpenMP๋ผ๋Š” ์–ธ๊ธ‰์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด scikit-learn ๋ฌธ์ œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„์ž…๋˜๊ฑฐ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์ •์  TLS ์Šฌ๋กฏ์„ ๋” ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์‹ค์ œ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์†Œ์Šค๊ฐ€ "์ปดํŒŒ์ผ ์‹œ `-gPIC' ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ˆ„๋ฝ๋œ ํ•˜๋‚˜/์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋‚˜๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? librosa๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋„ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

import sklearn์œผ๋กœ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ tensorflow๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ ์ˆœ์„œ๋กœ ์ธํ•ด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰