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単体よりさらにGPUメモリを節約できる
- 65Bパラメータ級の大規模モデルのファインチューニングを、単一のワークステーション級GPUで実行可能にした
- NF4量子化やページドオプティマイザ等の工夫により、量子化に伴う精度低下を抑えている
欠点
比較
- LoRA — LoRAがベースモデルを元の精度のまま凍結するのに対し、QLoRAはベースモデルを4bitへ量子化してメモリ使用量をさらに削減する
関連用語
よくある質問
参考文献
- Research PaperQLoRA: Efficient Finetuning of Quantized LLMs (arXiv)