Simple Science

最先端の科学をわかりやすく解説

# コンピューターサイエンス# 機械学習# 計算と言語

BERTのトレーニング効率を改善する

GPUを使ってBERTのトレーニング速度と効率を向上させる方法を学ぼう。

― 1 分で読む


BERTトレーニングがもっBERTトレーニングがもっと速くなったする方法。複数のGPUでBERTトレーニングを速く
目次

BERTみたいな言語モデルを大量のデータでトレーニングするのは大変だよね。パワフルなコンピュータと複数のGPUを活かすために、このトレーニングを早めるのが重要なんだ。この記事では、BERTのトレーニングをもっと効率的で速くする方法を見ていくよ。

大規模トレーニングの課題

たくさんのGPUでトレーニングするときは、いろんなことがうまく連携しないといけない。データをGPUにどう分けるか、GPU同士のコミュニケーション、トレーニング中のモデルの更新の仕方が含まれる。各GPUはそれぞれのBERTモデルのコピーで作業してるから、モデルパラメータの更新をすぐに共有しないと、全部が同期しないんだ。

言語モデルの大きな課題の一つは、データが異なる長さで来ること。例えば、短い文もあればすごく長い文もある。すべてのGPUに同じ量のデータを割り当てると、いくつかのGPUは他よりも早く計算を終えちゃう。この不均衡が全体のトレーニングプロセスを遅くするんだ。

トレーニングでの負荷分散

この問題を解決するには、各GPUの負荷をバランスさせる必要がある。各GPUが似たような量のデータを処理すれば、全部がだいたい同じ時間にタスクを終えられる。この方法だと、結果を効率的に共有できる。負荷をバランスさせるための一つの方法は、文を長さでソートしてから各GPUに割り当てることだ。

データをソートしてから分配する簡単な方法は、すごく時間と手間がかかるから、全GPUがコミュニケーションを取る必要があるんだ。代わりに、各GPU内でローカルにデータをソートすればいい。文を長さでグループ化することで、あまりコミュニケーションを必要とせずによりバランスの取れたバッチを作れるんだ。

GPU間のコミュニケーション改善

GPUが一緒に作業するときは、情報を交換しないといけない。この交換がボトルネックになることがある、特にコミュニケーションと計算が重なるとき。あるGPUがデータを処理中だと、他からの更新を送ったり受け取ったりしづらくなる。これらのタスクをうまく重ねられれば、トレーニングプロセス全体のスピードを上げられる。

このために、更新を小さな塊(バケット)に分けることができる。各GPUは一つのバケットを処理しながら、他のGPUには別のバケットを送れる。このプロセスを正しく整理すれば、時間を節約してGPUを効率的に働かせることができるんだ。

効率的なオプティマイザの使用

オプティマイザの選択もトレーニング速度に大きな影響を与える。オプティマイザは、トレーニング中に発生するロスに基づいてモデルの重みを調整するアルゴリズムなんだ。BERTには、ADAMオプティマイザを使うと良い感じに働いてくれる。特に通常より大きなバッチサイズを使うと、トレーニングが早く進むんだ。

オプティマイザの設定を注意深く調整することで、トレーニング効率をさらに高められる。これは、大規模トレーニングに最適な設定を見つけるために、異なるハイパーパラメータを試すことを含むよ。

BERTトレーニングへのアプローチ

私たちの研究では、BERTのトレーニングを改善するための2つの主なアイデアを提案するよ:

  1. 負荷分散のためのローカルソーティング:各GPU内で文の長さに基づいてデータをソートすることで、よりバランスの取れたバッチを作れる。この方法は、GPU間のコミュニケーションの必要性を減らしつつ、各GPUが公平に作業を受けられるようにするんだ。

  2. バケットごとのグラデientクリッピング:全ての計算が終わるまで更新を待つのではなく、グラデientを小さなバケットでクリッピングするんだ。これにより、大きな更新をうまく管理できて、計算とコミュニケーションの重なりを改善できる。

私たちの方法の結果

これらの方法を実装した後、1,024台のNVIDIA A100 GPUでBERTを記録的な速さでトレーニングできた。このパフォーマンスは、似たようなセットアップを使った以前の試みよりもかなり速いんだ。負荷分散とコミュニケーションの改善がトレーニング中の無駄な時間を最小限に抑えるのに役立った。

シーケンス長がトレーニングに与える影響

言語データの特性は、もう一つの課題をもたらす。文の長さが大きく異なると、効率が悪くなることがある。BERTトレーニングでは、最大シーケンス長を設定することが多く、短い文はこの長さに合わせてパディングで埋められる。その結果、意味のあるデータではなく、パディングトークンの処理に多くの計算が無駄になっちゃう。

これを解決するために、私たちのローカルソーティングの方法で文を長さでグループ化すると、パディングの使用を最小限に抑えられる。この方法だと、処理したい実際のデータに計算リソースを集中できるんだ。

大きなバッチでのトレーニング

大きなバッチを使うことでGPUをより効率的に活用できるけど、トレーニング中の収束に問題を引き起こすこともある。大きなバッチを使うときは、学習率を正しく調整しないとトレーニングの質を維持できない。私たちは、学習率をバッチサイズに比例させる技術を取り入れて、大きなバッチでのトレーニングの利点を有効に活用できるようにしている。

トレーニング技術の継続的改善

最適化は常に進行中のプロセスだよ。新しい技術を実装するたびに、その効果に関するデータを集めている。私たちの方法を継続的に評価して、最も早いトレーニング時間を維持しながら、高い精度の結果を達成できるようにしているんだ。

結論として、BERTのトレーニングは、負荷分散のためのローカルソーティングや効率的なコミュニケーションのためのバケットごとのグラデインクリッピングなどの方法で大きく改善できる。これらの戦略は、トレーニングセッション中に無駄な時間を減らし、パワフルなGPUリソースをより効果的に活用できるようにしてくれる。

今後もアプローチを洗練させ、さまざまなトレーニングセッションからデータを集めながら、言語モデルのトレーニングの限界をさらに押し広げていきたいと思ってるよ。

オリジナルソース

タイトル: Breaking MLPerf Training: A Case Study on Optimizing BERT

概要: Speeding up the large-scale distributed training is challenging in that it requires improving various components of training including load balancing, communication, optimizers, etc. We present novel approaches for fast large-scale training of BERT model which individually ameliorates each component thereby leading to a new level of BERT training performance. Load balancing is imperative in distributed BERT training since its training datasets are characterized by samples with various lengths. Communication cost, which is proportional to the scale of distributed training, needs to be hidden by useful computation. In addition, the optimizers, e.g., ADAM, LAMB, etc., need to be carefully re-evaluated in the context of large-scale distributed training. We propose two new ideas, (1) local presorting based on dataset stratification for load balancing and (2) bucket-wise gradient clipping before allreduce which allows us to benefit from the overlap of gradient computation and synchronization as well as the fast training of gradient clipping before allreduce. We also re-evaluate existing optimizers via hyperparameter optimization and utilize ADAM, which also contributes to fast training via larger batches than existing methods. Our proposed methods, all combined, give the fastest MLPerf BERT training of 25.1 (22.3) seconds on 1,024 NVIDIA A100 GPUs, which is 1.33x (1.13x) and 1.57x faster than the other top two (one) submissions to MLPerf v1.1 (v2.0). Our implementation and evaluation results are available at MLPerf v1.1~v2.1.

著者: Yongdeok Kim, Jaehyung Ahn, Myeongwoo Kim, Changin Choi, Heejae Kim, Narankhuu Tuvshinjargal, Seungwon Lee, Yanzi Zhang, Yuan Pei, Xiongzhan Linghu, Jingkun Ma, Lin Chen, Yuehua Dai, Sungjoo Yoo

最終更新: 2024-02-04 00:00:00

言語: English

ソースURL: https://arxiv.org/abs/2402.02447

ソースPDF: https://arxiv.org/pdf/2402.02447

ライセンス: https://creativecommons.org/licenses/by-nc-sa/4.0/

変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。

オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。

類似の記事