首页 > 解决方案 > 如何将动态训练作业名称添加到在 CDK 描述的 AWS StateMachine 中执行的 SageMaker 训练作业?

问题描述

我有一个用 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 不是有效的培训作业名称。如果我以前使用过静态也会失败,但这不行,因为它会阻止多次使用状态机。

我已经看到了这个 https://github.com/aws-samples/amazon-sagemaker-cdk-examples/blob/master/cron-train/lambda-handler.py ,其中 TrainingJob 是从 Lambda 开始的,其中动态训练作业名称可以是很容易设置,但这在状态机中也应该是可能的。

标签: typescriptamazon-web-servicesamazon-sagemakeraws-cdkaws-step-functions

解决方案


必须按以下方式设置:

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

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


推荐阅读