如何使用多个渠道训练SageMaker BlazingText模型

时间:2018-10-17 14:27:00

标签: amazon-web-services amazon-sagemaker

我有两个单独的标准化文本文件,我想在其上训练我的BlazingText模型。

我正在努力使其正常工作,并且文档没有帮助。

基本上,我需要弄清楚如何向sagemaker.estimator.Estimator.fit()方法提供多个文件或S3前缀作为“输入”参数。

我第一次尝试:

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在输入参数中寻找专门用于“训练”的键。

所以我尝试了:

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文件格式似乎缺少文档无法正确描述的内容?

1 个答案:

答案 0 :(得分:0)

您当然可以匹配多个具有相同前缀的文件,因此,只要您在S3存储桶中整理文件以适应需要,您的第一次尝试就可以奏效。例如前缀s3://mybucket/foo/将匹配文件s3://mybucket/foo/bar/data1.txts3://mybucket/foo/baz/data2.txt

但是,如果您的存储桶中有一个名为s3://mybucket/foo/qux/data3.txt的第三个文件,您不想 进行匹配(尽管仍然与前两个匹配),则无法实现有一个前缀。在这些情况下,清单将起作用。因此,在上面的示例中,清单将简单地是:

[
  {"prefix": "s3://mybucket/foo/"},
  "bar/data1.txt",
  "baz/data2.txt"
]

(是的,这是有效的json-这是一个数组,其第一个元素是一个对象,其对象名为prefix,所有后续元素都是字符串)。

请仔细检查您的清单(您实际上没有发布过清单,因此我不能为您做这件事),并确保其符合以上语法。

如果您仍然陷于困境,请在AWS sagemaker论坛-https://forums.aws.amazon.com/forum.jspa?forumID=285上打开一个话题,然后,我们可以设置PM来尝试解决此问题(切勿发布您的AWS账户在像StackOverflow这样的公共论坛中甚至在AWS论坛中都可以找到ID。