You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Amazon SageMaker指定端点数据捕获未写入S3存储位置问题求助

排查SageMaker端点数据捕获未生成S3文件的问题

根据你描述的情况,端点运行正常但数据捕获没落地到S3,咱们可以从以下几个方向逐一排查:

1. 检查SageMaker角色的权限配置

这是最常见的原因之一。SageMaker需要有写入目标S3桶的权限,确保你的端点执行角色(或关联的IAM角色)包含以下权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<你的bucket名称>",
                "arn:aws:s3:::<你的bucket名称>/*"
            ]
        }
    ]
}

注意:如果你的S3路径带前缀(比如s3://bucket/path/),要确保权限覆盖到该前缀下的所有对象。另外不要遗漏ListBucket权限,部分场景下SageMaker需要先验证桶的存在性。

2. 验证数据捕获内容类型与请求匹配

你提到尝试过多种内容类型设置,但必须确保捕获的内容类型和实际调用端点时的ContentType完全一致。你的Lambda调用里用的是ContentType='application/json',所以数据捕获配置里的“捕获内容类型”应该明确设置为application/json(在JSON分类下),不要留空或设置其他类型——留空时SageMaker只会捕获默认支持的类型,可能和你的请求不匹配。

3. 检查自定义容器的数据捕获实现

你的端点用了自定义Flask API容器,SageMaker的数据捕获依赖容器将输入输出写入指定本地路径(/opt/ml/output/data_capture/)。虽然你的Flask已经记录了日志,但需要确认推理脚本是否正确集成了数据捕获逻辑:

  • 可以在容器日志里搜索data_capture关键词,确认SageMaker的配置已被正确加载
  • 推理脚本处理请求后,要把输入输出按SageMaker要求的格式写入/opt/ml/output/data_capture/目录。举个简单的实现示例:
import json
import os
from flask import Flask, request

app = Flask(__name__)
DATA_CAPTURE_PATH = "/opt/ml/output/data_capture/"

@app.route('/invocation', methods=['POST'])
def invoke():
    input_data = request.get_json()
    # 执行你的推理逻辑
    predictions = your_inference_function(input_data)
    output_data = {"predictions": predictions}
    
    # 写入数据捕获文件(文件名需符合SageMaker规范)
    os.makedirs(DATA_CAPTURE_PATH, exist_ok=True)
    req_id = request.headers.get('X-Amzn-SageMaker-Request-Id')
    capture_file = f"{DATA_CAPTURE_PATH}capture-{req_id}.jsonl"
    with open(capture_file, 'w') as f:
        f.write(json.dumps({"input": input_data}) + "\n")
        f.write(json.dumps({"output": output_data}) + "\n")
    
    return json.dumps(output_data)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

如果是用SageMaker预构建的scikit-learn容器,无需手动实现,但要确保推理脚本符合预构建容器规范(比如使用model_fn、predict_fn等标准函数)。

4. 查看SageMaker专属的CloudWatch数据捕获日志

除了你自己的Flask日志,还要查看SageMaker提供的数据捕获日志。在CloudWatch中找到端点对应的日志组(通常是/aws/sagemaker/Endpoints/<你的端点名称>),搜索DataCapture或capture关键词,看看是否有权限拒绝、路径不存在、写入失败等错误信息。

5. 确认端点与S3桶的区域一致性

SageMaker端点和目标S3桶必须在同一个AWS区域,跨区域访问会因限制导致写入失败。比如端点在eu-central-1,S3桶也必须在该区域。

6. 等待足够的延迟时间

SageMaker的数据捕获不是实时写入S3的,通常会有几分钟的批量上传延迟。刚调用完端点就去S3查看可能还没生成文件,可以等待5-10分钟后再检查。

7. 复查采样率与启用状态

你已经设置了100%采样率,但可以再去SageMaker控制台的端点详情页,确认“数据捕获配置”的采样率是100%,且状态为“启用”。


内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:17:27