如何将动态训练作业名称添加到在 CDK 描述的 AWS StateMachine 中执行的 SageMaker 训练作业?

时间:2021-01-26 09:30:43

标签: typescript amazon-web-services amazon-sagemaker aws-cdk aws-step-functions

我有一个用 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 启动,其中可以轻松设置动态训练作业名称,但这也应该可以在状态机中实现。

1 个答案:

答案 0 :(得分:0)

必须按照以下方式设置:

trainingJobName: sfn.JsonPath.stringAt("$.trainingJobName")

或将 $.trainingJobName 替换为您的变量路径。