Amazon Web Services ブログ
Amazon SageMaker Experiments – 機械学習モデルの整理、追跡、比較、評価
2019年12月3日、機械学習(ML)実験とモデルバージョンの整理、追跡、比較、評価を可能にする Amazon SageMaker の新機能である、Amazon SageMaker Experiments を発表できて非常にうれしく思います。
機械学習では非常に多くの反復プロセスを含みます。1つのプロジェクトの過程で、データサイエンティストと 機械学習エンジニアは、最大限の精度を求めて数千の異なるモデルを定期的に学習を行います。実際、アルゴリズム、データセット、および学習パラメーター(別名ハイパーパラメーター)の組み合わせの数は無限に存在します。それはまさに「干し草の山の中にある1本の針を探す」ということわざのように無駄骨を折る苦労を伴います。
Automatic Model Tuning や Amazon SageMaker Autopilot などのツールを使うことで、機械学習における多数の組み合わせを自動的に探索することができ、高性能なモデルを素速く見つけ出すことができます。しかし一方でこれらのツールにより、時間の経過とともに学習ジョブが爆発的に増えて、数十万の学習ジョブを効率的に処理することがほぼ不可能になってしまうという、ML チームにとって新たな困難を生み出すことになってしまいます。
もちろん、これはオーダーメイドツールを構築、管理、およびスケーリングすることで解決できます。しかしそれでは、実際の機械学習に必要な貴重な時間とリソースを奪ってしまうことになってしまい、私たちは、お客様が機械学習に集中できるよう支援するという精神から、この問題を未解決のままにすることはできません。
Amazon SageMaker Experiments の紹介
最初に、主要な概念を定義します。
- Trial(トライアル) は、単一のトレーニングジョブを含む学習ステップの集合です。通常、トレーニングの手順には前処理、学習、モデル評価などが含まれます。また、Trial は入力(アルゴリズム、パラメーター、データセットなど)および出力(モデル、チェックポイント、メトリックなど)のメタデータにより強化されます。
- Experiment(実験)とは、単に Trial の集合であり、関連する学習ジョブのグループです。
SageMaker Experiments は、できるだけ簡単に Experiment を作成し、それらに Trial を追加し、Trial と Experiment 全体で分析を実行することをゴールとしています。この目的のために、ロギングおよび分析 API を含む新しい Python SDK を導入します。
SageMaker または SageMaker Autopilot でトレーニングジョブを実行すると、追加のパラメーターを Estimator
に渡すだけで、この Trial をアタッチする Experiment の名前を定義できます。すべての入力と出力は自動的に記録されます。
ひとたび学習ジョブを実行すると、SageMaker Experiments SDK を使用して、データ分析でよく使われる pandas
データフレーム形式で、Experiment データと Trial データを読み込むことができます。pandas
は、機械学習を実行する人にとってのスイスアーミーナイフのようなもので、必要な分析を行うことができます。matplotlib
を使用してクールな視覚化を構築し、さらに一歩先へ進んでいただくことで、大量の学習ジョブを扱う準備が整います。
ご想像のとおり、SageMaker Experiments は Amazon SageMaker Studio にうまく統合されています。複雑なクエリを実行して、過去の Trial をすばやく見つけることができます。リアルタイムモデルのリーダーボードとメトリックチャートを視覚化することもできます。
ここで簡単なデモを見てみましょう。
Amazon SageMaker Experiments によるトレーニング情報のロギング
シンプルな2層の畳み込みニューラルネットワーク(CNN)を使用して、 MNIST データセットの画像を分類する PyTorch スクリプトから始めましょう。SageMaker で単一の学習ジョブを実行したい場合、PyTorch Estimator を次のように作成します。
estimator = PyTorch(
entry_point='mnist.py',
role=role,
sagemaker_session=sess,
framework_version='1.1.0',
train_instance_count=1,
train_instance_type='ml.p3.2xlarge')
estimator.fit(inputs={'training': inputs})
上記の代わりに、同じスクリプトの複数のバージョンを実行し、ハイパーパラメーターの1つ(2つの畳み込み層で使用される畳み込みフィルターの数、別名隠れチャネルの数)のみを変更して、モデルの精度への影響を測定するとします。もちろん、これらのジョブを実行したり、トレーニングログを取得したり、ファンシーなテキストフィルタリングでメトリックを抽出したりできます。はたまた、SageMaker Experiments を使用することもできます!
SageMaker Experiment の実行に必要ものは、次の通りです。
- Experiment を設定
- トラッカーを使用して Experiment のメタデータを記録
- 実行するトレーニングジョブごとに Trial を作成
- 各トレーニングジョブを実行し、Experiment 名と Trial 名のパラメーターを渡します。
まず最初に、Experiment の定義しましょう。
from smexperiments.experiment import Experiment
mnist_experiment = Experiment.create(
experiment_name="mnist-hand-written-digits-classification",
description="Classification of mnist hand-written digits",
sagemaker_boto_client=sm)
次に、データセットの場所やそ正規化したパラメータなど、追跡したいものをいくつか追加します。
from smexperiments.tracker import Tracker
with Tracker.create(display_name="Preprocessing", sagemaker_boto_client=sm) as tracker:
tracker.log_input(name="mnist-dataset", media_type="s3/uri", value=inputs)
tracker.log_parameters({
"normalization_mean": 0.1307,
"normalization_std": 0.3081,
})
それでは、いくつかのジョブを実行してみましょう。試したいさまざまな値をループして、各トレーニングジョブの新しい Trial を作成し、トラッカー情報を追加します。
for i, num_hidden_channel in enumerate([2, 5, 10, 20, 32]):
trial_name = f"cnn-training-job-{num_hidden_channel}-hidden-channels-{int(time.time())}"
cnn_trial = Trial.create(
trial_name=trial_name,
experiment_name=mnist_experiment.experiment_name,
sagemaker_boto_client=sm,
)
cnn_trial.add_trial_component(tracker.trial_component)
次に、estimator
を構成し、関心のあるハイパーパラメーターの値を渡し、他のパラメーターはそのままにします。また、学習ログからメトリックを抽出するために正規表現を渡します。これらはすべて Trial に保存されてプッシュされます(上記で渡されたもの、またはデフォルトのもの、すべてのパラメーターが保存されます)。
estimator = PyTorch(
entry_point='mnist.py',
role=role,
sagemaker_session=sess,
framework_version='1.1.0',
train_instance_count=1,
train_instance_type='ml.p3.2xlarge',
hyperparameters={
'hidden_channels': num_hidden_channels
},
metric_definitions=[
{'Name':'train:loss', 'Regex':'Train Loss: (.*?);'},
{'Name':'test:loss', 'Regex':'Test Average loss: (.*?),'},
{'Name':'test:accuracy', 'Regex':'Test Accuracy: (.*?)%;'}
]
)
最後に、トレーニングジョブを実行し、それを Experiment と Trial に関連付けます。
cnn_training_job_name = "cnn-training-job-{}".format(int(time.time()))
estimator.fit(
inputs={'training': inputs},
job_name=cnn_training_job_name,
experiment_config={
"ExperimentName": mnist_experiment.experiment_name,
"TrialName": cnn_trial.trial_name,
"TrialComponentDisplayName": "Training",
}
)
# end of loop
すべてのジョブが完了したら、分析を実行できます。私たちがどのように実行したかを見てみましょう。
Amazon SageMaker Experiments による分析
Experiment に関するすべての情報は、 Pandas DataFrame
に 簡単にエクスポートできます。
from sagemaker.analytics import ExperimentAnalytics
trial_component_analytics = ExperimentAnalytics(
sagemaker_session=sess,
experiment_name=mnist_experiment.experiment_name
)
analytic_table = trial_component_analytics.dataframe()
ドリルダウンする場合は、追加のパラメーターを指定できます。
例:
trial_component_analytics = ExperimentAnalytics(
sagemaker_session=sess,
experiment_name=mnist_experiment.experiment_name,
sort_by="metrics.test:accuracy.max",
sort_order="Descending",
metric_names=['test:accuracy'],
parameter_names=['hidden_channels', 'epochs', 'dropout', 'optimizer']
)
analytic_table = trial_component_analytics.dataframe()
これにより、テストの精度を下げて試行を並べ替え、各試行のハイパーパラメーターの一部のみを表示する DataFrame
が構築されます。
for col in analytic_table.columns:
print(col)
TrialComponentName
DisplayName
SourceArn
dropout
epochs
hidden_channels
optimizer
test:accuracy - Min
test:accuracy - Max
test:accuracy - Avg
test:accuracy - StdDev
test:accuracy - Last
test:accuracy - Count
ここから先は、あなたの想像力にお任せします。Pandas はデータ分析のスイスアーミーナイフであり、あらゆる方法で試行と実験を比較できます。
最後になりましたが、Amazon SageMaker Studio と統合したおかげで、事前に定義されたウィジェットを使用して、これらすべての情報をリアルタイムで視覚化できるようになりました。Amazon SageMaker Studio の詳細については、このブログ投稿をご覧ください。
今すぐご利用可能いただけます!
ここでは、Amazon SageMaker Experiments でできることのほんの一部をご紹介しましたが、この新機能を使うことで、毎日対処しなければならない膨大な数のジョブの扱いを少しでも楽にできれば幸いです。
このサービスは、Amazon SageMaker が 利用可能なすべてのAWS リージョンで現在利用可能です。お試しいただき、Amazon SageMaker の AWS フォーラム、または通常の AWS へのご連絡先からフィードバックをお寄せください。
− Julian