ValueError: non-string names in Numpy dtype unpickling only on AWS Lambda
ValueError: non-string names in Numpy dtype unpickling only on AWS Lambda
我正在使用 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)
我发现问题是库版本不匹配。
我在压缩后上传到 AWS Lambda 的库(numpy、scipy 等)是最新版本,而我本地机器上的库是旧版本。
一旦我更新了本地机器上的库,构建了 pickle 对象并在 S3 上更新了它们,lambda 就开始正常工作了。
因此,事实证明,在 pickle 对象时,不仅 python 的版本很重要,库的版本也很重要。
我正在使用 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)
我发现问题是库版本不匹配。
我在压缩后上传到 AWS Lambda 的库(numpy、scipy 等)是最新版本,而我本地机器上的库是旧版本。 一旦我更新了本地机器上的库,构建了 pickle 对象并在 S3 上更新了它们,lambda 就开始正常工作了。
因此,事实证明,在 pickle 对象时,不仅 python 的版本很重要,库的版本也很重要。