分散データ並列(DDP)によるマルチ GPU ファインチューニング

Unsloth CLI を使って Distributed Data Parallel(DDP)で複数 GPU 上でトレーニングする方法を学びます!

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

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

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

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

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

GitHubからUnslothをクローンしてインストールします。以下のような 仮想環境arrow-up-rightの使用を検討してください;私たちは uv venv –python 3.12 && source .venv/bin/activateを好んで使いますが、任意の仮想環境生成ツールで構いません。

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

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

このデモでは、 Qwen/Qwen3-8Barrow-up-rightyahma/alpaca-cleanedarrow-up-right チャットデータセットでファインチューニングします。これはベースモデルを望ましい会話スタイルに適応させたり、下流タスクでの性能を向上させたりする際に一般的に用いられる教師付きファインチューニング(SFT)ワークロードです。

Unsloth CLIを使いましょう!

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

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

マルチGPUトレーニング(この場合DDP)では、 torchrunarrow-up-right ランチャーを使用します。これはシングルノードまたはマルチノード設定で複数の分散トレーニングプロセスを立ち上げることを可能にします。本例では2つのH100 GPUを搭載した単一ノード(すなわち1台のマシン)ケースに焦点を当てます。

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

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

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

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

注意: あなたは torchrun ランチャーをUnslothの任意のトレーニングスクリプトで使用できます。これには scriptsarrow-up-right (無料のColabノートブックから変換したもの)も含まれ、トレーニングを>1 GPUで行うとDDPは自動的に有効になります!

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

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

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

トレーニング指標

いくつかの短いランク16のLoRAファインチューニングを unsloth/Llama-3.2-1B-Instructarrow-up-rightyahma/alpaca-cleanedarrow-up-right データセットで実行し、複数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つのファインチューニングのトレーニング進捗比較。

最終更新

役に立ちましたか?