12 月 2 日、PyTorch 2.0 が正式にリリースされました。
このアップデートは、PyTorch のパフォーマンスを新たな高みに押し上げるだけでなく、動的な形状と分散のサポートも追加します。
さらに、2.0 シリーズでは、一部の PyTorch コードが C から Python に戻されます。
現在、PyTorch 2.0 はまだテスト段階にあり、最初の安定バージョンは 2023 年 3 月初旬に利用可能になる予定です。
過去数年間、PyTorch は 1.0 から最近の 1.13 まで革新と反復を繰り返し、新しく設立された PyTorch Foundation に移行して Linux Foundation の一部になりました。
PyTorch の現在のバージョンの課題は、eager-mode が増え続ける GPU 帯域幅とよりクレイジーなモデル アーキテクチャに追いつくのが難しいことです。
PyTorch 2.0 の誕生により、コンパイラ レベルでの PyTorch の実行方法が根本的に変わり、改善されます。
ご存知のとおり、PyTorch の (Py) は、データ サイエンスで広く使用されているオープン ソースの Python プログラミング言語に由来しています。
ただし、PyTorch のコードは完全に Python を使用しているわけではなく、その一部を C に提供しています。
ただし、将来の 2.x シリーズでは、PyTorch プロジェクト チームは torch.nn に関連するコードを Python に戻す予定です。
さらに、PyTorch 2.0 は完全なアドオン (およびオプション) 機能であるため、2.0 は 100% 下位互換性があります。
つまり、コード ベース、API、モデルの記述方法は同じです。
Python フレームワーク評価フックを使用して安全にキャプチャする PyTorch プログラムこれは、過去 5 年間にわたってグラフ キャプチャのチームによって開発された主要なイノベーションです。
PyTorch の autograd エンジンを、先読み逆トレースを生成するためのトレース autodiff としてオーバーロードします。
~2000 以上の PyTorch オペレーターを、開発者が完全な PyTorch を構築するためにオペレーターをターゲットにできる ~250 のプリミティブ オペレーターのクローズド セットに削減しました。バックエンド。 PyTorch 機能やバックエンドを作成する障壁は大幅に低くなります。
複数のアクセラレータとバックエンド用の高速コードを生成できるディープ ラーニング コンパイラ。 Nvidia の GPU では、主要な構成要素として OpenAI Triton が使用されています。
TorchDynamo、AOTAutograd、PrimTorch、TorchInductor はすべて Python で書かれており、動的シェイプをサポートしていることは注目に値します。
新しいコンパイル モード「torch.compile」の導入により、わずか 1 行のコードで PyTorch 2.0 を高速化できます。モデルトレーニング。
ここでは特別なトリックは必要ありません。torch.compile() を実行するだけで完了です:
opt_module = torch.compile(module)
これらのテクノロジーを検証するために、チームは、画像分類、オブジェクト検出、画像生成などのタスクと、言語モデリング、質問応答、シーケンス分類などのさまざまな NLP タスクを含むテスト ベンチマークを慎重に作成しました。 、推奨システム、強化学習。その中で、これらのベンチマークは 3 つのカテゴリに分類できます:
テスト結果は、これらの 163 のモデルがビジョン、NLP、その他の分野に及ぶことを示しています。オープン ソース上でモデルでは、トレーニング速度が 38% ~ 76% 向上しました。
#NVIDIA A100 GPU での比較
さらに、チームは次のことも行いました。いくつかの人気のあるオープンソース PyTorch モデルでベンチマークが実施され、30% から 2 倍まで大幅な速度向上が得られました。
開発者の Sylvain Gugger 氏は次のように述べています: 「わずか 1 行のコードで、PyTorch 2.0 は Transformers モデルのトレーニング時に 1.5 倍から 2.0 倍の高速化を達成できます。これは自己混合型の高精度トレーニングです。
技術概要PyTorch のコンパイラは 3 つの部分に分類できます:
TorchDynamo
この目的を達成するために、チームはデータ駆動型のアプローチを採用し、PyTorch で記述された 7,000 を超える Github プロジェクトを検証セットとして使用して、グラフ キャプチャにおける TorchDynamo の有効性を検証しました。
結果は、TorchDynamo が無視できるオーバーヘッドで、99% の確率でグラフ キャプチャを正確かつ安全に実行できることを示しています。
TorchInductor
TorchInductor は、Pythonic で定義されたループごとのレベル IR を使用して、PyTorch モデルを GPU 上で生成された Triton コードおよび CPU 上の C/OpenMP に自動的にマッピングします。
TorchInductor のコア ループレベル IR には約 50 個の演算子しか含まれておらず、Python で実装されているため、拡張が簡単です。
AOTAutograd
AOTAutograd は、PyTorch の torch_dispatch 拡張メカニズムを使用して Autograd エンジンを追跡し、バックプロパゲーションを「事前に」キャプチャし、TorchInductor を使用して順方向チャネルと逆方向チャネルを高速化できます。
PrimTorch
PrimTorch プロジェクトでは、チームは 2 つのより小さくより安定したオペレーター セットを定義しました。
PyTorch コードの汎用性をサポートするために何が必要かを調査する際の重要な要件動的形状をサポートし、形状が変更されるたびに再コンパイルを発生させることなく、モデルが異なるサイズのテンソルを受け入れることができるようにすることです。
動的シェイプがサポートされていない場合の一般的な回避策は、最も近い 2 の累乗まで埋め込むことです。ただし、以下のグラフからわかるように、パフォーマンスに重大なオーバーヘッドが発生し、コンパイル時間も大幅に長くなります。
PyTorch 2.0 は、動的シェイプのサポートにより、Eager よりも最大 40% 高いパフォーマンスを達成しました。
最後に、PyTorch 2.x のロードマップにおいて、チームはパフォーマンスとスケーラビリティの点でコンパイル モデルをさらに前進させたいと考えています。
以上が1 行のコードでエリクサーを 2 倍速く作成できます。 PyTorch 2.0 が驚きの登場、LeCun が熱心に推進の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。