Hiroki Naganuma

各並列化技術が適切なサブメッシュを使用について

1. DeviceMesh(デバイスメッシュ)とは?

2. サブメッシュとは?

3. 各並列化技術とサブメッシュの対応

並列化技術 サブメッシュ例(次元名) 役割・意味
Tensor Parallel mesh["tp"] 各レイヤーの重みを複数GPUで分割計算
Pipeline Parallel mesh["pp"] モデルを複数段階に分割し、各段階を別GPUで計算
Data Parallel mesh["dp_replicate"] モデル全体を複製し、異なるデータで並列学習
FSDP (Sharded DP) mesh["dp_shard"] モデルパラメータを分割して各GPUに持たせる
HSDP (Hybrid) mesh["dp_replicate", "dp_shard"] レプリカとシャーディングの組み合わせ

4. 具体例:128 GPUの4次元メッシュ

parallelism:
  tensor_parallel_degree: 8      # 各レイヤーを8GPUで分割
  pipeline_parallel_degree: 2    # モデルを2段階に分割  
  data_parallel_replicate_degree: 2  # 2つのレプリカ
  data_parallel_shard_degree: 4  # 各レプリカ内で4GPUでシャーディング

コード例:

# 全体メッシュ
world_mesh = DeviceMesh("cuda", [2, 2, 4, 8], mesh_dim_names=["pp", "dp_replicate", "dp_shard", "tp"])

# 各サブメッシュ
tp_mesh = world_mesh["tp"]  # Tensor Parallel用
pp_mesh = world_mesh["pp"]  # Pipeline Parallel用
dp_replicate_mesh = world_mesh["dp_replicate"]  # DDP用
dp_shard_mesh = world_mesh["dp_shard"]  # FSDP用
hsdp_mesh = world_mesh["dp_replicate", "dp_shard"]  # HSDP用

サブメッシュの使い分けについて詳細解説

1. なぜサブメッシュを使い分けるのか?

効率的な通信

柔軟な組み合わせ

2. 多次元並列化の流れ(例:TP×PP×FSDP)

1. Tensor Parallel(tp_mesh

2. Pipeline Parallel(pp_mesh

3. FSDP(Sharded Data Parallel)(dp_shard_mesh

3. サブメッシュの使い分けのメリット

スケーラビリティ

柔軟性

シンプルな実装

4. 実装例:torchtitanでのサブメッシュ使用

def parallelize_llama(model, world_mesh, parallel_dims, job_config):
    # Tensor Parallel用のサブメッシュ
    if parallel_dims.tp_enabled:
        tp_mesh = world_mesh["tp"]
        apply_tp(model, tp_mesh, ...)
    
    # Data Parallel用のサブメッシュ
    if parallel_dims.dp_shard_enabled:
        if parallel_dims.dp_replicate_enabled:
            # HSDP: レプリカとシャーディングの組み合わせ
            dp_mesh = world_mesh["dp_replicate", "dp_shard"]
        else:
            # FSDP: シャーディングのみ
            dp_mesh = world_mesh["dp_shard"]
        
        apply_fsdp(model, dp_mesh, ...)

5. 通信パターンの最適化

各サブメッシュでの通信

通信の重複回避


まとめ