如何在SageMaker中基于model.tar.gz创建sklearn模型并解决部署/批处理报错
问题解答
1. 是否应该使用SageMaker.model.SKLearnModel?和通用Model类的区别?inference.py示例
- 你应该优先使用
SageMaker.model.SKLearnModel,它是SageMaker针对Scikit-learn框架封装的专用模型类,已经内置了Sklearn服务容器的默认逻辑、参数校验、路径适配,不需要你手动拉取镜像、处理框架特定的环境变量配置。通用Model类是无框架偏向的通用封装,需要你自行传入所有框架相关的配置参数,容易出现遗漏导致容器启动失败。 - 使用
SKLearnModel的inference.py示例如下:
# inference.py 内容 import joblib import os # 必须实现:加载模型逻辑 def model_fn(model_dir): clf = joblib.load(os.path.join(model_dir, "model.joblib")) return clf # 可选:如果你的输入输出不是默认的numpy数组/csv格式才需要自定义 def input_fn(request_body, request_content_type): # 这里默认处理csv格式输入,你可以根据自己的输入调整 if request_content_type == 'text/csv': import pandas as pd from io import StringIO df = pd.read_csv(StringIO(request_body), header=None) return df.values raise ValueError(f"Unsupported content type: {request_content_type}") def predict_fn(input_data, model): return model.predict(input_data) def output_fn(prediction, accept): if accept == 'text/csv': from io import StringIO import pandas as pd s = StringIO() pd.DataFrame(prediction).to_csv(s, header=False, index=False) return s.getvalue(), accept raise ValueError(f"Unsupported accept type: {accept}")
- 对应的SKLearnModel创建代码示例:
from sagemaker.sklearn.model import SKLearnModel model = SKLearnModel( model_data="s3://bucket/output/model.tar.gz", role="你的SageMaker执行角色ARN", entry_point="inference.py", # 你本地的推理脚本路径 framework_version="0.23-1", py_version="py3" ) # 部署或者创建批量转换作业即可
2. 为什么训练完成后直接部署不需要额外推理脚本,是不是因为训练脚本里有model_fn?
- 如果你是通过SageMaker Estimator训练完成后直接调用
estimator.deploy(),确实不需要额外传入推理脚本,因为Estimator会自动把你训练时传入的训练脚本作为推理的入口脚本,只要训练脚本里实现了model_fn等推理需要的函数就可以直接用。 - 你现在的场景是直接拿训练输出的
model.tar.gz新建模型,不是从Estimator直接部署,所以没有默认关联到你的训练脚本,需要主动指定推理入口。
3. 缺少input_fn、output_fn、predict_fn是不是报错的原因?
- 你当前的报错不是因为缺少这三个函数导致的。你看到的报错是容器在导入推理入口模块的时候就失败了,模块名称是空值,根本还没到执行
model_fn/input_fn这些函数的环节。 - 这个报错的直接原因是你用通用
Model类创建模型的时候,没有传入entry_point参数指定推理脚本路径,也没有设置对应的环境变量告诉容器推理入口是哪个文件,导致容器尝试加载的模块名称是None,触发了startswith调用失败。 - 当你解决了入口模块的问题之后,如果推理流程和默认的输入输出格式匹配,即使不自定义
input_fn/output_fn/predict_fn也可以正常运行,Sklearn容器内置了这三个函数的默认实现,只有默认实现不符合你的业务需求的时候才需要自定义。
内容的提问来源于stack exchange,提问作者Hamed Niakan
相关产品推荐
相关产品推荐

