我有一个用 CDK (TypeScript) 创建的状态机。在这个状态机中,我有一个地图状态,其中我使用 SageMaker 运行多个 ML 模型训练,数量取决于上一步的输出,我们有 2-5 个数据集。我正在努力根据上一步的输出动态设置训练作业名称。如果我使用静态名称,即使只有 1 次训练,我也无法多次运行状态机,因为训练作业已经存在。
这是我用 CDK 尝试的
const training = new tasks.SageMakerCreateTrainingJob(
this.stack,
"SageMaker training job",
{
trainingJobName: "$.trainingJobName", // or static name like DemoTrainingJob
...
InputDataConfig: [
{
channelName: "train",
dataSource: {
s3DataSource: {
s3Location: tasks.S3Location.fromJsonExpression("$.input"),
...
hyperparameters: {
"max_depth.$": "$.hyperparameters.max_depth",
s3DataSource 和超参数仅供参考。然后,上一步输出如下所示的 trainingJobName(TaskStateEntered 中的数据用于训练作业)。
"name": "SageMaker training job",
"input": {
"output": "s3://my-bucket/outputx",
"input": "s3://my-bucket/inputx.csv",
"hyperparameters": {
"max_depth": "5"
},
"trainingJobName": "some-dynamic-name-YYYYMMDDHHiiSS"
},
"inputDetails": {
"truncated": false
}
}
但作为 SageMaker 培训 (TaskScheduled) 的输入,我看到了
"resourceType": "sagemaker",
"resource": "createTrainingJob",
"region": "eu-west-1",
"parameters": {
"TrainingJobName": "$.trainingJobName",
"RoleArn": ...
并且 TrainingJobName 不是从输入中插入的。 S3 数据被正确插入(尽管表达方式不同)和超参数值。作业自然会失败,因为 $.trainingJobName 不是有效的训练作业名称。如果我之前使用过 Static,它也会失败,但这不行,因为它会阻止多次使用状态机。
我见过这个 C11 6.3.2.3p7 其中 TrainingJob 从 Lambda 启动,其中可以轻松设置动态训练作业名称,但这也应该可以在状态机中实现。
答案 0 :(得分:0)
必须按照以下方式设置:
trainingJobName: sfn.JsonPath.stringAt("$.trainingJobName")
或将 $.trainingJobName 替换为您的变量路径。