Amazon Web Services ブログ

新機能 – Amazon SageMaker Debugger を使用した機械学習トレーニングジョブのプロファイリング

今日は、皆さんに Amazon SageMaker Debugger が機械学習モデルのプロファイリングを実行できるようになったことをお知らせしたいと思います。これにより、ハードウェアリソースの使用率が原因で生じるトレーニング問題の特定と修正が極めて容易になります。

幅広いビジネス問題に対応する目覚ましいパフォーマンスにもかかわらず、機械学習 (ML) は今も謎めいたところがあるトピックです。物事の的確な実行は、サイエンス、職人技 (魔法と言う人もいます)、そして時には運を組み合わせた錬金術です。特に、モデルトレーニングは、結果がデータセット、アルゴリズムとそのパラメータ、そしてトレーニングを実行するインフラストラクチャの品質に応じて変化する複雑なプロセスです。

ML モデルがかつてない規模に増大し、ますます複雑になるにつれて (深層学習さん、あなたのことです) 拡大している問題のひとつに、モデルをトレーニングするために必要なインフラストラクチャの量があります。たとえば、一般公開されている COCO データセットでの BERT のトレーニングは、単一の p3dn.24xlarge インスタンスで実行すると、それに 8 個の NVIDIA V100 GPU が搭載されているにもかかわらず、6 時間を優に超える時間がかかります。自律走行車企業などのお客様には、はるかに大きなデータセットを扱い、オブジェクト検出モデルのトレーニングに数日間かけるお客様もおられます。

複雑なトレーニングジョブにこれだけの時間がかかると、何らかの不具合が生じてトレーニングが失敗に終わる可能性が非常に高くなり、時間を無駄にするだけでなく、大きないら立ちを感じる原因にもなります。調査を行い、根本的な原因をつきとめて修正を試み、それからトレーニングジョブを再度実行する間、重要な作業は後回しにしなくてはなりません。たいていの場合は、問題を突き止めるために、この手順をかなりの回数繰り返すことになります。

使用している ML フレームワーク、そして時にはそのバージョンによっては、既存のフレームワーク固有のツールを使用できるかどうかもわからず、多くの場合は、独自の特注ツールを構築して維持しなくてはならなくなります。これは、経験豊かなプラクティショナーでさえも大いに苦労する作業で、私のような普通のデベロッパーにとっては、気が遠くなるようなタスクでしかありません。

Amazon SageMaker Debugger のモデルプロファイリングのご紹介
去年の AWS re:Invent でローンチされた Amazon SageMaker Debugger は、ML トレーニングジョブで生じている複雑な問題を自動的に識別する Amazon SageMaker の機能です。これらの問題には、減少しない損失、および勾配爆発などが含まれます。

SageMaker Debugger がハードウェアリソースの使用率も監視できるようになった今、これからはトレーニングジョブをプロファイリングして、リソースの使用率とトレーニングスクリプトの ML オペレーションとの関連付けに役立てることができます。そうすることで、はるかに迅速にパフォーマンス問題を解決し、はるかに高速にトレーニングジョブを反復することができるようになります。

自動運転および運転者支援システムを構築する Intel 企業、Mobileye の ML アルゴリズムデベロッパーである Chaim Rand 氏にこの新しいプロファイリング機能を使用してもらう機会がありました。Rand 氏はこのように話しています。「Mobileye で開発する運転支援および自律走行車テクノロジーの多くは、車両、歩行者、スピードバンプ、および道路標識など、道路上のさまざまな物体を検出するためのディープニューラルネットワークモデルのトレーニングに頼っています。多くの場合、これらのモデルは、非常に大きなデータセットを使って、複数のマシン上で数日間かけてトレーニングされます。Mobileye では、ネットワーク、CPU、および GPU リソースの全体におけるデータの流れを分析し、パフォーマンス問題を特定するために、高度なパフォーマンスプロファイリング機能を持つツールキットが必要不可欠です。それを提供するのが SageMaker Debugger のプロファイリング機能です。この機能は、限られた専門家の領域であったパフォーマンスプロファイリングを容易にし、当社のアルゴリズムデベロッパーがトレーニングリソースを最大限に活かして、モデルのコンバージェンスを加速化し、コストを削減することを可能にしてくれます。

ローンチ時点で、SageMaker Debugger の新しいプロファイリング機能は、TensorFlow 2.x と PyTorch 1.x での利用が可能です。ユーザーは、Amazon SageMaker の対応する組み込みフレームワークを使ってトレーニングするだけです。分散型トレーニングは、追加設定なしでサポートされます。

SageMaker 推定器で単一のパラメータを設定することで、トレーニングに変更を加えることなく、以下のようなインフラストラクチャメトリクスとモデルメトリクスのコレクションを有効化できます。

  • CPU と GPU、
  • RAM と GPU RAM、
  • ネットワーク I/O、
  • ストレージ I/O (ローカルストレージとパイプモード)、
  • Python メトリクス、
  • データの読み込み時間、
  • CPU と GPU で実行されている ML 演算子に費やされた時間、
  • Horovod 向けの分散型トレーニングメトリクス、
  • およびその他多数。

さらに、前処理、トレーニングループ、および後処理などの異なるフェーズにどのくらいの時間が費やされたかを視覚化することもできます。必要に応じて、各トレーニングエポックだけでなく、トレーニングスクリプトの各関数をドリルダウンすることも可能です。

メトリクスはデフォルトで 500 ミリ秒ごとに収集されますが、この値は 100 ミリ秒、200 ミリ秒、1 秒、5 秒、および 1 分に設定できます。さらにきめ細かい分析には、トレーニングコードでプロファイリングを明示的に有効化または無効化して、特定箇所のメトリクスのみをキャプチャすることも可能です。

トレーニングジョブの実行中は、ML 向けのウェブベースの統合開発環境である Amazon SageMaker Studio でこれらのメトリクスを簡単に視覚化できます。皆さんのご想像どおり、すべてのデータは SageMaker Debugger API 経由でも利用でき、データを取得して独自のグラフを作成することが可能です。

トレーニングジョブと並行して実行される Amazon SageMaker Processing は、キャプチャされたデータを分析し、グラフを構築して、レポートを生成することによって、潜在的な問題に関する洞察を提供します。この分析は完全に管理されたインフラストラクチャに組み込まれたコンテナ内で実行されるため、ユーザーは何もする必要がありません。

それでは、PyTorch を使ったデモを実行してみましょう。このデモでは、CIFAR-10 データセットを使った ResNet-50 画像分類モデルトレーニングのプロファイリングを行います。

Amazon SageMaker Debugger を使用したトレーニングジョブのプロファイリング
トレーニングジョブのプロファイリングは、SageMaker 推定器にパラメータをひとつ追加するだけで有効にできます。トレーニングコードの行を変更する必要はありません。SageMaker Debugger は、デフォルトで組み込みのプロファイリングルールのセットを使用して、トレーニング中に発生する可能性がある GPU の低使用率などの望ましくない状態を探します。これらの状態を報告することに加えて、SageMaker DebuggerCloudWatch Events のイベントもトリガーします。たとえば、これらを使用して、非効率的なトレーニングジョブを自動的に停止する AWS Lambda 関数を実行できます。

最初に、500 ミリ秒ごとにデータをキャプチャするプロファイリング設定を作成します。ジョブの特定箇所だけをプロファイリングしたい場合は、オプションでトレーニングのステップ間隔を選択できます。

import sagemaker
from sagemaker.profiler import ProfilerConfig 
profiler_config = ProfilerConfig(profiling_interval_millis=500)

次に、この設定を PyTorch Estimator に渡して、4 個の NVIDIA V100 GPU が搭載された ml.p3.8xlarge インスタンスでトレーニングします。

from sagemaker.pytorch import PyTorch
estimator = PyTorch(
    role=sagemaker.get_execution_role(),
    instance_count=1,
    instance_type='ml.p3.8xlarge',
    entry_point='train_pt.py',
    framework_version='1.5.0',
    hyperparameters={"batch_size":512, "epochs":10},
    profiler_config=profiler_config)

その後、通常通りにトレーニングジョブを開始します。ジョブが実行されると、プロファイリングデータがキャプチャされ、S3 に保存されます。

path = estimator.latest_job_profiler_artifacts_path()
print(path)
s3://sagemaker-us-east-2-123456789012/pt-train-pt-2020-11-17-17-38-43-231/profiler-output

SageMaker SDK を使用することで、プロファイリングイベントを取得してカウントできます。

from smdebug.profiler.system_metrics_reader import S3SystemMetricsReader
system_metrics_reader = S3SystemMetricsReader(path)
system_metrics_reader.refresh_event_file_list()
last_timestamp = system_metrics_reader.get_timestamp_of_latest_available_file()
events = system_metrics_reader.get_events(0, last_timestamp)
print("Found", len(events), "recorded system metric events.Latest recorded event:", last_timestamp)
Found 411853 recorded system metric events.Latest recorded event: 1605620280000000

もちろん、これらのプロファイリングイベントを解析して分析したり、独自のグラフを構築したりすることもできますが、今回は、SageMaker Studio でこれらをほぼリアルタイムで視覚化しましょう。

トレーニングジョブが実行されている間に、SageMaker Studio でこのジョブを見つけて、[Open Debugger for insights] (Debugger を開いて洞察を表示する) を右クリックします。

SageMaker のスクリーンショット

クリックすると新しいタブが開くので、[Nodes] (ノード) パネルを選択します。このパネルには、トレーニングジョブの各インスタンスに関する詳細な統計情報が表示されます。私のトレーニングジョブの調子はどうでしょうか? 以下の画像をクリックして拡大表示してみてください。

SageMaker のスクリーンショット

どうやら、このジョブは順調に進んでいないようです。GPU の使用率と GPU メモリの使用率が 10% 前後で絶望的な横這い状態になっています。このジョブがマルチ GPU インスタンスを活用しきれていないのは間違いありません。CPU が対応できていないことが原因で、GPU が十分な速度でデータを受信していないのかもしれません。 システム使用率のヒートマップをチェックしてみましょう。

SageMaker のスクリーンショット

この CPU は昼寝しているようで、使用率は 20% をほとんど超えていません。このインスタンスが暇を持て余しているのは確かです。これを修正するためにできることはあるでしょうか?

[Overview] (概要) パネルに切り替えると、組み込みのプロファイリングルールの一部がトリガーされたことがわかります。

SageMaker のスクリーンショット

LowGPUUtilization が、上記のグラフで確認した内容を裏付けています。BatchSize の内容はとても興味深く、CPU で実行されているトレーニングスクリプトによって GPU に送信されるミニバッチのサイズを大きくすることが提案されています。これは、GPU メモリを埋めて、より多くの GPU コアを動作させ、トレーニングジョブのスピードを上げ、インフラストラクチャの使用状況を改善するために必ず役に立つはずです。

私は、この時点で非効率なトレーニングジョブを停止して、より大きなバッチサイズでジョブを再開するべきなのですが、今回は、トレーニングジョブと並行して実行されている SageMaker Processing ジョブによって生成されるレポートを表示するために、ジョブをこのまま完了させます。

トレーニングジョブが完了したら、[Overview] (概要) パネルでその要約を確認できます。

SageMaker のスクリーンショット

[Download report] (レポートをダウンロードする) ボタンをクリックすると、トレーニングジョブの異なるフェーズ間における比率、またはフォワードパスとバックワードパス間における比率などの追加のメトリクスが含まれた極めて詳細なレポートを取得できます。

SageMaker のスクリーンショット

最も時間がかかる CPU と GPU 演算子に関する情報も見ることができます。これは、コードを最適化したい場合には非常に重要です。たとえば、以下のグラフからは、バックワードパスの畳み込み演算子がトレーニングジョブの中で最も時間のかかる GPU オペレーションであることがわかります。

SageMaker のスクリーンショット

このレポートからは、さらに多くの情報を得ることができます (ルールの要約、トレーニングループの分析など)。グラフの構築方法、および独自のニーズに合わせてグラフをカスタマイズする方法を理解するためのコンパニオンノートブックもご利用いただけます。

使用の開始
今回のご紹介したのは Amazon SageMaker Debugger の数ある機能のほんの一部にすぎず、この他にもモデルのプロファイリング情報の収集、分析、および視覚化を容易にするたくさんの機能があります。Amazon SageMaker Debugger は、本日から Amazon SageMaker が利用できるすべてのリージョンでご利用いただけます。組み込みのプロファイリングルールの実行に使用されたコンピューティングに対する料金は発生しません。

Github にサンプルノートブックをご用意しましたので、ぜひお試しいただき、感想をお聞かせください。AWS では、お客様からのフィードバックをお待ちしております。フィードバックは、通常の AWS サポート担当者、または SageMaker の AWS フォーラム経由でお送りください。

– Julien