如何将Pickle/Joblib预训练ML模型部署至AWS SageMaker端点
刚好我之前做过一模一样的操作,把预训练好的模型直接部署到SageMaker端点,完全不用跑训练流程。下面是一步步的实操指南,亲测有效:
1. 准备SageMaker要求的文件结构
SageMaker部署模型时需要特定的压缩包格式,核心是要包含模型文件和推理处理脚本。
首先本地创建一个临时目录(比如model_dir),把你的model.pkl(可以从S3下载到本地,或者直接用本地已有的)放进去,然后创建一个名为inference.py的推理脚本——这是SageMaker处理预测请求的核心逻辑,必须包含3个关键函数:
import joblib import numpy as np def model_fn(model_dir): # 加载预训练模型 model = joblib.load(f"{model_dir}/model.pkl") return model def input_fn(request_body, request_content_type): # 解析输入数据(这里假设请求是JSON格式的numpy数组) if request_content_type == 'application/json': import json input_data = json.loads(request_body) return np.array(input_data) raise ValueError(f"不支持的请求格式: {request_content_type}") def predict_fn(input_data, model): # 执行预测逻辑 predictions = model.predict(input_data) return predictions def output_fn(prediction, response_content_type): # 格式化预测结果返回 if response_content_type == 'application/json': import json return json.dumps(prediction.tolist()) raise ValueError(f"不支持的响应格式: {response_content_type}")
如果你的模型依赖特定版本的库(比如指定版本的scikit-learn、numpy),可以在model_dir里新建requirements.txt,把依赖列进去:
scikit-learn==1.2.1 numpy==1.24.3
最后把目录里的文件打包成model.tar.gz:
cd model_dir tar -czvf model.tar.gz model.pkl inference.py requirements.txt
2. 把压缩包上传到S3
用AWS CLI或者Python的boto3把打包好的文件传到你的S3桶:
- CLI方式:
aws s3 cp model.tar.gz s3://myBucketName/model/model.tar.gz
- Python boto3方式:
import boto3 s3 = boto3.client('s3') s3.upload_file('model_dir/model.tar.gz', 'myBucketName', 'model/model.tar.gz')
3. 用SageMaker Python SDK部署端点
首先确保安装了必要的库:
pip install sagemaker boto3
然后编写部署代码,分两种模型情况:
情况1:Scikit-learn模型(比如Logistic Regression)
import sagemaker from sagemaker.sklearn.model import SKLearnModel # 初始化SageMaker会话,获取执行角色 sess = sagemaker.Session() role = sagemaker.get_execution_role() # 创建模型对象 sklearn_model = SKLearnModel( model_data='s3://myBucketName/model/model.tar.gz', role=role, entry_point='inference.py', # 指定我们写的推理脚本 framework_version='1.2-1' # 要和你训练模型时的scikit-learn版本匹配 ) # 部署成预测端点 predictor = sklearn_model.deploy( initial_instance_count=1, instance_type='ml.t2.medium' # 根据模型大小和请求量选实例,测试用t2.medium足够 )
情况2:XGBoost模型
如果是XGBoost模型,把SKLearnModel换成XGBoostModel即可,注意框架版本要匹配:
import sagemaker from sagemaker.xgboost.model import XGBoostModel sess = sagemaker.Session() role = sagemaker.get_execution_role() xgboost_model = XGBoostModel( model_data='s3://myBucketName/model/model.tar.gz', role=role, entry_point='inference.py', framework_version='1.7-1' # 匹配你的XGBoost训练版本 ) predictor = xgboost_model.deploy( initial_instance_count=1, instance_type='ml.t2.medium' )
4. 测试预测端点
部署完成后,直接用predictor对象测试:
import numpy as np # 准备测试数据,和你本地的X_test格式一致 X_test = np.array([[1.2, 3.4, 5.6], [7.8, 9.0, 1.2]]) # 发送预测请求 predictions = predictor.predict(X_test) print(predictions)
也可以用boto3直接调用端点(适合生产环境的API调用):
import boto3 import json runtime = boto3.client('sagemaker-runtime') endpoint_name = 'your-endpoint-name' # 部署时输出的端点名称 payload = json.dumps(X_test.tolist()) response = runtime.invoke_endpoint( EndpointName=endpoint_name, ContentType='application/json', Body=payload ) result = json.loads(response['Body'].read().decode()) print(result)
5. 清理资源(必做!避免不必要的费用)
测试完成后,记得删除端点:
predictor.delete_endpoint()
也可以登录AWS控制台,手动删除端点、模型和终端配置。
内容的提问来源于stack exchange,提问作者user2458922
相关产品推荐
相关产品推荐

