ValueError:Numpy中的非字符串名称仅在AWS Lambda上进行unpickling

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ValueError:Numpy中的非字符串名称仅在AWS Lambda上进行unpickling相关的知识,希望对你有一定的参考价值。

我正在使用pickle来保存我训练过的ML模型。对于学习部分,我使用scikit-learn库并构建RandomForestClassifier

rf =  RandomForestClassifier(n_estimators=100,  max_depth=20, 
min_samples_split=2,  max_features='auto', oob_score=True, 
random_state=123456)
rf.fit(X, y)

fp = open('model.pckl', 'wb')
pickle.dump(rf, fp, protocol=2)
fp.close()

我在S3上传了这个模型,我使用AWS Lambda中的boto3库获取此模型。

s3_client = boto3.client('s3')

bucket = 'mlbucket'
key = 'model.pckl'
download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
s3_client.download_file(bucket, key, download_path)
f = open(download_path, 'rb')
model = pickle.load(f)
f.close()

但是,我在这一行得到ValueError: non-string names in Numpy dtype unpickling错误:model = pickle.load(f)

这是日志:

START RequestId: 3d8a1263-1e3c-11e8-8bdb-03c0ef524c0e Version: $LATEST
non-string names in Numpy dtype unpickling: ValueError
Traceback (most recent call last):
File "/var/task/function.py", line 31, in handler
  model = pickle.load(f)
File "/usr/lib64/python2.7/pickle.py", line 1384, in load
  return Unpickler(file).load()
File "/usr/lib64/python2.7/pickle.py", line 864, in load
  dispatch[key](self)
File "/usr/lib64/python2.7/pickle.py", line 1223, in load_build
  setstate(state)
ValueError: non-string names in Numpy dtype unpickling

我在本地机器和AWS Lambda上使用python 2.7。奇怪的是,pickle.load()在我的本地机器上工作正常。我已使用此代码在本地计算机上测试pickle

with open('/home/Documents/model.pckl', 'rb') as f:
    rf = pickle.load(f)
答案

我发现问题出在库版本不匹配上。

我在压缩(numpy,scipy等)之后在AWS Lambda上传的库是最新版本,而本地计算机上的库则较旧。一旦我更新了本地机器上的库,构建了pickle对象并在S3上更新了它们,lambda就开始正常工作了。

因此,事实证明,不仅python的版本,而且文件库在酸洗对象时也很重要。

以上是关于ValueError:Numpy中的非字符串名称仅在AWS Lambda上进行unpickling的主要内容,如果未能解决你的问题,请参考以下文章

Numpy、Pandas 和 Sklearn 中的多维缩放拟合(ValueError)

ValueError: X 必须是 NumPy 数组

Numpy加载CSV - ValueError:无法将字符串转换为float

Scikit/Numpy/Pandas ValueError:使用序列设置数组元素

numpy 1.9.0:ValueError:概率总和不等于 1

如何过滤数组中不需要的值以进行绘图?使用 numpy 数组的 matplotlib 中的 ValueError