无需Docker与ECR,将自定义Python推荐代码部署至AWS SageMaker端点
可行的SageMaker无Docker部署方案(仅依赖Notebook)
核心方案:利用SageMaker预构建镜像 + Script Mode
SageMaker提供了预构建的Python基础镜像(内置numpy、pandas等常用依赖),你可以通过Script Mode直接部署自定义代码,无需自行构建Docker镜像或使用ECR。
步骤1:准备模型与推理脚本
1.1 模型代码文件(recommender_model.py)
将你的推荐模型类封装到该文件中,示例:
import numpy as np import pandas as pd class CustomRecommender: def __init__(self): # 初始化逻辑,比如加载预训练权重(如果有) self.weights = np.load("model_weights.npy") if os.path.exists("model_weights.npy") else None pass def recommend(self, user_input): # 核心推荐逻辑,接收输入并返回结果 processed_data = self._preprocess(user_input) recs = self._calculate_recommendations(processed_data) return {"recommended_items": recs} def _preprocess(self, input_data): # 输入预处理逻辑,比如转成DataFrame return pd.DataFrame(input_data) def _calculate_recommendations(self, data): # 自定义推荐计算逻辑 return ["item_001", "item_005", "item_012"]
1.2 推理脚本(inference.py)
必须实现SageMaker要求的4个核心函数,平台会自动调用这些函数处理请求:
import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from recommender_model import CustomRecommender def model_fn(model_dir): # 加载模型,model_dir是SageMaker挂载的模型包路径 model = CustomRecommender() # 若有权重文件,从model_dir加载: # model.weights = np.load(os.path.join(model_dir, "model_weights.npy")) return model def input_fn(request_body, request_content_type): # 解析输入请求,支持JSON格式 if request_content_type == "application/json": import json return json.loads(request_body) raise ValueError(f"Unsupported content type: {request_content_type}") def predict_fn(input_data, model): # 调用模型生成推荐结果 return model.recommend(input_data) def output_fn(prediction, response_content_type): # 格式化输出为JSON if response_content_type == "application/json": import json return json.dumps(prediction) raise ValueError(f"Unsupported content type: {response_content_type}")
1.3 打包模型文件
将recommender_model.py、inference.py(以及权重文件如果有)打包成model.tar.gz:
tar -czvf model.tar.gz recommender_model.py inference.py
将打包后的文件上传到你的S3存储桶(例如s3://your-bucket/model-artifacts/model.tar.gz)。
步骤2:在SageMaker Notebook中部署端点
使用SageMaker Python SDK完成部署,示例代码:
import sagemaker from sagemaker.model import Model from sagemaker.predictor import Predictor from sagemaker.serializers import JSONSerializer from sagemaker.deserializers import JSONDeserializer # 初始化会话与角色 sess = sagemaker.Session() role = sagemaker.get_execution_role() # 指定预构建Python镜像(以us-east-1区域为例,其他区域替换对应账号ID) image_uri = "763104351884.dkr.ecr.us-east-1.amazonaws.com/python:3.9-sagemaker" # 创建Model对象 model = Model( image_uri=image_uri, model_data="s3://your-bucket/model-artifacts/model.tar.gz", role=role, # 若需额外依赖,可指定requirements.txt路径(可选) # dependencies=["requirements.txt"] ) # 部署端点 predictor = model.deploy( initial_instance_count=1, instance_type="ml.t2.medium", # 根据需求选择实例类型 predictor_cls=lambda endpoint_name, sess: Predictor( endpoint_name, sagemaker_session=sess, serializer=JSONSerializer(), deserializer=JSONDeserializer() ) ) # 测试端点 test_input = {"user_id": "u_1001", "user_features": [0.3, 0.7, 0.2]} response = predictor.predict(test_input) print(response)
官方文档指引
- Script Mode自定义推理:SageMaker官方文档中关于自定义推理脚本的详细规范,包括函数参数、执行流程等。
- 预构建镜像列表:不同区域、Python版本的预构建镜像URI清单,可根据你的环境选择适配的镜像。
- SageMaker Python SDK部署指南:关于
Model类、deploy方法的参数说明与最佳实践。
注:如果你的numpy/pandas版本与预构建镜像中的版本不兼容,可在
requirements.txt中指定具体版本,将其打包到model.tar.gz中,SageMaker会自动安装依赖。
内容的提问来源于stack exchange,提问作者Stanislav Nevyazhsky
相关产品推荐
相关产品推荐

