【sklearn】cannot load any more object with static TLS

问题描述

环境:Ubuntu 14.04、python 3.9、keras 2.6.0、scikit-learn 1.0.1

import pickle
from keras.models import load_model
scaler = pickle.load(open('./model/Binary_Scaler_V2.pkl', 'rb'))
model = load_model("./model/Binary_model.hdf5") # 加载模型

当执行到第三行时报以下错误:

Traceback (most recent call last):
  File "/home/qiye/binary_classify.py", line 33, in <module>
    scaler = pickle.load(open('./model/Binary_Scaler.pkl', 'rb'))
  File "/home/qiye/miniconda3/lib/python3.9/site-packages/sklearn/__init__.py", line 81, in <module>
    from . import __check_build  # noqa: F401
  File "/home/qiye/miniconda3/lib/python3.9/site-packages/sklearn/__check_build/__init__.py", line 50, in <module>
    raise_build_error(e)
  File "/home/qiye/miniconda3/lib/python3.9/site-packages/sklearn/__check_build/__init__.py", line 31, in raise_build_error
    raise ImportError(
ImportError: dlopen: cannot load any more object with static TLS
___________________________________________________________________________
Contents of /home/qiye/miniconda3/lib/python3.9/site-packages/sklearn/__check_build:
_check_build.cpython-39-x86_64-linux-gnu.sosetup.py                  __init__.py
__pycache__
___________________________________________________________________________
It seems that scikit-learn has not been built correctly.

但Ubuntu 18.04上正常运行

解决方案

问题1:scikit-learn未安装成功

pip安装的scikit-learn,未安装成功,后来采用conda install scikit-learn和源码安装均可解决

问题2:无法使用静态 TLS 加载更多对象

由于本人在训练模型时使用了sklearn.preprocessing的Normalizer模块,将Normalizer().fit(X_train)通过pickle保存在pkl文件中。本代码中在导入文件时报出该错误,和网上查到的sklearn相关错误一致。

在其他博客中提到和import库的先后顺序有关,故调整如下:

import pickle
scaler = pickle.load(open('./model/Binary_Scaler_V2.pkl', 'rb'))
from keras.models import load_model
model = load_model("./model/Binary_model.hdf5")# 加载模型

注意:先加载pkl,再使用keras调用模型,即第2行要在第3行上面,否则还是报错

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年5月20日
下一篇 2022年5月20日

相关推荐