使用自定义Docker部署Sagemaker端点时返回500错误
排查SageMaker端点推理后Ping返回500问题
排查步骤与解决方案
1. 优先查看CloudWatch日志定位错误
直接查看端点对应的CloudWatch日志组(推理容器的/var/log/sagemaker/container.log),重点关注:
model_fn中的日志输出,确认模型是否成功加载(是否打印了model loaded!)- 推理请求时的异常堆栈信息,这是定位问题最直接的方式
2. 验证模型文件路径与存在性
- 确认部署时模型包(
tuta-ctc.bin和config.json)是否正确上传到SageMaker模型存储,且路径对应model_dir(SageMaker中model_dir默认是/opt/ml/model) - 若模型文件未上传或路径错误,会触发文件不存在异常,导致服务崩溃
3. 检查依赖完整性
- 基础镜像已包含PyTorch,但自定义模型(
TUTAForCTC、layers、metrics)所需的额外依赖是否已通过Poetry安装? - 检查
pyproject.toml是否包含所有必要依赖,若有缺失,在Dockerfile中添加poetry add <依赖包> - 可在Dockerfile中添加
RUN poetry show验证已安装的依赖列表
4. 确保推理请求格式合规
- 发送推理请求时必须指定
Content-Type: application/json,且输入为合法JSON格式 - 若输入格式错误,
input_fn中的json.loads会抛出异常,未捕获的异常会导致服务进程崩溃
5. 添加异常捕获避免服务崩溃
在推理函数中添加try-except块,捕获异常并输出详细日志,防止服务直接崩溃:
def model_fn(model_dir): try: print("loading the model!") model = TUTAForCTC(model_bin=os.path.join(model_dir, "tuta-ctc.bin"), model_config_path=os.path.join(model_dir, "config.json")) print("model loaded!") return model except Exception as e: print(f"Model load error: {str(e)}") raise e def predict_fn(data, model): try: print("predicting...") # 恢复实际推理逻辑 return model.predict(data['hier_table'], data['flat_table'], data['table_range']) except Exception as e: print(f"Prediction error: {str(e)}") raise e
6. 本地Docker容器测试
本地构建镜像并运行,模拟SageMaker推理环境快速排查:
- 构建镜像:
docker build --build-arg REGION=us-east-1 -t sm-tuta-model . - 启动服务容器:
docker run -p 8080:8080 sm-tuta-model serve - 发送测试请求:
curl -X POST http://localhost:8080/invocations -H "Content-Type: application/json" -d '{"hier_table": {}, "flat_table": {}, "table_range": []}' - 查看容器日志,定位是否存在本地可复现的错误
7. 验证容器内文件路径正确性
在Dockerfile中添加验证步骤,确认代码和模型文件路径正确:
# 在ADD tuta models/tuta后添加 RUN ls -la /opt/code/models/tuta/ RUN ls -la /opt/code/
内容的提问来源于stack exchange,提问作者Djellal Mohamed Aniss
相关产品推荐
相关产品推荐

