如何在SageMaker中使用字典列表而非S3路径训练AWS DeepAR模型
问题原因
- SageMaker Estimator的
fit方法的inputs参数不支持直接传入内存中的训练数据列表,仅支持S3 URI、sagemaker.inputs.TrainingInput、文件系统输入三类格式,你直接传编码后的字节列表触发了格式校验报错。 - DeepAR要求训练输入为JSON Lines格式,且不支持numpy数组类型,你当前直接把带numpy数组的字典转字符串的方式不符合解析要求。
- 补充说明:SageMaker内置DeepAR算法必须从S3读取训练数据,无法跳过S3直接用本地内存数据训练,你需要先把数据处理为符合要求的格式后上传到S3再发起训练。
解决步骤
- 先将所有numpy数组转换为Python原生列表,构造符合DeepAR要求的单条JSON记录
- 把所有记录按行写入本地JSON Lines文件
- 将本地文件上传到S3路径
- 把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
相关产品推荐
相关产品推荐

