概要
QLoRA(quantised LoRAの略)は、2つのアイデアを組み合わせています。量子化は、各数値をより少ないビット数で保存します。LoRAは、ベースモデルを凍結し、その横で小さなアダプターをトレーニングします。ベースは凍結されているため、勾配やオプティマイザーの状態を必要とせず、コンパクトに保存できます。学習に適した精度を維持する必要があるのはアダプターのみです。QLoRAは、凍結されたベースを通常の16ビットの4分の1である4ビットで保持し、その上で同じLoRAアダプターを16ビットでトレーニングします。
これは2023年にDettmersらによって導入されました。彼らの論文では、通常の16ビットのファインチューニングでは780 GB以上を必要とする650億パラメータのモデルを、16ビットのファインチューニングのタスクパフォーマンスを維持しながら、単一の48 GB GPUでファインチューニングしました。
仕組み
16ビットの重みは2バイトを消費し、4ビットの重みは半バイトを消費します。トレーニングされたモデルを破壊することなくここまで圧縮するには、論文で示された3つの要素に依存しています。
- 4-bit NormalFloat (NF4)。 トレーニングされた重みは、おおよそゼロを中心としたベルカーブに従います。NF4は、その形状に合わせて16個の可能な値を配置するため、より多くの値が重みの集中する場所に割り当てられます。論文では、通常の4ビット整数や4ビット浮動小数点数を上回る結果を示しました。
- 二重量子化。 重みは小さなブロックごとに量子化され、それぞれに独自のスケーリング定数があり、それらの定数が蓄積されます。QLoRAは定数も量子化し、重みあたりのコストを約0.5ビットから約0.13ビットに削減します。これにより、65Bモデルで約3 GB節約されます。
- ページドオプティマイザー。 長いサンプルによってメモリが急増した場合、実行がクラッシュする代わりに、オプティマイザーの状態が一時的に通常のCPUメモリに移動されます。
フォワードパスおよびバックワードパスの間、各レイヤーの4ビットの重みは16ビットに展開(逆量子化)され、そのレイヤーの演算に使用された後、破棄されます。勾配は凍結されたベースを通って、唯一変更される部分であるアダプターに流れます。どの瞬間においても、メモリにはモデル全体が4ビットで保持され、さらに1つのレイヤー分の16ビットの重みが保持されます。
bytes per weight of the frozen base
16-bit (bf16) 2 bytes
4-bit NF4 + double-quantised constants ≈ 0.52 bytes (≈ 4.13 bits)
an 8B model, frozen base only
16-bit 8 × 10⁹ × 2 bytes ≈ 16 GB
4-bit 8 × 10⁹ × 0.52 bytes ≈ 4.1 GB- 16ビットベースでのLoRA: 凍結された重みだけで約16 GBになります。アダプター、そのオプティマイザーの状態、およびアクティベーションを含めると、一般的な経験則では約19 GBになります。これでは収まりません。
- QLoRA: ベースは約4〜5 GBに縮小します。正規化レイヤーや、多くの場合埋め込みレイヤーおよび出力レイヤーなどの一部の要素は、通常16ビットのままです。アダプターと作業メモリを含めても合計は約9 GBとなり、余裕を持って収まります。
- アダプターは、同じランクのLoRAアダプターとまったく同じサイズ(数十MB)です。
- トレードオフ: すべてのレイヤーがその場で展開されるため、各ステップがやや遅くなります。
| モデル | LoRA(16ビットベース) | QLoRA(4ビットベース) |
|---|---|---|
| 8B | ~19 GB | ~9 GB |
| 14B | ~33 GB | ~13 GB |
| 27–32B | ~60–70 GB | ~22–26 GB |
これらは作業メモリを含むトレーニングの合計値であるため、完全なファインチューニングのページに記載されている、アクティベーション前の7Bモデルの4ビットベースの4〜5 GBを上回ります。共有メモリを搭載した36 GBのノートパソコン(オペレーティングシステムが使用した後に約27 GBの空きがある場合)では、通常のLoRAでは約10Bであるのに対し、QLoRAを使用すると27〜32Bのモデルをトレーニングできます。
コストと使用のタイミング
- 速度。 各ステップですべてのレイヤーを展開する処理が加わるため、同じモデルでのLoRAと比較してトレーニングがやや遅くなります。
- 品質。 結果はLoRAに非常に近くなります。論文では、ベンチマーク全体で16ビットのファインチューニングと同等の結果が示されていますが、独自の評価ではわずかな違いが生じる可能性があるため、推測に頼らず評価実行と比較してください。
- 結果。 結果は依然としてアダプターです。通常の16ビットのベースモデル、またはその4ビットのコピーに読み込みます。アダプター自体のサイズは変わりません。
- 使用のタイミング。 目的のモデルがLoRAに収まらない場合にQLoRAを使用します。収まる場合は、通常のLoRAの方が同じ結果をより速く得られます。
設定
凍結されたベースモデルを4ビットでロードするかどうかを指定します。オフの場合、16ビットのベースモデル上で通常のLoRAアダプターをトレーニングします。ステップごとの速度は上がりますが、約3倍のメモリが必要になります。オンの場合、QLoRAをトレーニングします。これは、目的のモデルがメモリに収まらない場合の選択肢です。これはアダプターにのみ適用されます。完全なファインチューニングではすべての重みが変更されるため、すべての重みをトレーニング可能な精度で保持する必要があります。
各レイヤーの演算のために4ビットの重みが展開される数値フォーマットであり、アダプターがトレーニングされるフォーマットです。bf16(bfloat16)は、32ビット浮動小数点数の範囲を16ビットで保持するため、値がオーバーフローすることはほとんどありません。NVIDIA GPUではAmpere世代以降でサポートされています。T4などの古いGPUでは、通常、範囲の狭いfp16で計算されます。
よくある間違い
- モデルがすでにLoRAに収まる場合にQLoRAを選択すること。トレーニング時間が追加されるだけです。
- より小さな結果ファイルを期待すること。アダプターはLoRAアダプターと同じサイズであり、トレーニングメモリのみが縮小します。
- 完全なファインチューニングを収めるためにQLoRAを使用しようとすること。これはアダプターにのみ適用されます。
- すでに圧縮されて公開されたモデル(FP8、MXFP4)から開始すること。QLoRAは完全精度のモデル自体を量子化するため、BF16バージョンから開始します。
- トレーニングされたモデルとは異なるモデル、またはその異なるバージョンにアダプターを読み込むこと。
参考文献および関連資料
外部ソースは新しいタブで開きます。
- 01QLoRA: Efficient Finetuning of Quantized LLMsDettmers et al., 2023 · arXiv · arxiv.org元の論文:NF4、二重量子化、ページドオプティマイザー、および単一GPUでの65Bの結果。
- 02Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRAHugging Face blog, 2023 · huggingface.co実際の4ビットロードとQLoRAトレーニングに関する分かりやすい解説。
- 03BitsandbytesHugging Face Transformers docs · huggingface.co4ビットロードのオプション:NF4、二重量子化、計算データ型。
- 04QuantizationHugging Face PEFT docs · huggingface.co
- 05LLM.int8(): 8-bit Matrix Multiplication for Transformers at ScaleDettmers et al., 2022 · arXiv · arxiv.orgQLoRAの量子化ライブラリの基盤となった、初期の8ビットに関する研究。