Tech
blog
テックブログ

2026.7.31

    Kaggleで学んだBERTをfine-tuningする際のTips⑦〜複数GPU活用編〜

    こんにちは!
    AIチームの戸田です

    本記事では私がKaggleのコンペティションに参加して得た、Transformerをベースとした事前学習モデルのfine-tuningのTipsを共有させていただきます。

    以前も何件か同じテーマで記事を書かせていただきました。

    去年からKaggle Notebookで複数GPUが使えるようになり、色々と知見が溜まってきたので、今回は複数GPUの活用について書かせていただこうと思います。

    https://twitter.com/kaggle/status/1582843208685363200?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1582843208685363200%7Ctwgr%5E994cd3d76ae2927bab09c68b5a0b3593f0457f23%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.currypurin.com%2Fentry%2F2022%2F10%2F20%2F173813

    複数GPUの活用方法

    シングルGPUでのトレーニングが遅すぎる場合や、モデルの重みがシングルGPUのメモリに収まらない場合は、マルチGPUセットアップを使用します。シングルGPUからマルチGPUに切り替えるには、作業を分散させる必要があるため、何らかの並列性が必要です。データ並列、テンソル並列、パイプライン並列など、並列化を達成する ためのテクニックはいくつかあります。しかし、すべてに適合する1つの解決策はなく、どの設定が最 適かは実行するハードウェアに依存します。主なコンセプトは他のフレームワークにも当てはまる可能性が高いですが、この記事ではPyTorchベースの実装に焦点を当てます。

    注意:シングルGPUのセクションで紹介されている戦略(混合精度トレーニングや勾配累積など)のほとんどは、一般的なモデルのトレーニングに適用されます。

    まず、様々な1次元並列手法とその長所と短所について詳しく説明し、それらをどのように2次元並列や3次元並列に組み合わせれば、より高速なトレーニングが可能になり、より大きなモデルに対応できるかを見ていきます。その他、様々な強力な代替アプローチについても紹介する。

    以下は、本書で後ほど詳しく説明する主なコンセプトの簡単な説明である。

    DataParallel (DP) - 同じセットアップが複数回複製され、それぞれにデータのスライスが供給される。処理は並列に行われ、各トレーニングステップの終了時にすべてのセットアップが同期される。
    TensorParallel(TP)-各テンソルは複数のチャンクに分割されるため、テンソル全体が1つのGPUに存在するのではなく、テンソルの各シャードが指定されたGPUに存在する。処理中、各シャードは別々のGPUで別々に並列処理され、結果はステップの最後に同期される。これは水平並列と呼ばれるもので、水平レベルで分割が行われます。
    PipelineParallel (PP) - モデルを複数のGPUで垂直方向(レイヤ ーレベル)に分割し、1つのGPUにモデルの1つまたは複数のレイヤーの みを配置します。各GPUはパイプラインの異なるステージを並列処理し、バッチの小さなチャンクを処理します。
    ゼロ冗長性オプティマイザー(ZeRO) - テンソールのシャーディングもTPと多少似ているが、テンソル全体が前方または後方計算のために時間内に再構築されるため、モデルを修正する必要がない。また、GPUメモリの制限を補うために、さまざまなオフロード技術もサポートしています。
    シャーデッドDDP - ZeROの他のさまざまな実装で使用されている、基本的なZeROコンセプトの別名です。
    各コンセプトの詳細を理解する前に、まず、大規模なインフラストラクチャで大規模なモデルをトレーニングする際の大まかな決定プロセスを見てみましょう。