Amazon Web Services ブログ

Amazon SageMaker の自動モデルチューニングで、トレーニングジョブの早期停止がサポートされるようになりました

2018 年 6 月、Amazon SageMaker 自動モデルチューニングを開始しました。このモデルは、Machine Learning モデルをトレーニングする高性能ハイパーパラメータを自動的に検出する機能です。トレーニング中に学習されたモデルパラメータとは異なり、学習プロセスが開始される前にハイパーパラメータが設定されます。ハイパーパラメータの典型的な使用例としては、確率勾配法の確率を学習する場合があります。デフォルトのハイパーパラメータを使用しても、必ずしも最良のモデルパフォーマンスが得られるわけではなく、高性能ハイパーパラメータを見つける作業は、些細で時間がかかります。自動モデルチューニングを使用すると、Amazon SageMaker は自動的に高性能ハイパーパラメータを見つけ、モデルをトレーニングして、目標メトリクスを最大化します。

構成できるハイパーパラメータの数は、探索中のハイパーパラメータ数の指数関数にあたります。この検索スペースを単純に探索するには、多数のトレーニングジョブが必要となるため、コストが高くなります。この問題を克服するために、Amazon SageMaker はベイズ最適化を使用します。これは、少数のトレーニングジョブに基づいて、異なるハイパーパラメータのパフォーマンスを効率的にモデル化する戦略です。しかし、このアルゴリズムは、トレーニングの終わりには、以前の構成よりも著しく悪化することが判明したハイパーパラメータ構成を探索することがあります。

今日では、早期停止機能を自動モデルチューニングに追加しています。チューニングジョブを起動したときに早期停止することで、Amazon SageMaker は各候補モデルのトレーニング反復(「エポック」)ごとに目標メトリクスを追跡します。Amazon SageMaker は、これまでチューニングジョブで評価されていた以前の最良モデルより、各候補がどれだけ優れているかを評価します。早期停止により、価値のないモデルはすべての反復を完了する前に終了するため、時間を節約し、コストを最大 28 %削減します(アルゴリズムとデータセットによって異なります)。例えば、このブログ記事では Amazon SageMaker を使用した画像分類アルゴリズムによる早期停止を使用して、時間とコストを 23 %まで削減する方法を示します。

エポックごとに目標メトリクスを発信する場合、サポートされている Amazon SageMaker アルゴリズムの組み込みと独自のアルゴリズムを使用して、早期停止することができます。

早期停止を使用する画像分類モデルのチューニング

早期停止の活用方法を示すために、画像分類アルゴリズムの組み込みを使用して画像分類器を構築し、Caltech-256 データセットに対してモデルを調整します。2 つのハイパーパラメータチューニングジョブを実行します。片方は自動早期停止を使わず、もう一方は早期停止を有効にして、他の構成はすべて同じままです。次に、2 つのハイパーパラメータチューニングジョブの結果を終わり頃に比較します。完全なサンプルノートブックはこちらから参照できます。

早期停止なしで、ハイパーパラメータチューニングジョブを開始し起動する

ノートブックインスタンスを作成し、データセットを準備し、Amazon S3 にプッシュする手順は省略します。サンプルノートブックがこれらのプロセスを含んでいるため、ここでは説明しません。代わりに、ハイパーパラメータチューニングジョブを開始するところから始めます。

チューニングジョブを作成するには、最初に組み込み画像分類アルゴリズム用のトレーニング推定器 (Estimator) を作成し、チューニングする予定のものを除いて、このアルゴリズムのすべてのハイパーパラメータの値を指定する必要があります。組み込み画像分類アルゴリズムのハイパーパラメータについての詳細は、こちらの文書 を参照してください。

s3_train_data = 's3://{}/{}/'.format(bucket, s3_train_key)
s3_validation_data = 's3://{}/{}/'.format(bucket, s3_validation_key)

s3_input_train = sagemaker.s3_input(s3_data=s3_train_data, content_type='application/x-recordio')
s3_input_validation = sagemaker.s3_input(s3_data=s3_validation_data, content_type='application/x-recordio')

s3_output_key = "image-classification-full-training/output"
s3_output = 's3://{}/{}/'.format(bucket, s3_output_key)

sess = sagemaker.Session()
imageclassification = sagemaker.estimator.Estimator(training_image,
                                                    role,
                                                    train_instance_count=1,
                                                    train_instance_type='ml.p3.2xlarge',
                                                    output_path=s3_output,
                                                    sagemaker_session=sess)

imageclassification.set_hyperparameters(num_layers=18,
                                        image_shape='3,224,224',
                                        num_classes=257,
                                        epochs=10,
                                        top_k='2',
                                        num_training_samples=15420, 
                                        precision_dtype='float32',
                                        augmentation_type='crop')

これで、推定子を使ってハイパーパラメータチューニングジョブを作成できます。調整したいハイパーパラメータの検索範囲と、実行したいトレーニングジョブの合計数を指定します。

画像分類アルゴリズムのチューニングガイドによれば、モデルの品質に最大の影響を及ぼす 3 つのハイパーパラメータ、つまり目標メトリクスを選択しました。ハイパーパラメータの完全なリストについては、ドキュメントに記載されています。こちらは、3 つのハイパーパラメータです。

  • learning_rate: トレーニングアルゴリズムがモデルを最適化する速度を制御します。
  • mini_batch_size: 1 つの勾配更新に使用されるデータポイントの数を制御します。
  • optimizer: ‘sgd’、’adam’、’rmsprop’、’nag’ の中から選択します。

この場合、Amazon SageMaker の組み込みアルゴリズムの 1 つを使用しているため、目標メトリックの正規表現を指定する必要はありません。

まず、早期停止せずにハイパーパラメータチューニングジョブを起動します。デフォルトではオフになっています。

from time import gmtime, strftime 
from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter, HyperparameterTuner

tuning_job_name = "imageclassif-job-{}".format(strftime("%d-%H-%M-%S", gmtime()))

hyperparameter_ranges = {'learning_rate': ContinuousParameter(0.00001, 1.0),
                         'mini_batch_size': IntegerParameter(16, 64),
                         'optimizer': CategoricalParameter(['sgd', 'adam', 'rmsprop', 'nag'])}

objective_metric_name = 'validation:accuracy'

tuner = HyperparameterTuner(imageclassification,
                            objective_metric_name,
                            hyperparameter_ranges,
                            objective_type='Maximize',
                            max_jobs=20,
                            max_parallel_jobs=2)

tuner.fit({'train': s3_input_train, 'validation': s3_input_validation},
          job_name=tuning_job_name, include_cls_metadata=False)
tuner.wait()

チューニングジョブが完了したら、Amazon SageMaker Python SDK の HyperparameterTuningJobAnalytics を使用してメトリクスの表をインポートできます。

tuner_metrics = sagemaker.HyperparameterTuningJobAnalytics(tuning_job_name)
tuner_metrics.dataframe().sort_values(['FinalObjectiveValue'], ascending=False).head(5)

次の表は、実行されたトレーニングジョブの上位 5 つを示しています。ノートブックを実行すると、すべての結果を見ることができます。この表から、このハイパーパラメータチューニングジョブのベストモデルは 0.356 の検証精度を持つことがわかります。ノートブックとは異なり、Amazon SageMaker コンソールがスクリーンショットを提供し、トレーニング時間とジョブの状況を確認します。その後、トレーニングジョブの早期停止が有効になっているときに、チューニング結果と比較します。

Amazon SageMaker コンソールの次のスクリーンショットでは、トレーニングの合計時間が 2 時間 48 分であることがわかります。トレーニングの合計時間は、すべてのトレーニングジョブの合計時間として定義されます。したがって、ハイパーパラメータチューニングジョブの総コストを反映します。トレーニングジョブが並列化されたおかげで、ハイパーパラメータチューニングジョブが完了するまでに 1 時間 53 分かかりました。また、トレーニングジョブのステータスカウンターに表示されているように、20件 のトレーニングジョブがすべて正常に完了しています。

早期停止するハイパーパラメータチューニングジョブを開始して起動する

次に、同じ設定で別のハイパーパラメータチューニングジョブを起動します。ただし、今回はトレーニングジョブの早期停止を有効にします。具体的には、チューニングジョブの設定で、追加フィールド ‘early_stopping_type’を ‘Auto’ に設定します。トレーニングジョブを早期停止すると、トレーニングジョブにエポックワイズ目標メトリクス、好ましくは検証メトリクスを発行することが求められます。この例では、組み込み画像分類アルゴリズムがエポックごとに ‘validation:accuracy’ メトリクスをすでに発行しているので、そのまま ‘validation:accuracy’ を目標メトリクスとして使用できます。

tuning_job_name_es = "imageclassif-job-{}-es".format(strftime("%d-%H-%M-%S", gmtime()))

tuner_es = HyperparameterTuner(imageclassification,
                               objective_metric_name,
                               hyperparameter_ranges,
                               objective_type='Maximize',
                               max_jobs=20,
                               max_parallel_jobs=2,
                               early_stopping_type='Auto')

tuner_es.fit({'train': s3_input_train, 'validation': s3_input_validation},
             job_name=tuning_job_name_es, include_cls_metadata=False)
tuner_es.wait()

また、トレーニングジョブの早期停止タイプ自動(デフォルトはオフ)に設定して、コンソールから早期停止してチューニングジョブを起動することもできます。

ハイパーパラメータチューニングジョブが終了した後、もう一度、実行中のトレーニングジョブから上位 5 つを確認することができます。

tuner_metrics_es = sagemaker.HyperparameterTuningJobAnalytics(tuning_job_name_es)
tuner_metrics_es.dataframe().sort_values(['FinalObjectiveValue'], ascending=False).head(5)

今回は、トレーニングジョブの早期停止を有効にしているため、最適なハイパーパラメータトレーニングジョブの検証精度が 0.353 でした。早期停止しなかった設定に非常に近い数値です。次のスクリーンショットに示すように、コンソールからもう一度トレーニングの合計時間とトレーニングジョブのステータスを確認できます。

 

今回は、トレーニングジョブを早期停止した場合、トレーニングの合計時間は 2 時間 10 分で、早期停止しない場合より 38 分(23 %)短いです。したがって、コストも 23 %も削減されます。ハイパーパラメータチューニングジョブを完了するまで 1 時間 38 分かかります。以前のハイパーパラメータチューニングジョブよりも 15 分ほど速くなりました。一方、次のリストに示すように、早期停止によって 6 件のトレーニングジョブが停止されます。

df = tuner_metrics_es.dataframe
df[df.TrainingJobStatus == 'Stopped']

停止したトレーニングジョブはすべて、検証精度が非常に低く、通常完了したジョブよりもはるかに短時間で実行されることが明らかになりました。

結論

要約すると、Amazon SageMaker のハイパーパラメータチューニングジョブを高速化するために、トレーニングジョブを早期停止する方法をこのブログ記事で実証しました。各トレーニングジョブのトレーニング時間が長くなるにつれて、トレーニングジョブの早期停止による利点がより重要になることに注目してください。しかし、インフラストラクチャのオーバーヘッドの影響で、より小さなトレーニングジョブに関してはそれほど利点がありません。例えば、私たちの実験では、トレーニングジョブが 4 分以上続いたとき、トレーニングジョブの早期停止の効果がさらに著しくなることが示されています。

自動モデルチューニングのトレーニングジョブ早期停止は、現在 Amazon SageMaker が利用可能なすべての AWS リージョンで利用可能になりました。Amazon SageMaker 自動モデルチューニングの詳細は、Amazon SageMaker 文書を参照してください。


著者について

Huibin Shen は Amazon AI のアプライドサイエンティストです。彼は、Amazon SageMaker の自動モデルチューニング機能を発表したチームの一員です。

 

 

 

 

Fan Li は Amazon SageMaker の製品マネージャーです。彼は社交ダンスが趣味でしたが、現在では 8 歳の息子が好きなものは何でも好きです。

 

 

 

 

Miroslav Miladinovic は Amazon SageMaker のソフトウェア開発マネージャーです。