70Bモデルを1枚のカードでファインチューニングする。
QLoRAは、ラック1台分を必要としていた学習ジョブを、48 GB GPU1枚で済むものに変えます。ここでは、何が収まるか、1か月でいくらかかるか、そしてこの技術がどこで通用しなくなるかを示します。
簡潔な答え
- 70BでのQLoRA
- 約61GB—シーケンス長が短ければ48GBカード1枚に収まり、80GBカードなら余裕を持って収まります
- 70Bのフルファインチューニング
- 約1,232GB—複数ノードにまたがるクラスターで、当社では貸し出していません
- その比率
- 多くのタスクで品質のほとんどに到達できる技術でありながら、メモリはおよそ20×少なく済みます
- ここでの費用
- $286/月から。カードは1回の実行のためだけでなく、月全体を通じて専有できます。
実際に収まるもの
LoRAはモデルを凍結し、各重み行列の脇に小さな低ランク行列の対を学習させます。QLoRAはさらに踏み込み、凍結された重みを4ビットで保持します。その結果、メモリに保持しておくべきものが根本的に変わります。
フルファインチューニングでは効かない理由
BF16でのフルファインチューニングは、パラメータあたり約16バイトを必要とします。重みに2バイト、その勾配に2バイト、FP32でのAdamの二つのモーメントに8バイト、それにマスターコピー分です。これは固定の倍率であり、容赦がありません。
| モデル | QLoRA | フルファインチューニング | 比率 | その意味するところ |
|---|---|---|---|---|
| Llama 3.1 8B | 13 GB | 141 GB | 11× | 24 GBカード1枚 |
| Gemma 3 27B | 27 GB | 475 GB | 17× | 48 GBカード1枚 |
| Qwen 3 32B | 31 GB | 563 GB | 18× | 48 GBカード1枚 |
| Llama 3.3 70B | 61 GB | 1,232 GB | 20× | 80 GBカード1枚 |
これらはアクティベーション分をやや多めに見込んだ、桁数レベルの概算値です。マシンを選ぶには十分ですが、特定の実行を保証するものではありません。シーケンス長とバッチサイズはQLoRAの列を大きく動かしますが、フルファインチューニングの列はほとんど動きません。固定の「パラメータあたり16バイト」が支配的だからです。
モデルごと
各モデルをQLoRAで学習できる、カタログ内の最安ノードと、その結果を推論するのに必要なマシンです。
| モデル | 学習メモリ | 学習に使う最安ノード | 推論に使う最安ノード |
|---|---|---|---|
| Llama 3.1 8B | 13 GB | NVIDIA L4 | NVIDIA L4 |
| Mistral Small 24B | 25 GB | NVIDIA RTX A6000 | NVIDIA L4 |
| Gemma 3 27B | 27 GB | NVIDIA RTX A6000 | NVIDIA L4 |
| Qwen 3 32B | 31 GB | NVIDIA RTX A6000 | NVIDIA L4 |
| Llama 3.3 70B | 61 GB | NVIDIA A100 PCIe | 2 × NVIDIA L4 |
学習に必要なのはメモリですが、推論に必要なのはメモリと帯域幅です。学習に向いたカードは安価で大容量メモリのもの、推論に向いたカードは高価で高速なものになりがちです。ここではどちらも月額制のため、一台で妥協するより、別々のマシンで動かすほうが安く済むこともよくあります。
実行する
Axolotlはコンフィギュレーターのイメージの一つとしてプリインストールされています。これは、まっさらなマシンから始める、単体カードでの一連の実行例です。
$ mkdir -p /scratch/ft && cd /scratch/ft
$ cat > qlora.yml <<'YAML'
base_model: meta-llama/Llama-3.3-70B-Instruct
load_in_4bit: true
adapter: qlora
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_linear: true
sequence_len: 2048
sample_packing: true
gradient_checkpointing: true
micro_batch_size: 1
gradient_accumulation_steps: 16
num_epochs: 2
learning_rate: 0.0001
optimizer: paged_adamw_8bit
bf16: true
datasets:
- path: /scratch/ft/data.jsonl
type: chat_template
output_dir: /scratch/ft/out
YAML
$ docker run --rm --gpus all --ipc=host --shm-size=16g \
-v /scratch/ft:/workspace -v /scratch/models:/root/.cache/huggingface \
-e HF_TOKEN="$HF_TOKEN" \
axolotlai/axolotl:main-latest \
axolotl train /workspace/qlora.yml
$ nvidia-smi dmon -s um
# If memory sits just under the card's total, you are one long batch
# away from an out-of-memory error four hours into the run.
# Lower sequence_len or micro_batch_size now, not then.
重要な設定
1か月の費用
月極めが推論よりも学習で重要になる理由は、ファインチューニングのプロジェクトが1回の実行では終わらないからです。データのバグで失敗する最初の実行があり、過学習する2回目があり、うまくいく3回目があり、さらに異なるランクで5回以上の実行が続きます。
| マシン | カードメモリ | 月額 | 向いているケース |
|---|---|---|---|
| NVIDIA L4 | 24 GB | $125/月 | 8BまでのQLoRA |
| NVIDIA RTX 5090 | 32 GB | $335/月 | 32BまでのQLoRA |
| NVIDIA A100 PCIe | 40 GB | $392/月 | 32BまでのQLoRA |
| NVIDIA RTX A6000 | 48 GB | $286/月 | 32BまでのQLoRA |
| NVIDIA A100 PCIe | 80 GB | $1,091/月 | 70BまでのQLoRA |
これを、1回の実行ではなくプロジェクト全体にわたる時間課金と比べてみてください。計算そのものは損益分岐点のガイドにまとめています。試行錯誤しながら3週間存在し続けるマシンこそ、まさに従量課金が定額契約より高くつくケースです。
LoRAが効かなくなるところ
これは非常に優れた技術であると同時に、明確な限界を持っており、何かを借りる前に自分がその限界のどちら側にいるのかを知っておく価値があります。
まったく新しい領域を教え込むこと。LoRAは振る舞いの適応には向いていますが、知識の追加は苦手です。あなたの分野を一度も見たことのないモデルは、低ランクアダプターからそれを学ぶことはありません。
語彙やトークナイザーを変更すること。新しいトークンには埋め込みの学習が必要であり、これはアダプターが触れる範囲の外にあります。
数十億トークン規模の継続事前学習を行うこと。それはフルファインチューニングにあたり、上の表の右側の列にあるマシンが必要になります。それは1ノードを超え、私たちが貸し出す範囲を超えます。
ベンチマークの最後の数ポイントを絞り出すこと。その僅差では、フルファインチューニングが依然として勝ります。その僅差のために報酬を得ているのであれば、LoRAは適したツールではありません。
それ以外のあらゆる場合、たとえばトーン、フォーマット、スキーマ、ベースモデルがすでに半分知っている領域であれば、単体カードでのQLoRAは、はるかに小さなマシンで品質のほとんどに到達します。それがトレードオフであり、実際に多くの人がファインチューニングしているモデルにおいては、良いトレードオフです。