TorchNeuron を使用した AWS Trainium 上の PyTorch モデルのプロファイリング
torch.profiler と Neuron Explorer を活用し、AWS Trainium ハードウェアでの ML 推論におけるパフォーマンスボトルネックを特定する方法を学びます。
英語の原文から自動翻訳されました。
AWS Trainium はディープラーニング専用に設計されたチップですが、モデルの最適化には特定の技術的なプロファイリング手法が必要です。Hugging Face が公開した新しいチュートリアルでは、Trainium のネイティブ PyTorch バックエンドである TorchNeuron を使用して、推論パフォーマンスを体系的に分析する方法を紹介しています。このガイドでは、エンジニアがトレースの取得、システムレベルデータの読み取り、一般的な操作に対する異なる実装戦略の比較を行う手順を解説します。
何が起きたか
多くの機械学習実践者は、直感に基づいてモデルの速度向上を図りますが、モデルが遅い原因を正確に診断するためのツールを持っている人は少数派です。このギャップを埋めるため、Hugging Face は AWS Trainium 向けのシステムレベルプロファイリングに関するシリーズの第1弾を公開しました。本チュートリアルは、このハードウェアでのプロファイリング経験がないことを前提としており、RMSNorm をケーススタディとしてゼロから始まります。
この walkthrough では、標準的な PyTorch ワークフローを最小限のコード変更で Trainium 上で実行可能にするオープンソースバックエンド「TorchNeuron」を利用します。これは eager 実行、torch.compile、および Neuron Kernel Interface を介したカスタムオペレーターをサポートしています。目標は、エンジニアがプロファイラーの設定方法、クリーンなトレースの取得方法、そして時間のかかる操作を特定するために結果データを解釈する方法を習得することです。
ガイドの最後には、読者は CPU 時間とデバイス時間の相関関係を理解し、ソフトウェアスタックを通じて操作を追跡し、異なるコーディングパターンがハードウェア利用率にどのように影響するかを理解できるようになります。この基礎知識は、ホットスポットを特定し、適切な融合(fusion)やコンパイル技術を適用することで、より大規模なモデルを最適化するための準備となります。
仕組み
Trainium でのプロファイリングは、主に2つのコンポーネント NeuronConfig と NeuronProfiler に依存します。NeuronConfig オブジェクトは、デバイス命令やランタイムトレースなど、キャプチャするデータストリームと出力ディレクトリを制御します。これは実験的な設定として torch.profiler.profile に渡されます。NeuronProfiler はこの設定を使用して、標準的なフレームワークトレースと Neuron 固有のシステムトレースの両方をエクスポートします。
データを可視化するために、エンジニアは SSH トンネルまたは VS Code 拡張機能を介してアクセスできるブラウザベースのビューア「Neuron Explorer」を使用します。このツールは、システムトレース、デバイスタイムライン、エンジンごとの内訳を表示します。共有数値ハッシュを使用して、コンパイル済み実行ファイル(NEFF ファイル)とハードウェア命令トレース(NTFF ファイル)を一致させます。これにより、ユーザーは高レベルの PyTorch 操作が低レベルのハードウェア実行にどのようにマッピングされるかを正確に確認できます。
プロファイリングプロセスでは、正確なタイミングを確保するためにプロファイラーループ内でデバイスを同期させる必要があります。torch.neuron.synchronize() を呼び出さない場合、プロファイラーはデバイスが処理を終了する前にデータをエクスポートしてしまう可能性があり、その結果、時間列が空になるか不正確になります。生成されるトレースは、フレームワークディスパッチからランタイムスケジューリング、そして最終的に NeuronCore 上でのハードウェア実行まで、各操作のライフサイクルを示します。
主要な詳細
- TorchNeuron は
PrivateUse1拡張ポイントを使用して PyTorch と統合され、CUDA のような専用のディスパッチキーが必要なくなります。 NeuronConfigパラメータcorrelate_device_time=Trueを設定すると、デバイス時間がkey_averages()テーブルに伝播され、CPU 時間との直接比較が可能になります。- 個々の PyTorch 操作を使用した RMSNorm の素朴な実装は、複数の個別のハードウェアディスパッチと中間テンソルの実体化を引き起こします。
torch.rms_norm()を使用すると、操作は単一の融合された Neuron カーネルに低下し、操作間のギャップを排除することでデバイス時間を大幅に削減します。- Neuron バックエンドを用いた
torch.compileは、素朴な操作を自動的に単一のグラフに融合でき、元の Python コード構造を変更せずに手動融合と同様のパフォーマンスを実現します。 - Neuron Explorer はイベントを、フレームワークディスパッチ、デバイスインタラクション、ランタイム API 呼び出し、ハードウェア実行などのレーンに整理し、詳細な依存関係チェーン分析を可能にします。
なぜ重要なのか
AWS Trainium 上で製品を構築するエンジニアにとって、CPU オーバーヘッドと実際のデバイス計算の違いを理解することは、コストとレイテンシの最適化において極めて重要です。素朴なコードは Python では効率的に見えることがありますが、頻繁なディスパッチとメモリ転送によりアクセラレーター上で過度なオーバーヘッドを発生させます。これらのギャップを可視化することで、開発者は組み込みの融合操作を使用すべきか、コンパイラー最適化に頼るべきかを情報に基づいて判断できます。
PyTorch フレームワークから NeuronCore ハードウェアまで操作を追跡できる能力は、ブラックボックス型のアクセラレーターではしばしば欠けている透明性レベルを提供します。この可視性は、チームがパフォーマンスの回帰をデバッグし、最適化努力が意図通りにハードウェアに到達していることを検証するのに役立ちます。これにより、最適化は推測に基づくものから証拠に基づくエンジニアリングへと変化します。
さらに、モデルの複雑さが増すにつれて、小さな非効率性の累積効果は相当なものになります。開発サイクルの早い段階で操作を特定し融合することで、パフォーマンスに関連する技術的負債を防ぐことができます。ここで説明されているテクニックは、モデル効率を監査するための再現可能なワークフローを提供し、インフラ支出が計算ニーズと整合することを保証します。
実施できること
torch_neuronxパッケージをインストールし、ProfileMode.DEVICEとProfileMode.RUNTIMEでNeuronConfigを設定して、包括的なトレースを取得します。- 初期化オーバーヘッドをパフォーマンス測定から除外するために、ウォームアップステップを含む
torch.profiler.scheduleを使用します。 - トレースエクスポートの前にデバイスタスクが完了していることを確認するために、プロファイリングループ内で
torch.neuron.synchronize()を呼び出します。 self_privateuse1_time_totalで並べ替えたkey_averages()テーブルを分析し、Neuron デバイス上で最もコストのかかる操作を特定します。- 生成された
.neffおよび.ntffファイルを Neuron Explorer にアップロードし、実行タイムラインを可視化してオペレーター融合を検証します。 - 素朴な実装を
torch.rms_normまたはtorch.compileバリアントと比較し、操作融合によるパフォーマンス向上を定量化します。



