如何使用多个通道训练 SageMaker BlazingText 模型
How to train SageMaker BlazingText model using multiple channels
我有两个单独的规范化文本文件,我想在其上训练我的 BlazingText 模型。
我正在努力让它工作,文档没有帮助。
基本上我需要弄清楚如何将多个文件或 S3 前缀作为 "inputs" 参数提供给 sagemaker.estimator.Estimator.fit() 方法。
我第一次尝试:
s3_train_data1 = 's3://{}/{}'.format(bucket, prefix1)
s3_train_data2 = 's3://{}/{}'.format(bucket, prefix2)
train_data1 = sagemaker.session.s3_input(s3_train_data1, distribution='FullyReplicated', content_type='text/plain', s3_data_type='S3Prefix')
train_data2 = sagemaker.session.s3_input(s3_train_data2, distribution='FullyReplicated', content_type='text/plain', s3_data_type='S3Prefix')
bt_model.fit(inputs={'train1': train_data1, 'train2': train_data2}, logs=True)
这不起作用,因为 SageMaker 正在寻找输入参数中专门为 "train" 的密钥。
然后我尝试了:
bt_model.fit(inputs={'train': train_data1, 'train': train_data2}, logs=True)
这仅在第二个数据集上训练模型并完全忽略第一个数据集。
现在我终于尝试使用此处文档的清单文件:https://docs.aws.amazon.com/sagemaker/latest/dg/API_S3DataSource.html
(请参阅 "S3Uri" 部分下的清单文件格式)
文档说清单文件格式是 JSON,看起来像这个例子:
[
{"prefix": "s3://customer_bucket/some/prefix/"},
"relative/path/to/custdata-1",
"relative/path/custdata-2"
]
嗯,我不认为这是有效的 JSON 但我知道什么,我仍然试一试。
当我尝试这个时:
s3_train_data_manifest = 'https://s3.us-east-2.amazonaws.com/bucketpath/myfilename.manifest'
train_data_merged = sagemaker.session.s3_input(s3_train_data_manifest, distribution='FullyReplicated', content_type='text/plain', s3_data_type='ManifestFile')
data_channel_merged = {'train': train_data_merged}
bt_model.fit(inputs=data_channel_merged, logs=True)
我收到一条错误消息:
ValueError: Error training blazingtext-2018-10-17-XX-XX-XX-XXX: Failed Reason: ClientError: Data download failed:Unable to parse manifest at s3://mybucketpath/myfilename.manifest - invalid format
我尝试用大括号替换清单文件中的方括号...但我仍然觉得 JSON 文件格式似乎缺少文档未能正确描述的内容?
您当然可以匹配具有相同前缀的多个文件,因此只要您在 S3 存储桶中组织适合的文件,您的第一次尝试就可以成功。例如前缀:s3://mybucket/foo/
将匹配文件 s3://mybucket/foo/bar/data1.txt
和 s3://mybucket/foo/baz/data2.txt
但是,如果您的存储桶中有第三个名为 s3://mybucket/foo/qux/data3.txt
的文件,您 不想 匹配(但仍然匹配前两个),则没有使用单个前缀实现这一目标的方法。在这些情况下,清单会起作用。因此,在上面的示例中,清单只是:
[
{"prefix": "s3://mybucket/foo/"},
"bar/data1.txt",
"baz/data2.txt"
]
(是的,这是有效的 json - 它是一个数组,其第一个元素是一个具有名为 prefix
的属性的对象,所有后续元素都是字符串)。
请仔细检查您的清单(您实际上没有 post 所以我不能为您做)并确保它符合上述语法。
如果您仍然遇到问题,请在 AWS sagemaker 论坛上创建一个线程 - https://forums.aws.amazon.com/forum.jspa?forumID=285 完成后我们可以设置一个 PM 来尝试弄清这个问题(永远不会 post 您在 public 论坛(例如 Whosebug 甚至 AWS 论坛)中的 AWS 帐户 ID)。
我有两个单独的规范化文本文件,我想在其上训练我的 BlazingText 模型。
我正在努力让它工作,文档没有帮助。
基本上我需要弄清楚如何将多个文件或 S3 前缀作为 "inputs" 参数提供给 sagemaker.estimator.Estimator.fit() 方法。
我第一次尝试:
s3_train_data1 = 's3://{}/{}'.format(bucket, prefix1)
s3_train_data2 = 's3://{}/{}'.format(bucket, prefix2)
train_data1 = sagemaker.session.s3_input(s3_train_data1, distribution='FullyReplicated', content_type='text/plain', s3_data_type='S3Prefix')
train_data2 = sagemaker.session.s3_input(s3_train_data2, distribution='FullyReplicated', content_type='text/plain', s3_data_type='S3Prefix')
bt_model.fit(inputs={'train1': train_data1, 'train2': train_data2}, logs=True)
这不起作用,因为 SageMaker 正在寻找输入参数中专门为 "train" 的密钥。
然后我尝试了:
bt_model.fit(inputs={'train': train_data1, 'train': train_data2}, logs=True)
这仅在第二个数据集上训练模型并完全忽略第一个数据集。
现在我终于尝试使用此处文档的清单文件:https://docs.aws.amazon.com/sagemaker/latest/dg/API_S3DataSource.html
(请参阅 "S3Uri" 部分下的清单文件格式)
文档说清单文件格式是 JSON,看起来像这个例子:
[
{"prefix": "s3://customer_bucket/some/prefix/"},
"relative/path/to/custdata-1",
"relative/path/custdata-2"
]
嗯,我不认为这是有效的 JSON 但我知道什么,我仍然试一试。
当我尝试这个时:
s3_train_data_manifest = 'https://s3.us-east-2.amazonaws.com/bucketpath/myfilename.manifest'
train_data_merged = sagemaker.session.s3_input(s3_train_data_manifest, distribution='FullyReplicated', content_type='text/plain', s3_data_type='ManifestFile')
data_channel_merged = {'train': train_data_merged}
bt_model.fit(inputs=data_channel_merged, logs=True)
我收到一条错误消息:
ValueError: Error training blazingtext-2018-10-17-XX-XX-XX-XXX: Failed Reason: ClientError: Data download failed:Unable to parse manifest at s3://mybucketpath/myfilename.manifest - invalid format
我尝试用大括号替换清单文件中的方括号...但我仍然觉得 JSON 文件格式似乎缺少文档未能正确描述的内容?
您当然可以匹配具有相同前缀的多个文件,因此只要您在 S3 存储桶中组织适合的文件,您的第一次尝试就可以成功。例如前缀:s3://mybucket/foo/
将匹配文件 s3://mybucket/foo/bar/data1.txt
和 s3://mybucket/foo/baz/data2.txt
但是,如果您的存储桶中有第三个名为 s3://mybucket/foo/qux/data3.txt
的文件,您 不想 匹配(但仍然匹配前两个),则没有使用单个前缀实现这一目标的方法。在这些情况下,清单会起作用。因此,在上面的示例中,清单只是:
[
{"prefix": "s3://mybucket/foo/"},
"bar/data1.txt",
"baz/data2.txt"
]
(是的,这是有效的 json - 它是一个数组,其第一个元素是一个具有名为 prefix
的属性的对象,所有后续元素都是字符串)。
请仔细检查您的清单(您实际上没有 post 所以我不能为您做)并确保它符合上述语法。
如果您仍然遇到问题,请在 AWS sagemaker 论坛上创建一个线程 - https://forums.aws.amazon.com/forum.jspa?forumID=285 完成后我们可以设置一个 PM 来尝试弄清这个问题(永远不会 post 您在 public 论坛(例如 Whosebug 甚至 AWS 论坛)中的 AWS 帐户 ID)。