Linux aarch64架构下scikit-learn导入失败问题求助
解决aarch64架构下conda环境中scikit-learn静态TLS内存分配错误
问题现象
在Linux aarch64架构的miniconda3虚拟环境中,通过pip install scikit-learn安装scikit-learn后,导入librosa时触发如下错误:
>>> import librosa Traceback (most recent call last): File "/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__check_build/__init__.py", line 48, in <module> from ._check_build import check_build # noqa ImportError: /home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__check_build/../../scikit_learn.libs/libgomp-d22c30c5.so.1.0.0: cannot allocate memory in static TLS block During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/librosa/__init__.py", line 211, in <module> from . import decompose File "/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/librosa/decompose.py", line 19, in <module> import sklearn.decomposition File "/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__init__.py", line 81, in <module> from . import __check_build # noqa: F401 File "/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__check_build/__init__.py", line 50, in <module> raise_build_error(e) File "/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__check_build/__init__.py", line 31, in raise_build_error raise ImportError( ImportError: /home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__check_build/../../scikit_learn.libs/libgomp-d22c30c5.so.1.0.0: cannot allocate memory in static TLS block ___________________________________________________________________________ Contents of /home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/sklearn/__check_build: __pycache__ __init__.py setup.py _check_build.cpython-310-aarch64-linux-gnu.so ___________________________________________________________________________ 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-image到0.17.2后,立即导入librosa和scikit-learn正常,但退出Python后再次导入又出现相同错误。
环境背景
- 系统架构:Linux aarch64
- 虚拟环境:miniconda3(Python 3.10)
- 已安装关键包版本:scikit-learn 1.1.2、librosa 0.9.2、scikit-image 0.19.3
- 曾用pyenv创建过非conda环境,相关配置已写入
~/.bashrc
解决方案
1. 改用conda安装scikit-learn(优先推荐)
conda针对aarch64架构提供了预编译的优化包,能避免pip编译时的TLS参数问题:
# 卸载pip安装的scikit-learn pip uninstall -y scikit-learn # 用conda安装对应版本 conda install scikit-learn=1.1.2
2. 调整静态TLS内存分配环境变量
如果必须使用pip安装的scikit-learn,可通过环境变量调整TLS内存分配:
# 临时生效:启动Python前执行该命令 export LD_PRELOAD=/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/scikit_learn.libs/libgomp-d22c30c5.so.1.0.0 # 永久生效:将命令添加到conda环境的激活脚本中 echo 'export LD_PRELOAD=/home/su/miniconda3/envs/acousticpdev/lib/python3.10/site-packages/scikit_learn.libs/libgomp-d22c30c5.so.1.0.0' >> /home/su/miniconda3/envs/acousticpdev/etc/conda/activate.d/env_vars.sh
或者调整TLS预留大小:
export MALLOC_TLS_PAD_OLD=0x4000
3. 隔离conda环境与pyenv的干扰
pyenv的PATH配置可能导致conda环境加载系统级的libgomp库,引发冲突:
# 编辑~/.bashrc,修改pyenv初始化逻辑,仅在非conda环境加载 sed -i 's/eval "$(pyenv init -)"/if [ -z "$CONDA_PREFIX" ]; then eval "$(pyenv init -)"; fi/' ~/.bashrc # 重新加载配置 source ~/.bashrc # 重新激活conda环境 conda activate acousticpdev
4. 重建干净的conda环境
若以上方法无效,彻底清理旧环境,新建纯净环境避免依赖冲突:
conda deactivate conda env remove -n acousticpdev # 创建新环境 conda create -n acousticpdev python=3.10 conda activate acousticpdev # 优先安装conda维护的包,再用pip补充 conda install scikit-learn librosa numpy scipy # 按需安装其他pip包 pip install tensorflow keras
问题原因
该错误是aarch64架构下,libgomp(OpenMP库)的静态TLS(线程本地存储)内存块分配不足导致的。pip安装的scikit-learn可能使用了未针对aarch64优化的编译参数,而conda预编译包则调整了相关参数;同时pyenv的环境变量可能导致conda环境加载了系统级的libgomp,引发库冲突。
内容的提问来源于stack exchange,提问作者Susan
相关产品推荐
相关产品推荐

