Re Reference AI

技術

QLoRAとは

Quantized LoRA

ベースモデルを4bitに量子化して凍結し、その上にLoRAを載せて学習するメモリ効率の高いファインチューニング手法

ファインチューニング量子化

ひとことで言うと

AIモデルを圧縮した状態のまま少しだけ追加学習する方法。大きなモデルの調整が1枚のGPUでもできるようになった。

概要

QLoRAとは、ベースモデルを4bitに量子化して凍結し、その上にLoRAアダプターを載せて学習するファインチューニング手法を指す。 4bit NormalFloat(NF4)量子化量子化定数の再量子化などの工夫により、精度の低下を抑えながらメモリ使用量を削減する。 65Bパラメータ級のモデルのファインチューニングを単一の48GB GPUで可能にし、大規模モデルの個人や小規模チームによるカスタマイズを現実的にした。

歴史

2023年5月にワシントン大学のDettmersらが論文で発表した。

アーキテクチャ

ベースモデルの重みを4bitのNormalFloat(NF4)形式に量子化して凍結し、推論・学習時にはこれを一時的に元の精度(bfloat16等)へ逆量子化して計算する。量子化定数自体も8bitへ再量子化する二重量子化(Double Quantization)でメモリをさらに削減し、長いシーケンス学習時のメモリスパイクを抑えるページドオプティマイザ(Paged Optimizers)も導入されている。学習可能なパラメータは、量子化されたベースモデルに追加されたLoRAアダプターのみ。

ワークフロー

事前学習済みモデルの重みを4bit NF4形式に量子化する → LoRAアダプターを追加する → 順伝播・逆伝播時に必要な重みだけ逐次的に高精度へ逆量子化して計算する → LoRAアダプターのパラメータのみを勾配降下法で更新する。

コード例

bitsandbytesとPEFTを組み合わせた4bit量子化ロード

from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype="bfloat16",
)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf", quantization_config=bnb_config
)
model = get_peft_model(model, LoraConfig(r=16, lora_alpha=32))

利点

欠点

  • 4bitへの量子化と逆量子化の計算が加わる分、フル精度でのLoRA学習より学習時間が長くなる場合もある
  • 量子化に伴う情報の損失により、タスクによってはフル精度でのファインチューニングより精度をわずかに下回ることがある
  • 量子化・逆量子化の実装(bitsandbytes等)への依存があり、対応するハードウェア・ソフトウェア環境が必要

比較

  • LoRALoRAがベースモデルを元の精度のまま凍結するのに対し、QLoRAはベースモデルを4bitへ量子化してメモリ使用量をさらに削減する

関連用語

LoRA量子化PEFTINT4ファインチューニング

よくある質問

推論時も4bitのまま使う?

学習後にLoRAアダプターをベースモデルへ統合し、量子化なし・量子化ありのどちらでも推論できる。メモリ制約が厳しい場合は量子化した状態のまま推論することも多い。

参考文献

関連Zenn記事