PyTorch「Alchemy」の速度を向上させるにはどうすればよいですか?
最近、著名な機械学習と AI 研究者の Sebastian Raschka 氏がそのトリックを披露してくれました。同氏によると、彼の手法では、モデルの精度に影響を与えることなく、コードを数行変更するだけで BERT 最適化時間が 22.63 分から 3.15 分に短縮され、トレーニング速度が 7 倍向上しました。
著者は、8 つの GPU が利用できる場合、トレーニング プロセス全体で必要なのは次のとおりであるとさえ述べています。 11.5 倍のパフォーマンス アクセラレーションを達成するには 2 分かかります。
彼がどのようにしてそれを達成したかを見てみましょう。
PyTorch モデルのトレーニングを高速化する最初はモデルです。著者は研究に DistilBERT モデルを使用しています。これは BERT の合理化されたバージョンであり、40 分の 1 のサイズです。 BERT.% よりも優れていますが、パフォーマンスの低下はほとんどありません。 2 番目はデータ セットで、トレーニング データ セットは IMDB Large Movie Review という大規模な映画レビュー データ セットで、合計 50,000 件の映画レビューが含まれています。著者は、以下の図の方法 c を使用して、データセット内の映画レビューのセンチメントを予測します。
基本的なタスクを明確に説明した後、次は PyTorch のトレーニング プロセスです。このタスクを誰もがよりよく理解できるように、著者はウォームアップ演習、つまり IMDB 映画レビュー データセットで DistilBERT モデルをトレーニングする方法も詳しく紹介します。コードを自分で実行したい場合は、以下に示すように、関連する Python ライブラリを使用して仮想環境をセットアップできます。
関連するソフトウェアのバージョンは次のとおりです。
退屈なデータ読み込みの説明は省略します。理解することだけが必要です。この記事では、データ セットが 35,000 のトレーニング サンプル、5,000 の検証サンプル、および 10,000 のテスト サンプルに分割されていることがわかります。必要なコードは次のとおりです。
##コード部分のスクリーンショット
#完全なコード アドレス:https://github.com/rasbt/faster-pytorch- blog /blob/main/1_pytorch-distilbert.py
次に、A100 GPU でコードを実行すると、次の結果が得られます:
結果の一部のスクリーンショット
上記のコードに示すように、モデルは次のようになります。ラウンド 2 からラウンド 3 ラウンドの開始時に少しオーバーフィッティングが発生し、検証精度が 92.89% から 92.09% に低下しました。 22.63 分間モデルを微調整した後の最終テスト精度は 91.43% でした。
Trainer クラスを使用する
##次のステップは、上記のコードを改善することです。改善部分は主に次のとおりです。 Lightning から Trainer クラスを使用できるように、LightningModule で PyTorch モデルをラップします。いくつかのコードのスクリーンショットは次のとおりです:
完全なコード アドレス: https://github.com/rasbt/faster-pytorch-blog/blob/main/2_pytorch- with-trainer.py
#上記のコードは、トレーニング、検証、テストの実行方法を定義する LightningModule を作成します。前に示したコードと比較すると、主な変更点はパート 5 (つまり5 微調整) にあり、モデルを微調整しています。以前とは異なり、微調整部分では PyTorch モデルを LightningModel クラスでラップし、Trainer クラスを使用してモデルを適合させます。
前のコードでは、検証精度がラウンド 2 からラウンド 3 に低下していることが示されましたが、改善されたコードでは ModelCheckpoint を使用しています。最適なモデルをロードします。同じマシン上で、このモデルは 23.09 分で 92% のテスト精度を達成しました。
チェックポイント作成が無効で、PyTorch が非決定的モードでの実行を許可されている場合、この実行は最終的に同じ実行になることに注意してください。時間は通常の PyTorch と同じです (時間は 23.09 分ではなく 22.63 分です)。
自動混合精度トレーニング
さらに、GPU が混合精度トレーニングをサポートしている場合は、GPU をオンにすることができます。コンピューティング効率を向上させるため。著者らは自動混合精度トレーニングを使用し、精度を犠牲にすることなく 32 ビットと 16 ビット浮動小数点を切り替えます。
この最適化では、Trainer クラスを使用して、自動混合精度トレーニングを行います:
上記の操作により、トレーニング時間を 23.09 分から 8.75 分に短縮でき、ほぼ 3 倍速くなります。テスト セットの精度は 92.2% で、以前の 92.0% からわずかに改善されました。
Torch.Compile static imageを使用する
最近の PyTorch 2.0 のお知らせ表示、PyTorch チームは新しい toch.compile 関数を導入しました。この関数は、PyTorch コードを実行するために動的グラフを使用する代わりに、最適化された静的グラフを生成することにより、PyTorch コードの実行を高速化できます。
PyTorch 2.0 はまだ正式にリリースされていないため、最初に torchtriton をインストールして更新する必要がありますこの機能は、PyTorch の最新バージョンでのみ使用できます。
#次に、次の行を追加してコードを変更します。
4 GPU での分散データ並列処理
上記では、単一 GPU でコードを高速化する混合精度トレーニングについて説明しましたが、次に、マルチ GPU トレーニング戦略を紹介します。以下の図は、いくつかの異なるマルチ GPU トレーニング手法をまとめたものです。
#分散データ並列処理を実現したい場合は、DistributedDataParallel を通じて実現できます。トレーナーは 1 行のコードで使用できます。
この最適化ステップの後、4 つの A100 GPU でこのコードは 3.52 分間実行され、93.1 % のテスト精度に達しました。 。
##DeepSpeed
最後に、著者はディープ ラーニング最適化ライブラリ DeepSpeed と Trainer のマルチ GPU 戦略を使用した結果を調査します。まず、DeepSpeed ライブラリをインストールする必要があります:その後、コードを 1 行変更するだけで、ライブラリ:
このウェーブの後、テスト精度 92.6% に達するまでに 3.15 分かかりました。ただし、PyTorch には DeepSpeed の代替手段もあります。それは、strategy="fsdp" で呼び出される完全にシャード化された DataParallel で、最終的に完了までに 3.62 分かかりました。
上記は、PyTorch モデルのトレーニング速度を向上させるための著者の方法です。元のブログに従って、試してみてください。望む結果が得られると思います。
以上がコードを数行変更するだけで、PyTorch は錬金術を高速化し、モデルの最適化時間を大幅に短縮します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。