QLoRA概要
QLoRA(Quantized LoRA)は、LoRAの量子化バージョンであり、ベースモデルを4ビット精度に量子化することで、ファインチューニングのメモリ要件を4分の1以下に削減します。QLoRAを使用すると、24GB VRAMのRTX 4090一枚で65Bパラメータの大規模モデルをファインチューニングできます。
中核技術
QLoRAは3つの重要な技術革新を使用しています:
- NF4量子化:NormalFloat4は、正規分布する重みに最適化された4ビット量子化形式で、従来のINT4量子化よりも優れた性能を発揮します。
- 二重量子化:量子化定数自体をさらに量子化し、メモリ使用量をさらに削減します。
- ページング最適化:CPUメモリを使用して勾配チェックポイントを処理し、VRAMのOOMを回避します。
QLoRAファインチューニング実践
import torch
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
TrainingArguments
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from datasets import load_dataset
from trl import SFTTrainer
# 4ビット量子化設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True
)
# 量子化モデルの読み込み
model_name = "deepseek-ai/deepseek-llm-7b-chat"
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
trust_remote_code=True
)
# kビットトレーニングの準備
model = prepare_model_for_kbit_training(model)
# LoRA設定
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
# トレーニング
# 注意:QLoRAトレーニングでは、より小さいバッチサイズと
# より高い勾配累積ステップが必要になる場合があります
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
args=TrainingArguments(
output_dir="./qlora-output",
per_device_train_batch_size=1,
gradient_accumulation_steps=16,
learning_rate=1e-4,
num_train_epochs=3,
fp16=True,
logging_steps=10
),
tokenizer=tokenizer
)
trainer.train()メモリ使用量の比較
| 手法 | 7Bモデル | 13Bモデル | 70Bモデル |
|---|---|---|---|
| 全パラメータファインチューニング | ~56GB | ~104GB | ~560GB |
| LoRA (FP16) | ~16GB | ~28GB | ~140GB |
| QLoRA (4ビット) | ~6GB | ~10GB | ~40GB |
QLoRA調整の推奨事項
- 学習率:QLoRAでは通常より低い学習率が必要です。1e-4から2e-4が一般的な範囲です。
- バッチサイズ:量子化モデルの数値精度が低下するため、より小さいバッチサイズとより大きな勾配累積を推奨します。
- r値の選択:QLoRAでは、量子化により一部の情報が失われるため、r値を適切に増やすことができます(16〜64)。
- target_modules:gate_proj、up_proj、down_projを含むすべての線形層をカバーすることを推奨します。
注意事項
QLoRAはメモリ効率が非常に高いですが、トレーニング速度はLoRAより約30%遅く、最終的なモデル品質はLoRAよりわずかに低い可能性があります。VRAMが十分にある場合は、LoRA(FP16)を優先してください。VRAMが不足している場合は、QLoRAが最適な選択です。