QLoRA — 650億パラメータのモデルをGPU 1枚で微調整する
650億パラメータのモデルは、16bitの重みだけで130GB——まだ何も学習していない状態で、である。QLoRAはこれを48GBのカード1枚に載せる。重みそのものの分布に合わせた4bit形式で凍結重みを格納し、量子化定数までもう一度量子化し、オプティマイザをCPUへページアウトする。そのうえで勾配はその4bit重みを通り抜け、小さな16bitアダプタにだけ流れ込む。
要点
- 650億パラメータのモデルは、BF16で重みだけで130GBになる。
- LoRAは を凍結して低ランク更新 だけを学習し、勾配とオプティマイザ状態をアダプタ分だけにする。
- QLoRAは凍結重みをNF4(標準正規分布の分位点に基づく16段階の4bit型)で格納し、64個ずつのブロック単位で量子化する。
- 二重量子化はスケーリング定数自体を量子化し、1パラメータあたり4.5bitを4.127bitに減らす。
- 4bitは格納のみで、計算はBF16で行い、勾配は復元された重みを通り抜けるがBF16のアダプタにだけ蓄積される。
LoRA: Low-Rank Adaptation of Large Language Models
一次資料 — この記事の根拠
論文の発表 2021-06-17→この解説の公開 2026-09-235年3か月後
QLoRA: Efficient Finetuning of Quantized LLMsarXiv:2305.14314論文ページ·PDFLoRA: Low-Rank Adaptation of Large Language ModelsEdward J. Hu, Yelong Shen, Phillip Wallis ほか · 2021-06-17 · v2arXiv:2106.09685論文ページ·PDF
原文の要旨(Abstract)を読む
An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes less feasible. Using GPT-3 175B as an example -- deploying independent instances of fine-tuned models, each with 175B parameters, is prohibitively expensive. We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks. Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times. LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3, despite having fewer trainable parameters, a higher training throughput, and, unlike adapters, no additional inference latency. We also provide an empirical investigation into rank-deficiency in language model adaptation, which sheds light on the efficacy of LoRA. We release a package that facilitates the integration of LoRA with PyTorch models and provide our implementations and model checkpoints for RoBERTa, DeBERTa, and GPT-2 at https://github.com/microsoft/LoRA.
メモリの壁を、数字で書く
自分のデータで大規模言語モデルを微調整するのは、考え方としては簡単な話です。事前学習済みの重みを持ってきて、自分の例を流し、調整する。障害になるのは機械学習とは何の関係もない、ただの算術です。
650億パラメータのモデルを考えます。重みだけで、ふつうの16bit形式 BF16(1つの数に2バイト)なら
この式が言っているのは要するに、「数の個数 × 1個あたりのバイト数」がそのままメモリの量になる、ということです。
これはモデルがじっと座っているだけの状態、勾配が1つも存在しない時点の数字です。フル微調整にはこれと同規模のものがさらに3つ必要になります——勾配(もう1コピー、約130GB)、そしてAdamオプティマイザがパラメータごとに持つ2つの統計量。慣例どおり32bitで持つと GB。活性値を足せば800GBを超え、1回の微調整のためにマルチノードのクラスタが要ることになります。
QLoRAが発表された当時、単体で手に入る最大のアクセラレータは48GB(A6000)か80GB(A100)でした。差は2倍ではありません。QLoRA(Dettmers et al., 2023)はこの差を埋めます。看板の結果はそっけないほど明快です——650億パラメータのモデルを48GBのGPU 1枚で、約1日で微調整し、16bit微調整と同等の品質に達した。この記事では、前提となるLoRAから始めて、4bitを生き延びさせる3つの仕掛けを積み上げ、最後にこの手法について最も誤解されている点を扱います。
前提: LoRAの低ランク更新
QLoRAは新しい学習アルゴリズムではありません。LoRAの「凍結された部分」を圧縮したものです。だからまずLoRAをはっきりさせておく必要があります。(全体像はLoRA vs フル微調整にあります。ここで必要なのは1段落だけです。)
微調整は重み行列 を に変えます。LoRAの賭けは、 自身とは違って変化分 は低ランクに近い——2つの細長い行列の積として書ける——というものです。ですから変化分の 行列をそのまま持って更新するのではなく、2つを持ちます。
文として読むとこうです。更新を幅 のボトルネックに通す—— が入力を 次元へ落とし、 が元の幅へ広げ直す——ので、変更の全体が 個ではなく 個の数で記述される。順伝播は
となり、 は凍結、学習するのは だけです。 の行列で なら、学習対象は 個で、 万個の代わり——128分の1です。
メモリの観点で効くのはこの帰結です。勾配とオプティマイザ状態は と の分しか存在しない。 Adamが追いかけるのが650億個ではなく数億個のアダプタパラメータになるので、520GBのAdam状態が消えます。一方でLoRAがしないことは、 を小さくすることです。凍結された130GBの重みは、順伝播のたびに掛け算に使われるので、依然としてGPU上に常駐していなければなりません。
その穴をふさぐのが、まさにQLoRAです。
メモリは実際どこへ消えているのか
650億パラメータのLoRA微調整の内訳を書き出すと、1行だけが他を圧倒しています。
| 項目 | 16bit LoRA | 理由 |
|---|---|---|
| 凍結された基盤重み | 約130GB | 2バイト×650億、常駐が必須 |
| LoRAアダプタ | 1GB未満 | パラメータ全体の1%未満のごく一部 |
| アダプタ用のAdam状態 | 2GB未満 | 8バイトだがアダプタ分だけ |
| 活性値・勾配チェックポイント | 数GB | バッチ長と系列長で変わる |
LoRAは大きなオプティマイザ項をすでに消しました。残る問題はたった1つの数字——決して変化しない130GBの重みです。そして変化しない重みは、圧縮の標的としては異常に good です。なぜなら読むことしかしないからです。小さな更新を正確に積み上げられる形式で格納しなければならないという要求がありません。その要求こそが、通常の学習で16bitや32bitを強制している当のものです。凍結された重みに求められるのは、同じ順伝播を計算できる程度の精度で読み戻せることだけです。
QLoRAの設計はすべてこの観察から出てきます。 を4bitで格納し、行列積のたびにその場で16bitへ復元し、実際に更新される部分——アダプタ——だけを完全な16bit精度で保つ。
4bitなら、650億パラメータはおよそ
要するに、1個あたりのビット数を16から4に減らせば、重みの置き場所もそのまま4分の1になる、ということです。
これで48GBのカードに、アダプタと活性値とバッチの余地を残して収まります。記事の残りは、4bitを「微調整がちゃんと成立する程度に正確」にする話です。
量子化を1段落で
量子化とは、連続した数の範囲を少数の有限な段階(レベル)で置き換え、最も近いレベルの番号だけを格納することです。4bitなら 段階が使えます。定番の手順は絶対値最大によるブロック単位量子化です。重みテンソルをブロックに切り分け(QLoRAは64個ずつ)、各ブロックについて高精度なスケーリング定数を1つ記録します。
要するに、ブロックの中で絶対値がいちばん大きい値を「物差しの長さ」として1つだけ覚えておく、ということです。
そのうえで各値を、 に最も近いレベルの番号として格納します。復元は表引きと掛け算だけ——。
ブロックに分けることには、名前を付けておくべき理由があります。テンソル全体で1つのスケールを使うと、外れ値の重み1つ——そして大規模モデルは外れ値だらけです——が を大きく引き伸ばし、そのテンソルの普通の重みすべてが同じ数段階に潰れてしまいます。小さなブロックは被害を封じ込めます。外れ値が精度を台無しにするのは自分の64人の隣人だけで、それ以外には及びません。(推論で何が変わるかを含む全体像は量子化の解説にあります。)
残る問いは、どの16段階かです。ここでQLoRAの1つめの貢献が登場します。
NF4: 重みの分布に合わせた16段階
素直な選択は、等間隔の16段階です。そしてそれは間違った選択で、理由はニューラルネットワークについての経験的事実です。学習済みの重みは層の中で近似的に正規分布に従う——0を中心とした鐘型です。等間隔のレベルは、重みがほとんど存在しない裾野に、ほとんどすべての重みが集まる中心と同じだけの精度を割り当ててしまいます。
対処は分位点量子化です。どのレベルもだいたい同じ個数の重みに使われるようにレベルを選ぶ。16個のビンが等確率なら、各ビンが分布の質量の同じ を担い、平均誤差は16個の記号で達成できる最小になります——これは分布が既知のデータに対して情報理論的に最適な選び方です。これを正直にやるなら各ブロックの実データの分位点を推定することになり、高価でノイズも乗ります。
QLoRAの近道は、分布を測るのではなく仮定することです。ブロックの重みをその絶対値最大で割ったものは に押し込められた正規分布に近いので、標準正規分布の分位点をオフラインで一度だけ計算し、その固定表をずっと使い回せます。こうして出来た4bitデータ型が NF4(4-bit NormalFloat)です。 の中の16個の値からなる固定・非等間隔の表で、0の近くは密に、 の近くは疎に並んでいます。
実装上の小さな違和感を説明してくれるので、表の細部を2つ知っておくと役に立ちます。1つめ。レベルは非対称です——負が8個、0を含む非負が8個——これは0がちょうど表現できるようにするためです。パディングやマスクは「0が0のままであること」に依存しているので、これは重要です。2つめ。両端はちょうど と に固定されているので、ブロックの絶対値最大の値は誤差なく量子化を生き延びます。
見返りは測定可能です。同じ1重み4bitで、NF4は同じモデルの4bit整数量子化や4bit浮動小数量子化よりも低いパープレキシティを出します。格納コストは同じ、忠実度は上——レベルの選び方を良くしただけで、です。
二重量子化: 定数はタダではない
ブロック単位の仕組みに戻って、正直に数えてみます。64個の重みのブロック1つにかかるコストは、64個の4bit番号とスケーリング定数 1つです。その定数が32bit浮動小数なら、1重みあたりの真のコストは4bitではなく
言い換えると、32bitの定数1つを64個の重みで割り勘にしているので、1個あたり0.5bitずつ上乗せされている、ということです。
帳簿の裏に、0.5bitのオーバーヘッドが隠れていたわけです。650億パラメータなら GBが定数に費やされている——48GBのカードでは無視できない割合で、「載る/載らない」を分ける量です。
二重量子化は、問題が見えれば自明な一手です。スケーリング定数もまた数の並びにすぎないので、それを量子化する。QLoRAはFP32の定数を256個ずつまとめ、8bit浮動小数として格納し、そのための第2段のFP32定数を1つ持ちます。1重みあたりのコストはこうなります。
項ごとに読むと、4bitは重みの番号。 は、8bitの第1段定数1つが64個の重みに分散されるから。 は、32bitの第2段定数1つが 個の重みに分散されるから。節約分は bit/パラメータ、650億パラメータなら約 3GB の回収です。割合としては小さく、瀬戸際では決定的な量です。
これが安全である理由を説明する細部が1つあります。定数を量子化する前に、その平均を引いて0中心にします。定数はすべて正の絶対値最大値であり、8bit浮動小数は精度を正負対称に使うので、先に中心化しておかないと表現可能な範囲の半分が無駄になるのです。
ページ化オプティマイザ: 山を越える
3つめの仕掛けは圧縮の話ではありません。学習中のGPUメモリ使用量は平坦ではなく、跳ねるという事実への対処です。長い系列、運の悪いバッチ、あるいは勾配チェックポイント(活性値を保存する代わりに逆伝播時に再計算して、計算量とメモリを交換する手法)の再計算ステップ。これらが一瞬だけ需要をカードの容量の上へ押し上げることがあります。そうなるとプロセスはout-of-memoryで死に、1日分の学習が消えます。
QLoRAのページ化オプティマイザはNVIDIAのunified memoryを使って、オプティマイザ状態に逃げ道を与えます。GPUが圧迫されると、オプティマイザ状態のページが自動でCPU RAMへ追い出され、オプティマイザのステップが必要とするときに戻ってきます。OSのスワップファイルと同じ考えを、特定の1つの割り当てに適用したものです。
それが何であり、何でないかに注意してください。定常状態のメモリを減らすわけではなく、載らないモデルを学習させる手段でもありません。「ときどき致命的に落ちる」を「ときどき遅くなる」に変換するだけです。控えめに聞こえる性質ですが、不可欠です。「ときどき遅い」の対抗馬は「19時間目で落ちていた」なのですから。
勾配は実際どこへ行くのか
ここが最も読み間違えられる部分なので、正確に述べる価値があります。QLoRAには、別々の仕事をする2つの数値形式があります。
- 凍結された基盤重み のための格納用データ型 — NF4
- 演算が触れるすべてのための計算用データ型 — BF16
4bitでは何も計算していません。 行列積のたびに、必要な4bitブロックがその場でBF16へ復元され、使われ、捨てられます。QLoRA層の順伝播は
つまりLoRAの の に関数を1つ被せただけです。
では逆伝播を1文で。勾配は量子化された重みを「通り抜ける」が、「積み上げられる」先はアダプタだけ。 2つの半分は混同しやすいので、開いておきます。
- 層の入力に関する勾配——誤差信号が手前の層まで届くのはこれのおかげです——を計算するには が要ります。だから連鎖律は本当に量子化された重みの中を通り、必要に応じて復元されます。これが無ければ最終層より下は何も学習できません。
- しかし は凍結されています。 に関する勾配は一度も保存されず、 のためのオプティマイザ状態は一度も確保されず、 に書き込まれることもありません。ステップを生き延びる を持つパラメータは、BF16の と だけです。
だからこの量子化は、学習する重みに求められるような「可逆性」を持つ必要がありません。4bitの表現は、小さな勾配更新の列を積み上げるにはあまりにも粗い——往復を繰り返せばどの更新も0に量子化されてしまいます。QLoRAはそれを一度も要求しません。4bitのテンソルは実行の全期間を通じて読み取り専用で、繊細な積み上げはすべて、完全精度を払える程度に小さい16bitアダプタの中で起きます。
看板の実験結果も、これで説明がつきます。QLoRAは、基盤重みが4bitであるにもかかわらず、命令チューニングのベンチマークで16bitのフル微調整および16bit LoRAと同等の品質を報告しています。量子化誤差は事前学習済みモデルに対する固定された・凍結された摂動であり——そしてアダプタは摂動された後のモデルの上で学習されるので、その誤差を打ち消す補正を学ぶ自由があります。学習で対抗できる固定誤差は、ステップごとの丸め誤差よりずっと弱い制約なのです。
予算をもう一度数える
3つの仕掛けを合わせて、650億パラメータをカード1枚に載せる算術をやり直します。
| 項目 | フル微調整(BF16+Adam) | 16bit LoRA | QLoRA |
|---|---|---|---|
| 基盤重み | 130GB | 130GB | 約33.5GB(4.127bit) |
| 基盤の勾配 | 約130GB | 0 | 0 |
| 基盤のAdam状態 | 約520GB | 0 | 0 |
| アダプタ+そのAdam状態 | — | 約2GB | 約2GB |
| 活性値(チェックポイント併用) | 数GB | 数GB | 数GB |
| 合計 | 780GB超 | 130GB超 | 48GB未満 |
働いたのは別々の2つのアイデアであり、分けて覚えておく価値があります。LoRAがオプティマイザ項と勾配項を殺した——650GB分です。4bit量子化が重み項の4分の3を殺した——130GBが33.5GBに。どちらか片方だけではカードの外に出てしまい、両方揃って中に着地します。
論文がこれを実証したのが Guanaco、この方式で微調整されたモデル群です。650億パラメータ版は48GBのGPU 1枚で約24時間で学習され、論文はGPT-4を審判としたVicunaベンチマークでChatGPTのスコアの99.3%に達したと報告しています——この数字は、正確な値というより方向性を示すものとして扱うのが妥当です。LLMを審判に使うベンチマークはノイズが大きく、冗長で整った書式の回答を好む傾向があるからです。その下にある頑健な主張は、統制された比較のほうです。条件を揃えたとき、QLoRAの微調整は16bitの微調整と同水準に並んだ——これがメモリ節約を「トレードオフ」ではなく「タダ」にしています。
コードで見る
実務でNF4を自分で実装することはありません。bitsandbytes ライブラリがデータ型と「復元と積を融合したカーネル」を提供し、transformers と peft が配線してくれます。手法の全体が、設定オブジェクト1つと4行です。
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import torch
qcfg = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # 素のint4ではなく分位点の表
bnb_4bit_use_double_quant=True, # スケーリング定数も量子化する
bnb_4bit_compute_dtype=torch.bfloat16, # 格納は4bit・演算は16bit
)
model = AutoModelForCausalLM.from_pretrained("<base-model>", quantization_config=qcfg)
model = prepare_model_for_kbit_training(model, use_gradient_checkpointing=True)
model = get_peft_model(model, LoraConfig(
r=64, lora_alpha=16, lora_dropout=0.05, task_type="CAUSAL_LM",
# QLoRAの知見: attentionのq/vだけでなく「すべての」線形層に付ける
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
))
model.print_trainable_parameters() # 通常はパラメータ全体の1%を大きく下回る
あとはオプティマイザに paged_adamw_32bit を指定してページング挙動を得て、ふつうの学習ループを回すだけです。どの行も上の節に対応しています。bnb_4bit_quant_type がNF4、use_double_quant が「定数の定数」の技、compute_dtype が格納と計算の分離、target_modules がアブレーションの結果、オプティマイザ名がスパイクへの保険です。
落とし穴
推論は速くなりません。 これが最も多い読み違いで、設計から直接導かれる帰結です。行列積のたびに以前は払っていなかった復元コストを払うようになり、演算そのものは依然BF16で走ります。ですからバッチ推論のような計算律速の仕事では、4bit NF4は素のBF16よりトークンあたり遅いのが普通で、速くはなりません。4bitが買ってくれるのは、モデルが載ること、そしてメモリ帯域律速の生成(小バッチ・1トークンずつ)で読む量が減ることです。規模でのスループットが目的なら、正しい道具は対応カーネルを備えた推論向けの量子化方式であって、ここで説明した学習向けのものではありません。
QLoRAの学習1ステップは16bit LoRAの1ステップより遅いです。 理由は同じ。時間をメモリと交換しているのであり、この交換が得なのは16bitではそもそも載らないときだけです。
アダプタを4bitの基盤にきれいにマージすることはできません。 LoRAの嬉しい性質——学習後に を に畳み込んで、推論オーバーヘッド0の普通のモデルとして出荷できる——には、 が小さな加算変化を吸収できる形式であることが必要です。BF16の をNF4の に足して再量子化すると、学習した内容の多くが失われます。定番の経路は、基盤を16bitで読み込み、そこでマージし、必要なら結果を量子化する。つまりマージするマシンは16bitのモデルを保持できるメモリを必要とする——学習したマシンはそれを必要としなかったのに、です。
線形層は全部にアダプタを付ける。 論文のアブレーションでは、LoRAをattentionの射影だけに限るとフル微調整に対して測定可能な差が残り、すべての線形層にアダプタを付けるとその差が閉じました。ランクよりも網羅のほうが効いたのです。QLoRAの実行結果が思わしくないときに最初に見るべきは ではなく target_modules のリストです。
ベースラインが動いています。 4bitのモデルは出発点のモデルではありません——量子化が摂動を与えています。微調整が何を寄与したのか知りたいなら、量子化済み・アダプタ無しのモデルをベースラインとして評価してください。適応済みの4bitモデルを量子化前の16bit原本と比べると、2つの別の効果を混ぜてしまいます。
ページングの経路は環境依存です。 ページ化オプティマイザはCUDAのunified memoryと、追い出されたページを受け止められるだけのホストRAMに依存します。Linux/NVIDIAの機能であり、システムメモリに余裕がないマシンでは助けになりません。
現場ではこう使う
QLoRAに触るのは、主に手元のGPU 1〜数枚で、公開済みの基盤モデルを自社データ(社内文書、問い合わせ履歴、特定ドメインの指示データなど)に合わせたいMLエンジニアです。典型的な場面は「16bitのLoRAを試したらOOMで落ちた」「クラスタを借りる前に、1枚で効果があるか確かめたい」ときです。
実際に触るつまみ。 上のコードの設定がほぼすべてです。
BitsAndBytesConfigのload_in_4bit/bnb_4bit_quant_type="nf4"/bnb_4bit_use_double_quant/bnb_4bit_compute_dtype— 格納形式と計算形式を決める4つLoraConfigのr/lora_alpha/lora_dropout/target_modules— アダプタの形と置き場所- 学習側の
optim="paged_adamw_32bit"とgradient_checkpointing— メモリの山を越えるための2つ - 学習後の
merge_and_unload()(peft)— アダプタを基盤に畳み込む操作。前述のとおり16bitで読み込んだ基盤に対して行う
判断の順番。 まず16bit LoRAが載るかを見積もり、載るならそちらを使う(1ステップが速い)。載らないときに初めてQLoRAに切り替える。結果が悪ければ、r を上げる前に target_modules が全線形層を覆っているかを確かめる。ピークメモリは推測せず、torch.cuda.max_memory_allocated() を数ステップ分ログに出して実測してから、バッチサイズと系列長を詰めます。
知らないと事故になる落とし穴。
bnb_4bit_compute_dtypeを書き忘れる。 明示しないとライブラリの既定値で計算され、意図したBF16にならないことがあります。速度も数値の振る舞いも変わるので、必ず明示する。- GPUがBF16に対応していない。 BF16はAmpere世代以降のNVIDIA GPUが前提です。古いカードでは
compute_dtypeをFP16にするなどの切り替えが要り、そのぶん数値の安定性に注意が要ります。 - アダプタだけ保存して、基盤の読み込み条件を控えていない。 保存されるのは小さな だけです。後で使うときは同じ基盤モデル・同じ量子化設定で読み込まないと、学習時と違うモデルの上にアダプタを載せることになります。基盤のリビジョンと
BitsAndBytesConfigの中身は、アダプタと一緒に記録しておく。 - 評価を量子化前の原本と比べる。 落とし穴の節のとおり、比較対象は「量子化済み・アダプタ無し」です。
面接や設計レビューで問われる問い。
- 「QLoRAで学習が遅くなったのはなぜか」→ 行列積のたびにNF4をBF16へ復元しているから。時間をメモリと交換している、と答える。
- 「4bitなのに勾配はどう流れるのか」→ 勾配は復元した重みを通り抜けて手前の層へ届くが、蓄積されるのはBF16のアダプタだけ。4bitのテンソルには一度も書き込まない。
- 「学習済みアダプタを本番に出すとき何が要るか」→ 16bitの基盤を保持できるメモリ上でマージするか、マージせずに基盤+アダプタのまま配信するかを選ぶ。前者はマージ作業にメモリが要り、後者は推論時にアダプタ分の計算が乗る。
低ランク近似そのものの感覚をつかみ直したいときは、SVDと低ランク近似も手がかりになります。
まとめ
- 650億パラメータのモデルはBF16で130GBの重みであり、勾配とAdam状態まで数えるとフル微調整にはその約6倍が必要になる
- LoRAは を凍結して低ランク更新 だけを学習し、勾配項とオプティマイザ項を消す。ただし は小さくならない
- QLoRAは NF4 で を1パラメータ約4.127bitに縮める。NF4は「学習済みの重みが近似的に従う正規分布」に合わせた16段階の分位点表で、64個ずつのブロック単位で適用される
- 二重量子化はブロックごとのスケーリング定数自身を圧縮し、1パラメータ約0.37bit(650億なら約3GB)を回収する
- ページ化オプティマイザはメモリのスパイク時にオプティマイザ状態をCPU RAMへ追い出し、クラッシュを「遅いステップ」に変える
- 格納は4bit・計算は16bit。重みはその場で復元され、勾配はそこを通り抜け、更新されるのはBF16のアダプタだけ
- 量子化誤差は凍結されているので、アダプタはそれを補正するよう学習できる。だから4bitの微調整が16bitの品質に並ぶ
- 買えるのはメモリであって速度ではない。推論も学習ステップも16bit版よりやや遅くなる
低ランクの側を埋めたいならLoRA論文の解説から、NF4の下にある数値形式は数値形式と量子化の解説をどうぞ。
確認問題
- QLoRAは凍結重みを4bitで格納しているのに、16bit微調整と同等だと主張します。4bitの重みを直接学習しようとした場合と違って、なぜ量子化誤差が数千ステップにわたって積み上がらないのでしょうか。
- ブロックサイズ64・FP32のスケーリング定数だと、1パラメータの実コストは4bitではなく4.5bitになります。この余分な0.5bitはどこから来ていて、ブロックサイズを1024に上げると何が起きますか。
- 同僚が「微調整をQLoRAに切り替えたら推論エンドポイントが遅くなった」と報告してきました。これはバグですか。理由を説明してください。
- NF4はなぜ非等間隔のレベルを使うのでしょうか。学習済みニューラルネットの重みのどんな性質が、それを有利にしているのですか。
- 700億パラメータの基盤モデルでQLoRAアダプタを学習し、これをマージ済みの16bitモデル1本として配備したいとします。学習マシンには必要なかったのに必要になるものは何で、それはなぜですか。
解答
- 4bitのテンソルには一度も書き込まないからです。勾配は復元された重みを通り抜けて手前の層に届きますが、 に積み上げられる勾配はありません。更新はすべてBF16のアダプタ ・ に着地します。したがって量子化誤差は、学習開始前に一度だけ適用された事前学習済みモデルへの固定された摂動であり、アダプタは摂動後のモデルの上で学習されるのでそれを補正する術を学べます。4bitの重みを直接学習すると、代わりに毎ステップ後に再量子化が起き、小さな更新のたびに0へ丸められてしまいます。
- ブロックごとのスケーリング定数からです。32bit浮動小数1つを64個の重みで分け合うと bit/重み。ブロックサイズを1024にすればこのオーバーヘッドは bitまで縮みますが、同時に1つのスケールが1024個の値を覆うことになり、外れ値1つがブロックの絶対値最大を引き伸ばして、はるかに多くの隣人の解像度を潰します。QLoRAは逆の道を採ります——ブロックは小さく保ち、代わりに定数を圧縮する(二重量子化)。
- バグではなく、予期される挙動です。行列積のたびにNF4のブロックをBF16へ復元してから計算し、演算自体は依然BF16で走ります。これは純粋に増えた仕事なので、計算律速の推論では4bitはトークンあたり16bitより遅くなります。QLoRAの成果物は「本来載らないメモリにモデルを載せること」であって、スループットではありません。
- 学習済みの重みは層の中で近似的に正規分布に従う——0の近くに密集し、裾は薄い——からです。等間隔のレベルだと、ほぼ空の裾野に、混雑した中心と同じだけの精度を割いてしまいます。分位点による配置は16段階のそれぞれがほぼ等しい確率質量を担うようにし、記号数を固定したときの期待誤差を最小化します。
- 基盤モデルを16bitで保持できるメモリ——700億パラメータなら約140GB——です。 はNF4のテンソルへ正確に畳み込めないからです。マージは16bit精度で行う必要があり、その後で望むなら再量子化できます。学習マシンがこれを免れていたのは、 に書き込む必要が一度も無かったからにすぎません。
コメント
コメントにはログインが必要です