AWS Sagemaker boto3 - 通过端点预测与在本地运行模型获得不同的预测

Posted

技术标签:

【中文标题】AWS Sagemaker boto3 - 通过端点预测与在本地运行模型获得不同的预测【英文标题】:AWS Sagemaker boto3 - getting different predictions with endpoint prediction vs running model locally 【发布时间】:2020-01-11 11:59:27 【问题描述】:

我对我的 sagemaker 模型感到非常困惑,该模型给出了奇怪的预测,并且有很多重复的数字(20% 的预测是相同的)。为了排除故障,我决定在本地下载模型并对其进行测试,它会返回我所期望的结果。

所以我现在处于一种奇怪的情况,模型在 Sagemaker 中给出的预测与它在本地所做的预测不同。

这是我重现错误所采取的步骤(完整代码如下):

    我使用端点配置设置了一个端点,并准备进行预测。 然后我从那个端点获得模型工件,下载它并将其加载到我的笔记本中。 然后我记录并使用端点和下载的模型对其进行预测,我得到了截然不同的预测:
Booster object prediction: 0.9954053

Classifier object prediction: 0.9954053

Sagemaker endpoint prediction 0.693799495697

我将 booster 对象转换为分类器只是为了确保它不会影响任何东西。

怎么会这样?它使用完全相同的模型工件和数据,我是否遗漏了有关加载模型的工作原理?据我了解,除了模型工件和输入数据之外,没有其他东西可以定义端点,它们在这里都是相同的......

import pandas as pd
import time
import boto3, sagemaker
import numpy as np
from sagemaker.predictor import csv_serializer
import xgboost as xgb
import tarfile
import os
import pickle

sess = sagemaker.Session()
sm_client =  boto3.client('sagemaker')

endpoint_config_name = 'week-2-endpoint-config-prod' # using an existing endpoint config for demo
endpoint_name = 'week2-temp'

# Set up endpoint
#create_endpoint_response = sm_client.create_endpoint(
#EndpointName=endpoint_name,
#EndpointConfigName= endpoint_config_name)
#time.sleep(800)

# Get model name used by endpoint
model = sm_client.describe_endpoint_config(EndpointConfigName = endpoint_config_name)['ProductionVariants'][0]['ModelName']

# Get model artifact url
artifact_url = sm_client.describe_model(ModelName = model)['PrimaryContainer']['ModelDataUrl']

# Download model artifacts
dest = 'tempmodel.tar.gz'

boto3.client('s3').download_file(
    Bucket = 'sagemaker-us-west-2-987938178880',
    Key = artifact_url[38:],
    Filename = dest
    )

# Unpack and load the model
tf = tarfile.open(dest)
tf.extractall()

wk2_model =  pickle.load(open("xgboost-model", "rb"))
os.remove(dest)

print('Model object loaded of type:', type(wk2_model))

# Set up SKlearn wrapper classifier
regr = xgb.XGBClassifier()
regr._Booster = wk2_model

# Set up endpoint

endpoint = sagemaker.predictor.RealTimePredictor(endpoint_name, sagemaker_session=sess)
endpoint.content_type = 'text/csv'
endpoint.serializer = csv_serializer

# Test data
feats = np.asarray([[2,162.0,0.21,1,18.0,0.0,0.0,0.0,3.33,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,31.0,31.0,38.0,38.0,0,0,1,0.35,-999.0,-999.0,-999.0,-999.0,-999,-999,-999,-999,24.0,55.0,56.0,30.0,62.0,64.0,755.0,1297.0,1466.0,7.0,11.0,13.0]])

print('')
print('Booster object prediction:', regr.predict_proba(feats)[:,1][0])
print('Classifier object prediction:', wk2_model.predict(xgb.DMatrix(feats))[0])
print('Sagemaker endpoint prediction', float(endpoint.predict(feats)))

【问题讨论】:

您找到解决方案了吗? 是的 - 原来是 best_ntree_limit 参数用最新版本的 XGBoost 更改了它的默认值 所以你为那个参数指定了一些东西? 我在入口点脚本的 predict_fn(input_data, model) 中将 model.predict(input_data, validate_features=False, ntree_limit = model.best_ntree_limit)) 更改为 model.predict(input_data, validate_features=False)) 给你。我在让它工作时遇到了很多问题,所以有很多打印语句等。不确定这是否是最好的方法,但它一直在为我工作github.com/MaximusDecimusMeridius/SE/blob/master/… 【参考方案1】:

我没有看到您共享的代码有任何直接的危险信号。

如果您继续遇到这种不一致的情况,可能值得通过 AWS Support Console 创建一个支持案例,您可以在其中与 SageMaker 团队分享有关您的端点的更多详细信息,并让他们仔细查看您的模型容器和它与 SageMaker 平台基础架构的交互。

【讨论】:

以上是关于AWS Sagemaker boto3 - 通过端点预测与在本地运行模型获得不同的预测的主要内容,如果未能解决你的问题,请参考以下文章

AWS DeepRacer 参数调优 Amazon SageMaker 和 Amazon RoboMaker

如何修复 aws 区域错误“ValueError:必须使用 SageMaker 支持的区域设置本地 AWS 配置”

创建 SageMaker 模型时出现 ValidationError

如何将 AWS SageMaker 提供给组织外部的人员使用?

AWS Glue - boto3 爬虫未创建表

我们如何在 AWS Sagemaker 推理中添加复杂的预处理