You need to enable JavaScript to run this app. 如何在SageMaker中使用字典列表而非S3路径训练AWS DeepAR模型
优惠活动
大模型
产品
解决方案
定价
更多

如何在SageMaker中使用字典列表而非S3路径训练AWS DeepAR模型

问题原因

  • SageMaker Estimator的fit方法的inputs参数不支持直接传入内存中的训练数据列表,仅支持S3 URI、sagemaker.inputs.TrainingInput、文件系统输入三类格式,你直接传编码后的字节列表触发了格式校验报错。
  • DeepAR要求训练输入为JSON Lines格式,且不支持numpy数组类型,你当前直接把带numpy数组的字典转字符串的方式不符合解析要求。
  • 补充说明:SageMaker内置DeepAR算法必须从S3读取训练数据,无法跳过S3直接用本地内存数据训练,你需要先把数据处理为符合要求的格式后上传到S3再发起训练。

解决步骤

  1. 先将所有numpy数组转换为Python原生列表,构造符合DeepAR要求的单条JSON记录
  2. 把所有记录按行写入本地JSON Lines文件
  3. 将本地文件上传到S3路径
  4. 把S3路径作为训练输入传给fit方法

修正后代码示例

import json
import boto3
from sagemaker.inputs import TrainingInput

# 1. 处理数据,转成符合要求的JSON Lines格式
training_records = []
for u in ts:
    record = ts[u]
    # 把numpy数组转成普通列表
    record["target"] = record["target"].tolist()
    record["dynamic_feat"] = [feat.tolist() for feat in record["dynamic_feat"]]
    training_records.append(json.dumps(record))

# 2. 写入本地JSON Lines文件
with open("train.jsonl", "w", encoding="utf-8") as f:
    for line in training_records:
        f.write(line + "\n")

# 3. 上传到S3的路径,这里替换为你自己的S3桶和前缀
s3 = boto3.client("s3")
bucket = "你的S3桶名"
s3_prefix = "deepar-stock/train"
s3.upload_file("train.jsonl", bucket, f"{s3_prefix}/train.jsonl")
train_s3_uri = f"s3://{bucket}/{s3_prefix}/"

# 4. 传入S3路径启动训练
estimator.fit(inputs={'train': TrainingInput(train_s3_uri, content_type="application/jsonlines")})

额外注意事项

  • 你配置的output_path本身就是S3路径,模型输出也必须存到S3,无法完全跳过S3使用SageMaker内置算法训练。
  • 如果要完全不依赖S3训练,你可以自行拉取DeepAR的容器镜像在本地运行,或者自己实现DeepAR算法逻辑在本地训练。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 06:48:03