SageMaker で機械学習モデルのハイパーパラメータをチューニングする - AWS Step Functions

SageMaker で機械学習モデルのハイパーパラメータをチューニングする

このサンプルプロジェクトでは、SageMaker を使用して機械学習モデルのハイパーパラメータをチューニングし、テストデータセットをバッチ変換する方法のデモを行います。

このプロジェクトでは、Step Functions は Lambda 関数を使用して Amazon S3 バケットにテストデータセットをシードします。次に、[SageMaker service integration] (SageMaker サービス統合) を使用してハイパーパラメータチューニングジョブを作成します。次に、Lambda 関数を使用してデータパスの抽出、チューニングモデルの保存、モデル名の抽出を行い、バッチ変換ジョブを実行して SageMaker で推論を実行します。

SageMaker と Step Functions サービス統合の詳細については、以下を参照してください。

注記

このサンプルプロジェクトでは、料金が発生する場合があります。

AWS の新規ユーザーには、無料利用枠があります。この枠では、サービスを利用しても一定のレベル以下であれば無料です。AWS のコストと無料利用枠の詳細については、「SageMaker の料金」を参照してください。

ステップ 1: ステートマシンを作成する

  1. Step Functions コンソールを開き、[ステートマシンの作成] を選択します。

  2. 検索ボックスに Tune a machine learning model と入力し、返された検索結果から [機械学習モデルをチューニング] を選択します。

  3. [次へ] を選択して続行します。

  4. [デモの実行] を選択して読み取り専用ですぐにデプロイできるワークフローを作成するか、[その上に構築する] を選択して編集可能なステートマシン定義を作成し、構築した後にデプロイできます。

    このサンプルプロジェクトは、以下のリソースをデプロイします。

    • 3 つの AWS Lambda 関数

    • 1 つの Amazon Simple Storage Service (Amazon S3) バケット

    • AWS Step Functions ステートマシン

    • 関連 ‭AWS Identity and Access Management (IAM) ロール

    以下のイメージは、[機械学習モデルをチューニング] サンプルプロジェクトのワークフローグラフを示しています。

    [機械学習モデルをチューニング] サンプルプロジェクトのワークフローグラフ
  5. [テンプレートの使用] を選択して選択を続行します。

次のステップは、前の選択によって異なります。

  1. [デモの実行] – AWS CloudFormation で AWS アカウントにデプロイされたリソースを使用して読み取り専用プロジェクトを作成する前に、ステートマシンを確認できます。

    ステートマシン定義を表示し、準備ができたら、[デプロイと実行] を選択してプロジェクトをデプロイし、リソースを作成します。

    デプロイには、リソースとアクセス許可の作成に最大 10 分かかる場合があります。スタック ID リンクを使用して、AWS CloudFormation の進行状況をモニタリングできます。

    デプロイが完了すると、コンソールに新しいステートマシンが表示されます。

  2. [その上に構築する] – ワークフロー定義を確認して編集できます。カスタムワークフローの実行を試みる前に、サンプルプロジェクト内のプレースホルダーの値を設定する必要がある場合があります。

注記

アカウントにデプロイされたサービスには、Standard 料金が適用される場合があります。

ステップ 2: ステートマシンを実行する

  1. [ステートマシン] ページで、サンプルプロジェクトを選択します。

  2. サンプルプロジェクトページで、[実行を開始] を選択します。

  3. [実行を開始] ダイアログボックスで、以下の操作を行います。

    1. (オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。

      非 ASCII 名とログ記録

      Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字は Amazon CloudWatch では機能しないため、CloudWatch でメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。

    2. (オプション) [入力] ボックスに、入力値を JSON として入力します。デモを実行している場合は、このステップをスキップできます。

    3. [実行のスタート] を選択します。

    Step Functions コンソールから [実行の詳細] ページに移動し、[グラフビュー] で状態を選択して [ステップの詳細] ペインの関連情報を確認できます。

ステートマシンのコード例

このサンプルプロジェクトのステートマシンは、パラメータをそれらのリソースに直接渡すことによってSageMaker と AWS Lambda を統合し、トレーニングデータソースと出力に Amazon S3 バケットを使用します。

このステートマシンの例を参照して、Step Functions が Lambda と SageMaker をどのように制御するかを確認します。

‭AWS Step Functions‬ で他の ‭AWS のサービスを制御する方法の詳細については、「‭サービスと Step Functions の統合」を参照してください。

{ "StartAt": "Generate Training Dataset", "States": { "Generate Training Dataset": { "Resource": "arn:aws:lambda:us-west-2:012345678912:function:StepFunctionsSample-SageMa-LambdaForDataGeneration-1TF67BUE5A12U", "Type": "Task", "Next": "HyperparameterTuning (XGBoost)" }, "HyperparameterTuning (XGBoost)": { "Resource": "arn:aws:states:::sagemaker:createHyperParameterTuningJob.sync", "Parameters": { "HyperParameterTuningJobName.$": "$.body.jobName", "HyperParameterTuningJobConfig": { "Strategy": "Bayesian", "HyperParameterTuningJobObjective": { "Type": "Minimize", "MetricName": "validation:rmse" }, "ResourceLimits": { "MaxNumberOfTrainingJobs": 2, "MaxParallelTrainingJobs": 2 }, "ParameterRanges": { "ContinuousParameterRanges": [{ "Name": "alpha", "MinValue": "0", "MaxValue": "1000", "ScalingType": "Auto" }, { "Name": "gamma", "MinValue": "0", "MaxValue": "5", "ScalingType": "Auto" } ], "IntegerParameterRanges": [{ "Name": "max_delta_step", "MinValue": "0", "MaxValue": "10", "ScalingType": "Auto" }, { "Name": "max_depth", "MinValue": "0", "MaxValue": "10", "ScalingType": "Auto" } ] } }, "TrainingJobDefinition": { "AlgorithmSpecification": { "TrainingImage": "433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest", "TrainingInputMode": "File" }, "OutputDataConfig": { "S3OutputPath": "s3://amzn-s3-demo-bucket/models" }, "StoppingCondition": { "MaxRuntimeInSeconds": 86400 }, "ResourceConfig": { "InstanceCount": 1, "InstanceType": "ml.m4.xlarge", "VolumeSizeInGB": 30 }, "RoleArn": "arn:aws:iam::012345678912:role/StepFunctionsSample-SageM-SageMakerAPIExecutionRol-1MNH1VS5CGGOG", "InputDataConfig": [{ "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://amzn-s3-demo-bucket/csv/train.csv" } }, "ChannelName": "train", "ContentType": "text/csv" }, { "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://amzn-s3-demo-bucket/csv/validation.csv" } }, "ChannelName": "validation", "ContentType": "text/csv" }], "StaticHyperParameters": { "precision_dtype": "float32", "num_round": "2" } } }, "Type": "Task", "Next": "Extract Model Path" }, "Extract Model Path": { "Resource": "arn:aws:lambda:us-west-2:012345678912:function:StepFunctionsSample-SageM-LambdaToExtractModelPath-V0R37CVARUS9", "Type": "Task", "Next": "HyperparameterTuning - Save Model" }, "HyperparameterTuning - Save Model": { "Parameters": { "PrimaryContainer": { "Image": "433757028032.dkr.ecr.us-west-2.amazonaws.com/xgboost:latest", "Environment": {}, "ModelDataUrl.$": "$.body.modelDataUrl" }, "ExecutionRoleArn": "arn:aws:iam::012345678912:role/StepFunctionsSample-SageM-SageMakerAPIExecutionRol-1MNH1VS5CGGOG", "ModelName.$": "$.body.bestTrainingJobName" }, "Resource": "arn:aws:states:::sagemaker:createModel", "Type": "Task", "Next": "Extract Model Name" }, "Extract Model Name": { "Resource": "arn:aws:lambda:us-west-2:012345678912:function:StepFunctionsSample-SageM-LambdaToExtractModelName-8FUOB30SM5EM", "Type": "Task", "Next": "Batch transform" }, "Batch transform": { "Type": "Task", "Resource": "arn:aws:states:::sagemaker:createTransformJob.sync", "Parameters": { "ModelName.$": "$.body.jobName", "TransformInput": { "CompressionType": "None", "ContentType": "text/csv", "DataSource": { "S3DataSource": { "S3DataType": "S3Prefix", "S3Uri": "s3://amzn-s3-demo-bucket/csv/test.csv" } } }, "TransformOutput": { "S3OutputPath": "s3://amzn-s3-demo-bucket/output" }, "TransformResources": { "InstanceCount": 1, "InstanceType": "ml.m4.xlarge" }, "TransformJobName.$": "$.body.jobName" }, "End": true } } }

他の AWS のサービスで Step Functions を使用する時に IAM を設定する方法の情報については、Step Functions が統合サービスの IAM ポリシーを生成する方法 を参照してください。

IAM の例

サンプルプロジェクトで生成されたこれらの AWS Identity and Access Management (IAM) ポリシーの例には、ステートマシンおよび関連リソースを実行するために必要な最小特権が含まれています。IAM ポリシーで必要なあれらの許可のみを含めることをお勧めします。

次の IAM ポリシーはステートマシンに添付され、必要なリソースである SageMaker、Lambda、および Amazon S3 へのアクセス実行をステートマシンに許可します。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sagemaker:CreateHyperParameterTuningJob", "sagemaker:DescribeHyperParameterTuningJob", "sagemaker:StopHyperParameterTuningJob", "sagemaker:ListTags", "sagemaker:CreateModel", "sagemaker:CreateTransformJob", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-west-2:012345678912:function:StepFunctionsSample-SageMa-LambdaForDataGeneration-1TF67BUE5A12U", "arn:aws:lambda:us-west-2:012345678912:function:StepFunctionsSample-SageM-LambdaToExtractModelPath-V0R37CVARUS9", "arn:aws:lambda:us-west-2:012345678912:function:StepFunctionsSample-SageM-LambdaToExtractModelName-8FUOB30SM5EM" ], "Effect": "Allow" }, { "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:*:*:rule/StepFunctionsGetEventsForSageMakerTrainingJobsRule", "arn:aws:events:*:*:rule/StepFunctionsGetEventsForSageMakerTransformJobsRule", "arn:aws:events:*:*:rule/StepFunctionsGetEventsForSageMakerTuningJobsRule" ], "Effect": "Allow" } ] }

次の IAM ポリシーは、HyperparameterTuning 状態のTrainingJobDefinition フィールドおよび HyperparameterTuning フィールドで参照されます。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "cloudwatch:PutMetricData", "logs:CreateLogStream", "logs:PutLogEvents", "logs:CreateLogGroup", "logs:DescribeLogStreams", "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "sagemaker:DescribeHyperParameterTuningJob", "sagemaker:StopHyperParameterTuningJob", "sagemaker:ListTags" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Effect": "Allow" }, { "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket", "Effect": "Allow" } ] }

次の IAM ポリシー では、Amazon S3 バケットにサンプルデータをシードすることを Lambda 関数に許可します。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Effect": "Allow" } ] }

他の AWS のサービスで Step Functions を使用する時に IAM を設定する方法の情報については、「Step Functions が統合サービスの IAM ポリシーを生成する方法」を参照してください。