# 学習のためのテンソル並列

Tensor parallelism (TP) は、重み行列を GPU 間で列方向または行方向に分割します。各 GPU はシャードを保持し、部分結果を計算したうえで、all-reduce によって同期して完全な出力を生成します。

TPはGPU間の頻繁な通信に依存します。NVLinkのような高速なノード内リンクを備えたハードウェアで最も効果的に動作します。

```text
    ┌─────────────────────────────┐
    │       X  (replicated)       │
    └────┬──────────┬─────────┬───┘
         │          │         │
    ┌────▼───┐ ┌────▼───┐ ┌───▼────┐
    │ ▓▓▓ W₀ │ │ ░░░ W₁ │ │ ███ W₂ │
    │  X@W₀  │ │  X@W₁  │ │  X@W₂  │
    └────┬───┘ └────┬───┘ └───┬────┘
         └──────────┼─────────┘
               Y₀+Y₁+Y₂
    ┌────────────────────────────┐
    │          Y (full)          │
    └────────────────────────────┘
```

Transformers は、`base_model_tp_plan` が定義されているアーキテクチャに対して TP をサポートしています。モデルがネイティブ TP をサポートしているかどうかを確認するには、まずこのフィールドを確認してください。

```py
from transformers import AutoConfig

config = AutoConfig.from_pretrained("Qwen/Qwen3-0.6B")
print(config.base_model_tp_plan is not None)
print(config.base_model_tp_plan)
```

モデルがTPをサポートしている場合、`tp_size`にデバイス数を指定して[DistributedConfig](/docs/transformers/main/ja/expert_parallelism#transformers.DistributedConfig)を作成し、[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained)に渡します。Transformersはモデルの事前定義されたプランを使用して、デバイスメッシュを初期化し、サポートされているレイヤーをシャードします。

`tp_plan="auto"`を[DistributedConfig](/docs/transformers/main/ja/expert_parallelism#transformers.DistributedConfig)に設定することもできます。`tp_size`が省略された場合、`WORLD_SIZE`から推論されます。`tp_plan`を直接[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained)に渡すことは非推奨となり、v5.18で削除されます。

> [!WARNING]
> `device_map` と `distributed_config` を同時に使用しないでください。これらは重みの読み込みレベルで競合します。`device_map` はモジュール全体を特定の GPU に配置するのに対し、テンソル並列では同じパラメータをすべての GPU に分割します。

```py
import torch

from transformers import AutoModelForCausalLM, DistributedConfig

distributed_config = DistributedConfig(tp_size=4)

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B",
    dtype=torch.bfloat16,
    distributed_config=distributed_config,
)
```

[Trainer](/docs/transformers/main/ja/main_classes/trainer#transformers.Trainer) はテンソル並列の計画を検出し、モデルから `tp_size` を読み取って、`ParallelismConfig` を自動的に作成します。

1ノードの4つのGPUでトレーニングを開始します。

```shell
torchrun --nproc-per-node 4 train_tp.py
```

## ParallelismConfig

[FSDP](./fsdp) などの他の並列化技術と TP を組み合わせる場合は、`ParallelismConfig` を明示的に渡してください。

```py
import torch

from accelerate import ParallelismConfig
from transformers import AutoModelForCausalLM, DistributedConfig, TrainingArguments

distributed_config = DistributedConfig(tp_size=4)

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B",
    dtype=torch.bfloat16,
    distributed_config=distributed_config,
)

parallelism_config = ParallelismConfig(tp_size=4)

args = TrainingArguments(
    ...,
    parallelism_config=parallelism_config,
)
```

## PEFT アダプター

テンソル並列ベースモデルにPEFTアダプターを読み込むことができます（`peft >= 0.21.1` が必要です）。PEFTはアダプター重みのシャーディングを処理します。アダプターの追加、読み込み、トレーニングの方法（分散トレーニングに関する注記を含む）については、[PEFT](./peft)を参照してください。

## 次のステップ

- Read the [Tensor Parallelism](https://huggingface.co/spaces/nanotron/ultrascale-playbook?section=tensor_parallelism) chapter from The Ultra-Scale Playbook for more details about how it works.
- [テンソル並列推論ガイド](./perf_infer_gpu_multi)を読み、パーティショニング戦略、手動TPプラン、実装の詳細について詳しく学んでください。

