لست متأكدًا مما إذا كان هذا خطأ PyTorch أم خطأ scikit-Learn أو numba ، ولكن هذا كان يعمل في scikit-Learn 0.20.3 وتوقف عن العمل في سلسلة 0.21.0 ، لذلك سأقوم الآن بالمغامرة تخمين أنه تراجع في تعلم scikit.
عندما أفعل سلسلة عمليات الاستيراد التالية (المصغرة من الاستيراد الأصلي ، والذي كان 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 لإحداث هذه المشكلة ؛ من المعروف أن الإصدارات الأخرى من دول مجلس التعاون الخليجي لا تسبب هذه المشكلة.
لسهولة الاستنساخ ، يمكنك استخدام صورة عامل الإرساء التالية ezyang/scikit-learn-tls-repro:1
https://cloud.docker.com/repository/registry-1.docker.io/ezyang/scikit-learn-tls-repro بمجرد الدخول ، اتبع تعليمات الاستنساخ كما هو موضح أعلاه. (تحرير في وقت كتابة هذا التقرير ، لا تزال صورة Docker قيد التحميل. يجب أن يتم ذلك قريبًا.)
شكرا على التقرير. كيف قمت ببناء / تثبيت 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'
ملاحظة لقد حاولت إعادة الإنتاج داخل بيئة كوندا (داخل صورة عامل الإرساء الخاص بك لقياس جيد) ولم أستطع ( 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
أعتقد أنه سيكون من المفيد والمفيد الحصول على جزء من برنامج scikit-Learn ، إذا كانت المشكلة تتكرر في تصميم مطور.
بشكل عام ، أشعر أن الخبرة في هذا النوع من المشاكل موجودة في جانب PyTorch. شخصيًا ، لم أسمع أبدًا عن TLS الثابت من قبل وأعتقد أن هذا هو الحال بالنسبة للعديد من مطوري scikit-Learn الأساسيين الآخرين على الرغم من أنني قد أكون مخطئًا بشأن العبارة الأخيرة.
IIUC لقد رأيت في الأصل مشكلة scikit-Learn 0.21.2 وإصدار pytorch dev. لا يمكنني إعادة إنتاج المشكلة على scikit-Learn 0.21.2 و pytorch 1.1.0 كما هو مذكور في https://github.com/scikit-learn/scikit-learn/issues/14485#issuecomment -517195977. إذا كنت سأحاول فهم هذا بمزيد من التفاصيل ، فسأقسم على PyTorch.
تحتوي مشكلة ezyang المرتبط على مجموعة من المعلومات حول مشكلة TLS (متجر محلي للخيط).
إليك بعض المعلومات التي بحثت عنها من قبل: https://github.com/pytorch/pytorch/issues/2575#issuecomment -369892859
؛ TLDR: شيء ما في سلسلة الواردات لم يكن C / C ++ مجمّعًا بعلامة -gPIC
. يتسبب استيراد تلك المكتبة في حدوث مشكلة تحول جميع الواردات إلى "TLS ثابت". هناك حد أقصى من فتحات TLS "الثابتة" (الأسماء التي أستخدمها هنا غير صحيحة بالتأكيد). تعتمد الفتحات N بالضبط على نظام التشغيل وكيفية تجميعها.
في إصدار pytorch المرتبط 2575 ، هناك إشارة إلى أن OpenMP هو الذي تم تجميعه بدون العلم الذي تسبب في التتالي.
قد تكون مشكلة scikit-Learn هذه ناتجة عن إدخال بعض المكتبات الجديدة أو بعض التغيير ، وتناول عدد قليل من فتحات TLS الثابتة.
ملاحظة: لست خبيرا حقيقيا. قد تكون هناك مصادر أخرى لهذا الخطأ غير "علامة واحدة / بعض lib مفقودة" -gPIC 'عندما تم تجميعها ". لم يتم العثور على واحد رغم ذلك.
هل كان هناك أي تحديثات على هذا؟ أواجه هذه المشكلة أيضًا ، أيضًا عند استيراد librosa.
تحقق من https://github.com/pytorch/pytorch/issues/2575#issuecomment -523657178
لقد قمت بحلها عن طريق استيراد sklearn ، ثم استيراد tensorflow. نتج عن أمر الاستيراد هذا الخطأ.
التعليق الأكثر فائدة
لقد قمت بحلها عن طريق استيراد sklearn ، ثم استيراد tensorflow. نتج عن أمر الاستيراد هذا الخطأ.