モデル並列って何?
データ並列には隠れた前提があります。それは「各カードがモデル全体を載せられる」こと。しかしモデルが数百億、数千億パラメータになると、1枚のGPUではとうに載りません。モデル並列は「モデルそのものを切る」発想。異なる層(または同じ層の異なる部分)を別々のGPUに置き、複数カードが協力してひとつの巨大モデルを計算します。データ並列との違いは?
データ並列はデータを分ける各カードが完全なコピーを持ち、別々のデータを処理します。
モデル並列はモデルを分ける
モデルをいくつかに切り、各カードがその一部を担当。データは全カードを順番に流れます。
解決する課題が違う
データ並列は「遅い」を、モデル並列は「載らない」を解決します。
よくある2つの切り方
層で切る(層間並列)1〜10層をGPU A、11〜20層をGPU Bへ。データはA→Bと流れ、組み立てラインのようです。
テンソルで切る(テンソル並列)
1つの層の中の行列演算を分割し、複数カードで並列計算して結果をつなぎます。Transformerの注意力のような大きな行列でよく使われます。
難しい点
通信が重い層と層、テンソルとテンソルの間でデータを頻繁にやり取りするため、カード間の帯域が重要です。
負荷の偏り
各部分の計算量が違うと、速いカードが遅いカードを待つことになり効率が落ちます。
実装が複雑
データ並列のような「ほぼそのまま」ではなく、丁寧なエンジニアリングが必要です。
なぜ不可欠なのか
今日の超大規模モデルの訓練は、ほぼすべてモデル並列に頼っています。これがなければ、数千億パラメータのモデルは「置く」ことすらできず、訓練は到底無理です。まとめ:モデル並列とは「モデルが大きくて載らないなら、いくつかに切り分け、複数カードで一緒に持ち上げる」こと。大規模AIに欠かせない技術です。
コメント