[アップデート]Step FunctionsでSageMakerの前処理ができるようになりました

2020.08.05

はじめに

おはようございます、もきゅりんです。

AWS Step Functions adds support for Amazon SageMaker Processing

これまでも Step Functions と SageMaker を利用して学習と推論を行う、ハイパーパラメータのチューニングを行って推論を行うこと、ができたようですが、前処理もワークフロー内で実行可能になりました。

機械学習における一連のタスクフローを Step Functions を通して実行できるようになった、わーい! ということですね。

本日 (2020/08/05) から東京リージョン (ap-northeast-1) でも使用できます。

sample project をやってみる

コンソールから Step Functions -> State machines -> Create state machine から

新しく追加されたであろうプロジェクトを選択。

とりあえず次へ。

画像の通り、

CloudFormation でステートマシン、ラムダ、S3バケット、(関連するIAMロールも)作るよーと聞かれます。

いいよーとデプロイします。

上記リソースを作成するのに10分程度かかります。

と書かれていますが、3分程度で完了しました。

構築が完了すると、New execution ページが立ち上がるので、 execution name に適当な名前を付けて実行します。 (特に設定しなくても実行に支障はないです)

完了するまでにステートマシンの中身を大雑把に見ていくと

Generate dataset でデモデータおよび前処理コードを作成して、S3バケットにアップします。

{
  "StartAt": "Generate dataset",
  "States": {
    "Generate dataset": {
      "Resource": "arn:aws:lambda:sa-east-1:1234567890:function:FeatureTransform-LambaForDataGeneration-17M8LX7IO9LUW",
      "Type": "Task",
      "Next": "Standardization: x' = (x - x̄) / σ"
    },

Standardization で、今回のアップデートのミソとなる前処理APIを指定して各種パラメータにて対象のデータ、実行環境、前処理のためのコードなどを設定します。

その処理されたデータを使って、モデルを学習させます。

    "Standardization: x' = (x - x̄) / σ": {
      "Resource": "arn:aws:states:::sagemaker:createProcessingJob.sync",
      "Parameters": {
        "ProcessingResources": {
          "ClusterConfig": {
            "InstanceCount": 1,
            "InstanceType": "ml.m5.xlarge",
            "VolumeSizeInGB": 10
          }
        },
        "ProcessingInputs": [
            {
                "InputName": "input-1",
                "S3Input": {
                    "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/input/raw.csv",
                    "LocalPath": "/opt/ml/processing/input",
                    "S3DataType": "S3Prefix",
                    "S3InputMode": "File",
                    "S3DataDistributionType": "FullyReplicated",
                    "S3CompressionType": "None"
                }
            },
            {
                "InputName": "code",
                "S3Input": {
                    "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/code/transform.py",
                    "LocalPath": "/opt/ml/processing/input/code",
                    "S3DataType": "S3Prefix",
                    "S3InputMode": "File",
                    "S3DataDistributionType": "FullyReplicated",
                    "S3CompressionType": "None"
                }
            }
        ],
        "ProcessingOutputConfig": {
            "Outputs": [
                {
                    "OutputName": "train_data",
                    "S3Output": {
                        "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/train",
                        "LocalPath": "/opt/ml/processing/output/train",
                        "S3UploadMode": "EndOfJob"
                    }
                }
            ]
        },
        "AppSpecification": {
            "ImageUri": "737474898029.dkr.ecr.sa-east-1.amazonaws.com/sagemaker-scikit-learn:0.20.0-cpu-py3",
            "ContainerEntrypoint": [
                "python3",
                "/opt/ml/processing/input/code/transform.py"
            ]
        },
        "StoppingCondition": {
            "MaxRuntimeInSeconds": 300
        },
        "RoleArn": "arn:aws:iam::1234567890:role/SageMakerAPIExecutionRole-AIDACKCEVSQ6C2EXAMPLE",
        "ProcessingJobName.$": "$$.Execution.Name"
      },
      "Type": "Task",
      "Next": "Train model (XGBoost)"
    },

Train model(XGBoost) にて学習APIを指定して、前処理されたデータ、実行環境、ハイパーパラメータなどを指定してモデルを学習させてS3バケットに格納します。

    "Train model (XGBoost)": {
      "Resource": "arn:aws:states:::sagemaker:createTrainingJob.sync",
      "Parameters": {
        "AlgorithmSpecification": {
          "TrainingImage": "855470959533.dkr.ecr.sa-east-1.amazonaws.com/xgboost:latest",
          "TrainingInputMode": "File"
        },
        "OutputDataConfig": {
          "S3OutputPath": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz/models"
        },
        "StoppingCondition": {
          "MaxRuntimeInSeconds": 86400
        },
        "ResourceConfig": {
          "InstanceCount": 1,
          "InstanceType": "ml.m5.xlarge",
          "VolumeSizeInGB": 30
        },
        "RoleArn": "arn:aws:iam::1234567890:role/SageMakerAPIExecutionRole-AIDACKCEVSQ6C2EXAMPLE",
        "InputDataConfig": [
          {
            "DataSource": {
              "S3DataSource": {
                "S3DataDistributionType": "ShardedByS3Key",
                "S3DataType": "S3Prefix",
                "S3Uri": "s3://featuretransform-bucketforcodeanddata-1jn1le6gadwfz"
              }
            },
            "ChannelName": "train",
            "ContentType": "text/csv"
          }
        ],
        "HyperParameters": {
          "objective": "reg:logistic",
          "eval_metric": "rmse",
          "num_round": "5"
        },
        "TrainingJobName.$": "$$.Execution.Name"
      },
      "Type": "Task",
      "End": true
    }
  }
}

完了しました。

ステートマシンのイベント履歴から SageMaker のトレーニングジョブに飛べます。

そこから学習済みのモデルがS3にアップロードされているのが確認できました。

なお、参考までに下記ブログでは Step Functions Data Science SDK を使って、前処理を含めた、より汎用的な機械学習のワークフロー例を取り上げています。

Building machine learning workflows with Amazon SageMaker Processing jobs and AWS Step Functions

Step Functions どんどん便利になっていきますね。

何か恩恵を賜りたい今日この頃です。

以上です。

どなたかのお役に立てば幸いです。