| 並列化技術 | サブメッシュ例(次元名) | 役割・意味 |
|---|---|---|
| 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"] |
レプリカとシャーディングの組み合わせ |
parallelism:
tensor_parallel_degree: 8 # 各レイヤーを8GPUで分割
pipeline_parallel_degree: 2 # モデルを2段階に分割
data_parallel_replicate_degree: 2 # 2つのレプリカ
data_parallel_shard_degree: 4 # 各レプリカ内で4GPUでシャーディング
[pp=2, dp_replicate=2, dp_shard=4, tp=8] で128GPUコード例:
# 全体メッシュ
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用
tp_mesh)pp_mesh)dp_shard_mesh)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, ...)