S3 读取 Sagemaker 训练好的模型

S3 read Sagemaker trained model

我使用 Amazon Sagemaker 创建了一个 Xgboost 模型。解压生成的 tar.gz 文件后,我得到一个文件 "xgboost-model"。

下一步将直接从我的 S3 存储桶上传模型,而不使用 pickle 下载。这是我尝试过的:

obj = client.get_object(Bucket='...',Key='xgboost-model')

xgb_model = pkl.load(open((obj['Body'].read())),"rb")

但它抛出错误:

TypeError: embedded NUL character

也试过这个:

xgb_model = pkl.loads(open((obj['Body'].read())),"rb")

结果是一样的。

另一种方法:

bucket='...'
key='xgboost-model'

with s3io.open('s3://{0}/{1}'.format(bucket, key),mode='w') as s3_file:
  pkl.dump(mdl, s3_file)

这给出了错误:

CertificateError: hostname bucket doesn't match either of '*.s3.amazonaws.com', 's3.amazonaws.com'

这个虽然桶是一样的

如何将模型上传到 pickle 对象中,以便我可以将其用于预测?

我的假设是您已经使用 Sagemaker XGBoost 内置算法训练了模型。您希望使用该模型并在您自己的托管环境(而非 Sagemaker 托管)中进行预测。

pickle.load(file) 从打开的文件对象文件中读取 pickled 对象,pickle.loads(bytes_object) 从 bytes 对象和 returns 反序列化对象中读取 pickled 对象。由于您已经将 S3 对象作为字节下载(到内存中),因此您可以使用 pickle.loads 而无需使用 open

xgb_model = pkl.loads(obj['Body'].read())

如果您曾经使用 SageMaker 的 XGBoost built-in 算法训练过模型,并希望在稍后阶段使用该模型在 Sagemaker 环境中进行预测,您可以使用估算器的 'attach'方法。

安装 XGBoost 后,您可以立即使用

model_job_name = xgb_model._current_job_name

确定训练作业的名称。或者,您可以转到 SageMaker 仪表板的 'training job' 部分,找到您 运行 的作业名称: training job dashboard

稍后当您想要重用您所做的模型时:

import sagemaker
reloaded_xgb_model = sagemaker.estimator.Estimator.attach(model_job_name)