[アップデート]Step FunctionsでSageMakerの前処理ができるようになりました
はじめに
おはようございます、もきゅりんです。
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 どんどん便利になっていきますね。
何か恩恵を賜りたい今日この頃です。
以上です。
どなたかのお役に立てば幸いです。