# Distributed Data Parallel（DDP）を使ったマルチGPUファインチューニング

複数のGPUがあり、それらすべてを使ってモデルをファインチューニングしたいとします！そのための最も単純な戦略はDistributed Data Parallel（DDP）を使うことで、各GPUデバイスにモデルのコピーを作成し、各コピーに対してトレーニング中にデータセットから異なるサンプルを与え、各オプティマイザーステップごとに重み更新への寄与を集約します。

なぜこれを行いたいのでしょうか？GPUをトレーニングに追加するにつれて、ステップごとにモデルが学習するサンプル数が増え、各勾配更新がより安定し、追加したGPUごとにトレーニングスループットが劇的に向上するからです。

ここではUnslothのコマンドラインインターフェース（CLI）を使ってこれを行う方法をステップバイステップで説明します！

**注意：** UnslothのDDPはCLI経由だけでなく、あなたの任意のトレーニングスクリプトでも動作します！詳細は下記。

#### Unslothをソースからインストールする

GitHubからUnslothをクローンしてインストールします。以下のような [仮想環境](https://docs.python.org/3/tutorial/venv.html)の使用を検討してください；私たちは `uv venv –python 3.12 && source .venv/bin/activate`を好んで使いますが、任意の仮想環境生成ツールで構いません。

```bash
git clone https://github.com/unslothai/unsloth.git
cd unsloth
pip install .
```

#### ファインチューニングする対象のモデルとデータセットを選ぶ

このデモでは、 [Qwen/Qwen3-8B](https://huggingface.co/Qwen/Qwen3-8B) を [yahma/alpaca-cleaned](https://huggingface.co/datasets/yahma/alpaca-cleaned) チャットデータセットでファインチューニングします。これはベースモデルを望ましい会話スタイルに適応させたり、下流タスクでの性能を向上させたりする際に一般的に用いられる教師付きファインチューニング（SFT）ワークロードです。

### Unsloth CLIを使いましょう！

まず、CLIに組み込まれたヘルプメッセージを見てみましょう（簡潔にするため各所で「...」と省略しています）：

{% code expandable="true" %}

```bash
$ python unsloth-cli.py --help
usage: unsloth-cli.py [-h] [--model_name MODEL_NAME] [--max_seq_length MAX_SEQ_LENGTH] [--dtype DTYPE]
                      [--load_in_4bit] [--dataset DATASET] [--r R] [--lora_alpha LORA_ALPHA]
                      [--lora_dropout LORA_DROPOUT] [--bias BIAS]
                      [--use_gradient_checkpointing USE_GRADIENT_CHECKPOINTING]
…

🦥 unslothであなたのLLMをより速くファインチューニング！

オプション：
  -h, --help            このヘルプメッセージを表示して終了

🤖 モデルオプション：
  --model_name MODEL_NAME
                        読み込むモデル名
  --max_seq_length MAX_SEQ_LENGTH
                        最大シーケンス長。デフォルトは2048。内部的にRoPEスケーリングを自動サポートします！
                        （内部的に）！
…

🧠 LoRAオプション：
  これらのオプションはLoRAモデルを設定するために使用されます。

  --r R                 Loraモデルのランク、デフォルトは16。（一般的な値：8、16、32、64、128）
  --lora_alpha LORA_ALPHA
                        LoRAのalphaパラメータ、デフォルトは16。（一般的な値：8、16、32、64、128）
…

🎓 トレーニングオプション：
  --per_device_train_batch_size PER_DEVICE_TRAIN_BATCH_SIZE
                        トレーニング中のデバイスごとのバッチサイズ、デフォルトは2。
  --per_device_eval_batch_size PER_DEVICE_EVAL_BATCH_SIZE
                        評価中のデバイスごとのバッチサイズ、デフォルトは4。
  --gradient_accumulation_steps GRADIENT_ACCUMULATION_STEPS
                        勾配蓄積ステップ数、デフォルトは4。
…
```

{% endcode %}

これで、モデルのトレーニングにCLIへ渡せるオプションの概要がつかめるはずです！

マルチGPUトレーニング（この場合DDP）では、 [torchrun](https://docs.pytorch.org/docs/stable/elastic/run.html) ランチャーを使用します。これはシングルノードまたはマルチノード設定で複数の分散トレーニングプロセスを立ち上げることを可能にします。本例では2つのH100 GPUを搭載した単一ノード（すなわち1台のマシン）ケースに焦点を当てます。

また、次の `nvidia-smi` コマンドラインツールを使ってGPUの状態を確認しましょう：

{% code expandable="true" %}

```bash
$ nvidia-smi
Mon Nov 24 12:53:00 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA H100 80GB HBM3          On  |   00000000:04:00.0 Off |                    0 |
| N/A   32C    P0             69W /  700W |       0MiB /  81559MiB |      0%      Default |
|                                         |                        |             Disabled |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA H100 80GB HBM3          On  |   00000000:05:00.0 Off |                    0 |
| N/A   30C    P0             68W /  700W |       0MiB /  81559MiB |      0%      Default |
|                                         |                        |             Disabled |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
```

{% endcode %}

いいですね！期待通りH100が2台あります。現在は何もトレーニングしておらず、モデルもメモリにロードしていないため、両方とも0MiBのメモリ使用量です。

トレーニングを開始するには、次のようなコマンドを実行します：

{% code expandable="true" %}

```bash
# 必須：
#   --model_name
#   --dataset
# オプション；これらを試してみてください：
#   --learning_rate, --max_seq_length, --per_device_train_batch_size, --gradient_accumulation_steps, --max_steps
# トレーニング終了時にモデルを保存するには：
#   --save_model

torchrun --nproc_per_node=2 unsloth-cli.py \
  --model_name=Qwen/Qwen3-8B \
  --dataset=yahma/alpaca-cleaned \
  --learning_rate=2e-5 \
  --max_seq_length=2048 \
  --per_device_train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_steps=1000 \
  --save_model
```

{% endcode %}

もしGPUがさらにある場合は、これらを利用するために `--nproc_per_node` を適宜設定してください。

**注意：** あなたは `torchrun` ランチャーをUnslothの任意のトレーニングスクリプトで使用できます。これには [scripts](https://github.com/unslothai/notebooks/tree/main/python_scripts) （無料のColabノートブックから変換したもの）も含まれ、トレーニングを>1 GPUで行うとDDPは自動的に有効になります！

再度確認してみましょう： `nvidia-smi` トレーニング中に以下を確認すると：

{% code expandable="true" %}

```bash
$ nvidia-smi
Mon Nov 24 12:58:42 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05              Driver Version: 580.95.05      CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA H100 80GB HBM3          On  |   00000000:04:00.0 Off |                    0 |
| N/A   38C    P0            193W /  700W |   18903MiB /  81559MiB |     25%      Default |
|                                         |                        |             Disabled |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA H100 80GB HBM3          On  |   00000000:05:00.0 Off |                    0 |
| N/A   37C    P0            199W /  700W |   18905MiB /  81559MiB |     28%      Default |
|                                         |                        |             Disabled |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            4935      C   ...und/unsloth/.venv/bin/python3      18256MiB |
|    0   N/A  N/A            4936      C   ...und/unsloth/.venv/bin/python3        630MiB |
|    1   N/A  N/A            4935      C   ...und/unsloth/.venv/bin/python3        630MiB |
|    1   N/A  N/A            4936      C   ...und/unsloth/.venv/bin/python3      18258MiB |
+-----------------------------------------------------------------------------------------+
```

{% endcode %}

両方のGPUが現在それぞれ約19GBのVRAMを使用していることがわかります！

トレーニングログを確認すると、約1.1イテレーション/秒の速度で学習できていることがわかります。このトレーニング速度はGPUを増やしてもほぼ一定のため、トレーニングのスループットはGPU数にほぼ線形に増加します！

### トレーニング指標

いくつかの短いランク16のLoRAファインチューニングを [unsloth/Llama-3.2-1B-Instruct](https://huggingface.co/unsloth/Llama-3.2-1B-Instruct) を [yahma/alpaca-cleaned](https://huggingface.co/datasets/yahma/alpaca-cleaned) データセットで実行し、複数GPUを用いたDDPトレーニングによるトレーニングスループットの改善を示しました。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FdySJnhNUzVD3gsWmPqHR%2Funknown.png?alt=media&#x26;token=9905cccb-04c8-45b1-bfb1-680823713319" alt="" width="375"><figcaption></figcaption></figure>

上の図は、500トレーニングステップにわたる2つのLlama-3.2-1B-Instruct LoRAファインチューニングのトレーニング損失を、単一GPUトレーニング（ピンク）とマルチGPU DDPトレーニング（青）で比較したものです。

損失曲線はスケールと傾向が一致している点に注意してください、しかしその他の点では *多少* 異なります。というのも *マルチGPUトレーニングはステップごとに2倍のトレーニングデータを処理するため*。このためステップごとの変動が少ない、やや異なるトレーニング曲線になります。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fz4XgknzMgljaFInMEzHc%2Funknown.png?alt=media&#x26;token=4e28e2b1-8bc8-4049-983d-e4f980f3f4cf" alt="" width="375"><figcaption></figcaption></figure>

上の図は同じ2つのファインチューニングのトレーニング進捗をプロットしたものです。

マルチGPUのDDPトレーニングは、単一GPUトレーニングの半分のステップ数でトレーニングデータのエポックを進めることに注意してください。これは各GPUがステップごとに（サイズが `per_device_train_batch_size`の）個別のバッチを処理できるためです。しかし、DDPトレーニングのステップごとの実行時間はモデルの重み更新のための分散通信のためにやや遅くなります。GPU数を増やすと、トレーニングスループットはほぼ線形に増加し続けます（ただし分散通信のための小さく増加するペナルティがあります）。

同じ損失とトレーニングのエポック進捗の振る舞いはQLoRAファインチューニングでも当てはまります。QLoRAではベースモデルを4ビット精度でロードして追加のGPUメモリを節約しており、これは限られたGPU VRAMで大規模モデルを訓練する際に特に有用です：

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FUrCEgA7OBVhc8ICkMaP6%2Funknown.png?alt=media&#x26;token=0f5de3df-77df-4ee5-bf7a-68dead857c9a" alt="" width="375"><figcaption></figcaption></figure>

500トレーニングステップにわたる2つのLlama-3.2-1B-Instruct QLoRAファインチューニングのトレーニング損失比較。単一GPUトレーニング（オレンジ）対マルチGPU DDPトレーニング（紫）。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2F8cG6rjmjeznNfgWrYdnG%2Funknown.png?alt=media&#x26;token=d1c2c1fe-c117-49b5-8e9d-fdc01154cc01" alt="" width="375"><figcaption></figcaption></figure>

同じ2つのファインチューニングのトレーニング進捗比較。
