Distributed Data Parallel(DDP)を使ったマルチ GPU ファインチューニング
Unsloth CLI を使って Distributed Data Parallel(DDP)で複数 GPU 学習する方法を学びましょう!
最終更新
役に立ちましたか?
Unsloth CLI を使って Distributed Data Parallel(DDP)で複数 GPU 学習する方法を学びましょう!
複数のGPUがあり、それらすべてを使ってモデルをファインチューニングしたいとします!そのための最も単純な戦略はDistributed Data Parallel(DDP)を使うことで、各GPUデバイスにモデルのコピーを作成し、各コピーに対してトレーニング中にデータセットから異なるサンプルを与え、各オプティマイザーステップごとに重み更新への寄与を集約します。
なぜこれを行いたいのでしょうか?GPUをトレーニングに追加するにつれて、ステップごとにモデルが学習するサンプル数が増え、各勾配更新がより安定し、追加したGPUごとにトレーニングスループットが劇的に向上するからです。
ここではUnslothのコマンドラインインターフェース(CLI)を使ってこれを行う方法をステップバイステップで説明します!
注意: UnslothのDDPはCLI経由だけでなく、あなたの任意のトレーニングスクリプトでも動作します!詳細は下記。
GitHubからUnslothをクローンしてインストールします。以下のような 仮想環境の使用を検討してください;私たちは uv venv –python 3.12 && source .venv/bin/activateを好んで使いますが、任意の仮想環境生成ツールで構いません。
git clone https://github.com/unslothai/unsloth.git
cd unsloth
pip install .このデモでは、 Qwen/Qwen3-8B を yahma/alpaca-cleaned チャットデータセットでファインチューニングします。これはベースモデルを望ましい会話スタイルに適応させたり、下流タスクでの性能を向上させたりする際に一般的に用いられる教師付きファインチューニング(SFT)ワークロードです。
まず、CLIに組み込まれたヘルプメッセージを見てみましょう(簡潔にするため各所で「...」と省略しています):
これで、モデルのトレーニングにCLIへ渡せるオプションの概要がつかめるはずです!
マルチGPUトレーニング(この場合DDP)では、 torchrun ランチャーを使用します。これはシングルノードまたはマルチノード設定で複数の分散トレーニングプロセスを立ち上げることを可能にします。本例では2つのH100 GPUを搭載した単一ノード(すなわち1台のマシン)ケースに焦点を当てます。
また、次の nvidia-smi コマンドラインツールを使ってGPUの状態を確認しましょう:
いいですね!期待通りH100が2台あります。現在は何もトレーニングしておらず、モデルもメモリにロードしていないため、両方とも0MiBのメモリ使用量です。
トレーニングを開始するには、次のようなコマンドを実行します:
もしGPUがさらにある場合は、これらを利用するために --nproc_per_node を適宜設定してください。
注意: あなたは torchrun ランチャーをUnslothの任意のトレーニングスクリプトで使用できます。これには scripts (無料のColabノートブックから変換したもの)も含まれ、トレーニングを>1 GPUで行うとDDPは自動的に有効になります!
再度確認してみましょう: nvidia-smi トレーニング中に以下を確認すると:
両方のGPUが現在それぞれ約19GBのVRAMを使用していることがわかります!
トレーニングログを確認すると、約1.1イテレーション/秒の速度で学習できていることがわかります。このトレーニング速度はGPUを増やしてもほぼ一定のため、トレーニングのスループットはGPU数にほぼ線形に増加します!
いくつかの短いランク16のLoRAファインチューニングを unsloth/Llama-3.2-1B-Instruct を yahma/alpaca-cleaned データセットで実行し、複数GPUを用いたDDPトレーニングによるトレーニングスループットの改善を示しました。

上の図は、500トレーニングステップにわたる2つのLlama-3.2-1B-Instruct LoRAファインチューニングのトレーニング損失を、単一GPUトレーニング(ピンク)とマルチGPU DDPトレーニング(青)で比較したものです。
損失曲線はスケールと傾向が一致している点に注意してください、しかしその他の点では 多少 異なります。というのも マルチGPUトレーニングはステップごとに2倍のトレーニングデータを処理するため。このためステップごとの変動が少ない、やや異なるトレーニング曲線になります。

上の図は同じ2つのファインチューニングのトレーニング進捗をプロットしたものです。
マルチGPUのDDPトレーニングは、単一GPUトレーニングの半分のステップ数でトレーニングデータのエポックを進めることに注意してください。これは各GPUがステップごとに(サイズが per_device_train_batch_sizeの)個別のバッチを処理できるためです。しかし、DDPトレーニングのステップごとの実行時間はモデルの重み更新のための分散通信のためにやや遅くなります。GPU数を増やすと、トレーニングスループットはほぼ線形に増加し続けます(ただし分散通信のための小さく増加するペナルティがあります)。
同じ損失とトレーニングのエポック進捗の振る舞いはQLoRAファインチューニングでも当てはまります。QLoRAではベースモデルを4ビット精度でロードして追加のGPUメモリを節約しており、これは限られたGPU VRAMで大規模モデルを訓練する際に特に有用です:

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

同じ2つのファインチューニングのトレーニング進捗比較。
最終更新
役に立ちましたか?
役に立ちましたか?
$ 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。
…$ 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 |
+-----------------------------------------------------------------------------------------+# 必須:
# --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$ 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 |
+-----------------------------------------------------------------------------------------+
