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が最適な選択です。