テンソル並列(テンソルヘイレツ)
大規模言語モデルの分散学習手法の一つ。Transformer の Attention 層や FFN 層の行列演算を複数 GPU に列方向・行方向に分割して並列実行する技術。Megatron-LM が提唱し、ノード内 NVLink 接続での高速通信が前提。
テンソル並列とは
テンソル並列(Tensor Parallelism, TP)は、ニューラルネットワークの個々のレイヤー内の行列演算を複数のGPUに分割して並列実行する分散学習手法である。2019年にNVIDIAのMegatron-LMチームが提唱し、現在ではほぼ全ての大規模LLM学習で使用される基盤技術となっている。
テンソル並列の基本原理
Transformerの主要な計算はすべて行列積(GEMM)で構成される。行列 A×B を計算する際、行列Bを列方向に分割(Column Parallel)するか、行方向に分割(Row Parallel)することで複数GPUに計算を分散できる。
- Column Parallel(列並列): 重み行列Wを列方向に分割 W=[W₁, W₂]。各GPUが X×Wᵢ を計算し、結果を連結
- Row Parallel(行並列): 重み行列Wを行方向に分割 W=[W₁; W₂]。入力Xも対応するように分割し、各GPUの計算結果をAllReduceで集約
Megatron-LMではAttention層でColumn Parallel、FFN層の後半でRow Parallelを使い、通信回数を最小化する設計となっている。
Transformer各層の分割方法
| 層 | 分割方式 | 通信操作 | 通信回数/層 |
|---|---|---|---|
| Self-Attention QKV投影 | Column Parallel | なし(ローカル計算) | 0 |
| Self-Attention 出力投影 | Row Parallel | AllReduce | 1 |
| FFN 第1層(up projection) | Column Parallel | なし | 0 |
| FFN 第2層(down projection) | Row Parallel | AllReduce | 1 |
| LayerNorm | 複製(各GPUで同一計算) | なし | 0 |
| Embedding | Column Parallel | AllGather | 1 |
1つのTransformerブロックあたりの通信はforward passで2回、backward passで2回の計4回AllReduceとなる。
テンソル並列の通信要件
テンソル並列は非常に高頻度の通信(各レイヤーごと)を必要とするため、GPU間の通信帯域が性能を決定する。
- NVLink(推奨): H100 NVSwitchで双方向900GB/s。8GPU DGXノード内でTP=8が標準
- NVLink 5(GB200): 双方向1.8TB/sで次世代のTP=72も視野に
- PCIe 5.0: 双方向128GB/s。NVLinkの1/7以下であり、TP向きではない
- InfiniBand NDR: ノード間400Gbps(50GB/s)。TP向きではないが、やむを得ず使う場合もある
実用上、テンソル並列度(TP度)はノード内GPU数(通常8)に制限される。ノード間でTPを実行すると通信レイテンシで性能が大幅に低下する。
Megatron-LMのテンソル並列実装
NVIDIA Megatron-LMは最も成熟したテンソル並列実装を提供する。
- TP度設定:
--tensor-model-parallel-size 8で8GPU分割 - シーケンス並列統合: LayerNormやDropoutをシーケンス次元で分割し、TP以外の計算も並列化
- アクティベーション再計算: メモリ節約のためforward計算結果を破棄し、backward時に再計算
- FP8対応: H100以降でFP8精度のGEMM+TPが可能。通信量も半減
- Grouped GEMM: MoEモデルの複数Expert演算をバッチ化して効率化
テンソル並列 vs パイプライン並列
| 観点 | テンソル並列(TP) | パイプライン並列(PP) |
|---|---|---|
| 分割単位 | レイヤー内の行列 | レイヤー群(ステージ) |
| 通信頻度 | 非常に高い(毎レイヤー) | 低い(ステージ境界のみ) |
| 通信量/回 | 小〜中(hidden_size × batch) | 中(activation × batch) |
| 必要帯域 | NVLink級(900GB/s+) | InfiniBand級(50GB/s+)で可 |
| GPU利用率 | 高い(バブルなし) | パイプラインバブルあり |
| スケール限界 | ノード内GPU数(通常8) | ノード数に応じて拡張可 |
| メモリ効率 | パラメータ+オプティマイザを分割 | ステージ分のみ保持 |
2025-2026年の最新動向
- TP+SP(Sequence Parallelism): テンソル並列とシーケンス並列を組み合わせ、LayerNorm・Dropoutの計算もGPU間で分散。Megatron-LM v0.7で標準化
- Context Parallel(CP): 長シーケンス(128K+トークン)のAttention計算をシーケンス次元で分割。Ring Attentionの発展形
- Ulysses Attention: DeepSpeedが提唱したシーケンス次元でのAttention分割手法。AlltoAll通信で実装
- Expert Tensor Parallelism: MoEモデルの各ExpertをさらにTP分割する二重並列化
よくある質問(FAQ)
Q1: テンソル並列度はいくつに設定すべきですか? A: ノード内のGPU数(通常8)以下にする。H100 DGX(8GPU、NVSwitch接続)ならTP=8が標準。RTX系でNVLinkなしの場合はTP=2程度が限界で、それ以上はPCIeの帯域がボトルネックとなる。
Q2: テンソル並列はどのサイズのモデルから必要ですか? A: 目安として、モデルパラメータがGPUメモリの40%を超えたら検討する。FP16で7Bモデル(14GB)はH100 80GBに収まるがオプティマイザ含め余裕がない。13B以上でTP=2、70B以上でTP=8が実用的。
Q3: テンソル並列とZeRO-3の違いは何ですか? A: テンソル並列は計算(行列演算)を分割して各GPUが一部を担当する。ZeRO-3はパラメータ・勾配・オプティマイザ状態のメモリを分割するが、計算時にはAllGatherでパラメータを再収集する。テンソル並列の方が通信パターンが規則的で効率的だが、NVLink必須。
まとめ
- テンソル並列はTransformerの行列演算をGPU間で分割する技術
- Column ParallelとRow Parallelの組み合わせで通信を最小化
- NVLink級の高帯域接続が必須でノード内に限定される
- TP=8(DGXノード内)が標準、GB200でTP=72も可能に
- パイプライン並列やデータ並列と組み合わせて3D並列を構成