HuggingFaceモデルを2倍速くトレーニングする
トランスフォーマーのトレーニング時間を短縮するオプション
このレポートの目的は、精度に悪影響を与えることなく、Transformersライブラリのトレーニング時間を大幅に短縮できる2つの非常に単純な最適化を調査することです。
大規模な有名なNLPデータセット(X-NLIのフランス語部分)で21回の実験と12回の再現性実験を実行し、すぐに使用できるフランス語のBERTモデル(CamemBERT)、デフォルトのパラメーターを使用するだけで、単一のコンシューマーグレードGPU、およびこれらの最適化により、モデルの基本フレーバーについて、最大トークン長128で、16分のトレーニングで81.5%の精度に到達し、56分のトレーニングで得られたスコアを0.5ポイント上回ります。最適化を行わず、CamemBERTモデルの作成者がこのタスクについて報告したスコアを0.3ポイント上回っています。
同じモデルでのゲインはさらに印象的で、最大トークン長は493で、トレーニング時間は最適化なしの4h38からすべての最適化ありの1h01に減少し、同じスコアに達します。大型モデルでも同様のトレーニング時間の短縮が達成されました(128トークンの長さで4時間から1時間30分)。
詳細については、Mediumの記事をご覧ください。
wandb
にログオンしたX-NLI
のフランス語部分で多くの実験を実行しました。
base
カマンベールモデル:14回の実験+5回の再現性実験large
なカマンベールモデル:7回の実験+5回の再現性実験
いずれの場合も(base
/large
)、実験は2つのグループに分けられます。
- 最大128トークンの64シーケンスのミニバッチ
- 最大493トークンの2X8シーケンスのミニバッチ
記事で説明されているように、128トークンのセットアップにより、トレインセットの例の3%が切り捨てられます。
これらのグループのそれぞれについて、トレーニングを加速するために3つの最適化の組み合わせを検討します。
- 混合精度(gcc7でコンパイルされたNvidia Apex );
- 動的パディング
- スマートバッチ処理(この記事では均一長のバッチ処理と呼ばれています。実験はこのばかげた名前で記録されているため、このレポートのために保持します)。
これらの実験を自分で実行したい場合は、このGithubの要点でソースコードを入手できます。
トレーニング時間‐基本モデル‐493トークンの8シーケンスの2ステップのバッチ
レポートの最初の部分では、モデルのbaseフレーバーに焦点を当てます。
シーケンスの長さに制限を適用しない場合、混合精度、動的パディング、スマートバッチ処理の3つのオプションをアクティブにすると、最短のトレーニング時間になります。つまり、それぞれが便利です。
ただし、各オプションが同じ効果をもたらすとは限りません。はるかに、動的パディングが最も影響を及ぼします。これは、シーケンスの97%が128シーケンス未満の長さであるデータセットで意味があります。スマートバッチ処理はこの戦略に役立ち、2番目に重要なオプションです。
トレーニング時間-基本モデル-128トークンの64シーケンスの1ステップのバッチ
128トークンの長さ制限を適用すると、混合精度、動的パディング、スマートバッチ処理の3つのオプションがアクティブになり、トレーニング時間が最短になります。
ただし、混合精度の影響は以前よりも重要です。
- 混合精度のみは、動的パディングおよびスマートバッチ処理のみよりも4%高速です。
- 混合精度だけでも、動的パディングとスマートバッチ処理を組み合わせた混合精度よりも34%遅くなります。
Githubの要点の完全なコード →
精度‐基本モデル‐すべてのセットアップ
どのようなグループ化を行っても、単純な傾向は見られないため、すべての設定をまとめて分析します。これは、速度の最適化が精度に明らかな影響を与えないことを意味します。
まず、すべてのスコアが0.810から0.820の間にあることがわかります。これは、さまざまなパターンを使用した非常に多くの実験で非常に低いギャップです。
モデルを1エポック以上トレーニングすると、ギャップが大きくなる可能性がありますが、Camembert論文が10エポックで報告したXNLI(フランスの部分)スコアは「わずか」0.812です。
2つのセットアップで最高スコア(0.820)に到達します。
- 動的パディングのみを使用した128トークンの64シーケンスのバッチ
- 動的パディングのみを使用した493トークンの16シーケンスのバッチ
動的パディングだけで精度が向上することを説明する正当な理由はありません。それは運だけだと思います。
チェックする他のオプションは、オプションをアクティブにしないセットアップと比較した、スマートバッチ処理のみの影響です。
- 493トークンの16シーケンスのバッチ、オプションなし:0.814
- スマートバッチ処理のみを使用した493トークンの16シーケンスのバッチ:0.816
- 128トークンの64シーケンスのバッチ、オプションなし:0.810
- スマートバッチ処理のみを使用した128トークンの64シーケンスのバッチ:817
スマートバッチ処理は、精度にわずかにプラスの影響を与えるようです。
Githubの要点の完全なコード→
トレーニング時間のトレードオフ精度/トレーニング時間‐8X2シーケンスのバッチ493トークン
64シーケンス128トークンのバッチのトレードオフ精度/トレーニング時間
再現性実験‐基本モデル
異なるシードを使用して、最速の設定(動的パディング+スマートバッチ処理+混合精度+最大トークン長128)の5倍を再実行します。スコアは安定しており(0.813〜0.819)、このモデルのフレーバーについてCamembert論文(0.812)で報告されているスコアを常に上回っています。
大規模モデル実験
レポートの2番目の部分は、base
フレーバー(110Mパラメーター)ではなく、モデルのlarge
フレーバー(335Mパラメーター)専用��す。
このセットアップでは、2080TIGPUの12Gbで、最大ステップサイズはbase
モデルの場合よりも小さくなります。
- 最大128トークンの長さの場合、ステップサイズは8で、16の例のバッチに到達するために2つのステップを累積します
- 最大493トークンの長さの場合、ステップサイズは2で、16の例のバッチに到達するために8つのステップを累積します
Mediumの記事で紹介されている2つの最適化の目的は、バッチ/ステップの生成に焦点を当てています。
モデルは3倍大きいですが、テストに使用するGPUサイズは12Gbに制限されているため、ステップサイズは小さくなります。
最適化を行わないと、トレーニング時間は非常に長くなります(493トークンの長さの場合は15時間、128トークンの場合は4時間)。すべての最適化により、トレーニング時間は短縮されますが、それでもかなり長くなります(493トークンの長さの場合は7時間、128トークンの場合は1時間30分)。
セットアップ(最適化ありまたはなし)に関係なく、ここで1エポックで得られたスコアは、10エポック+早期停止について紙で報告されたスコアよりもわずかに低くなります(最適化されたlargeモデルは0.856に達し、紙は0.857を報告します)。
トレーニング時間‐大規模モデル‐128トークンの8シーケンスの2ステップのバッチ
トレーニング時間-大規模モデル-493トークンの2シーケンスの4ステップのバッチ
再現性実験‐大型モデル
次のステップ !
この記事がお役に立てば幸いです。これらの実験を自分で実行することをお勧めします。ソースコードはこのGithubの要点で入手できます。
@pommedeterre33 を通じてフォローしてください。