AWS SageMaker端点FastAPI应用ModelError问题排查求助
错误信息
{
"errorMessage": "An error occurred (ModelError) when calling the InvokeEndpoint operation: Received server error (500) from model with message "Internal Server Error". See https://us-east-1.console.aws.amazon.com/cloudwatch/home?region=xxxxxxx#logEventViewer:group=/aws/sagemaker/Endpoints/xxxxx in account xxxxxxxxx for more information.",
"errorType": "ModelError",
"requestId": "",
"stackTrace": [
" File "/var/task/lambda_function.py", line 12, in lambda_handler\n response = client.invoke_endpoint(EndpointName=ENDPOINT_NAME,\n",
" File "/var/runtime/botocore/client.py", line 565, in _api_call\n return self._make_api_call(operation_name, kwargs)\n",
" File "/var/runtime/botocore/client.py", line 1021, in _make_api_call\n raise error_class(parsed_response, operation_name)\n"
]
}
本地运行正常(容器化FastAPI+PyTorch模型),但部署到SageMaker Serverless端点后,Lambda调用时返回上述500错误。Dockerfile如下:
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN python3 -m pip install -r requirements.txt COPY . . EXPOSE 8080 ENTRYPOINT ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8080", "--config", "settings.py" , "app:app", "-n"]
排查步骤
1. 优先查看CloudWatch日志
直接前往对应区域的CloudWatch日志组(/aws/sagemaker/Endpoints/xxxxx)查看容器的具体报错信息——这是定位500错误最直接的方式,模型加载失败、依赖缺失、API路径不匹配等问题都会在这里体现。
2. 检查SageMaker容器的API路径要求
SageMaker对自定义容器的推理端点有固定路径要求:
- 必须实现
/invocations路径处理推理请求 - 必须实现
/ping路径用于健康检查
如果你的FastAPI应用没有这两个路径,SageMaker会因为健康检查失败或无法路由请求而返回500错误。修改FastAPI代码添加对应路由:
from fastapi import FastAPI, Request app = FastAPI() # SageMaker健康检查路径 @app.get("/ping") async def ping(): return {"status": "healthy"} # SageMaker推理请求路径 @app.post("/invocations") async def invocations(request: Request): data = await request.json() # 你的推理逻辑 return {"prediction": ...}
3. 验证Serverless端点的配置限制
SageMaker Serverless端点有以下限制,超出会导致错误:
- 内存范围:128MB到6GB
- 超时时间:1秒到900秒
如果模型加载或推理耗时超过设置的超时时间,或者内存不足导致模型加载失败,会触发500错误。可以尝试调高内存配置(比如先设为1GB)和超时时间(比如设为30秒)再测试。
4. 检查Lambda的请求格式
确保Lambda调用invoke_endpoint时的参数符合要求:
- 必须指定
ContentType,比如ContentType='application/json' - 请求体格式要和FastAPI的
/invocations路径接收格式一致
示例Lambda代码:
import boto3 import json client = boto3.client('sagemaker-runtime') ENDPOINT_NAME = "your-endpoint-name" def lambda_handler(event, context): response = client.invoke_endpoint( EndpointName=ENDPOINT_NAME, ContentType='application/json', Body=json.dumps({"input": "your-data"}) ) result = json.loads(response['Body'].read().decode()) return result
5. 检查容器内模型加载逻辑
虽然本地运行正常,但SageMaker容器环境可能和本地有差异:
- 确保
.pth文件路径在容器内正确,避免相对路径问题 - 模型加载时添加异常捕获,在CloudWatch中打印错误信息:
import torch try: model = torch.load("/app/model.pth") model.eval() except Exception as e: print(f"Model load error: {str(e)}") raise e
6. 验证容器的端口和启动命令
确认gunicorn的启动命令正确绑定到0.0.0.0:8080,且settings.py中的配置没有冲突(比如端口被覆盖)。
内容的提问来源于stack exchange,提问作者Fzm

