この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
おはようございます、もきゅりんです。
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 どんどん便利になっていきますね。
何か恩恵を賜りたい今日この頃です。
以上です。
どなたかのお役に立てば幸いです。