
QLoRA をシュッと理解する
先日、ようやっと LoRA についてある程度理解できた。
と、思ったら??
何やら QLoRA というやべぇのが新たに登場したらしい。
論文達よ。そろそろ私に眠る時間をくれないか??
しかし、凄いというならできる限り理解するっきゃないでしょ(^^)/
ということで、いつものように論文を ChatGPT 先生にお渡ししてあれこれ質問しながらシュッと教えを乞うてみた。
QLoRA: Efficient Finetuning of Quantized LLMs
ふむ。名前からして LoRA さんと同じようなものであるというのは雰囲気でわかる。
しかし Q とは?まさに Question である。
一番わかりやすい結論からシュッといきますよ!!
想像してみてください、QLoRA(クローラ)というスーパーヒーローがいます。このヒーローの特殊能力は、巨大な図書館(これが大規模な言語モデル)にある膨大な量の本(これがパラメータ)をすべて読むことができ、その情報を頭に入れることです。しかし、クローラの頭脳(これが48GBのGPU)は限られた容量しかないため、すべての情報を詳細に覚えておくことはできません。
そこでクローラは、特殊な能力を使って、本の情報を小さなメモ(これが4ビット量子化)にまとめ、それを頭に入れます。これにより、クローラは巨大な図書館の情報をすべて頭に入れることができます。
しかし、メモは詳細な情報を欠いているため、クローラは新たな能力を使って、メモを元に新しい情報を学びます。これがアダプタ(LoRA)の部分です。
さらに、クローラは3つの特殊な技を使って、頭脳の容量を最大限に活用します
4ビットNormalFloat(NF4)
これは、メモを最も効率的に書くための特殊な技です。
Double Quantization
これは、メモをさらに小さくまとめる技です。
Paged Optimizers
これは、頭脳の容量が一時的に足りなくなったときに、一部の情報を一時的に忘れて、新しい情報を学ぶ技です。
このようにして、クローラは巨大な図書館の情報をすべて頭に入れ、新しい情報を学び、さまざまな問題を解決することができます。しかし、クローラも完璧ではなく、いくつかの問題に対してはまだ解決策を見つけられていません。それでも、クローラは常に新しい情報を学び、自分の能力を向上させるために努力しています。
わ、、、わかりやすすぎるぅぅぅぅぅ( ゚Д゚)
もはや追加説明することもないでしょう。。。
LoRA と何が違うの?
ま、ここが気になるポイントですわね。
ポイントは Q !!
Quantized !!
量子化 !!
Yeah !!
はい。
詳しく知りたい方は論文を読むとよいのですが、シュッとまとめると。
LoRA はレイヤーに対してアダプターを重ねますのよ。
QLoRA はベースモデルのパラメーターを量子化(ちっちゃくする)してから、それを考慮した最適なアダプターを重ねますの。
シュッとまとめないと、、、
4ビットNormalFloat(NF4)
これは新しいデータ型で、ゼロを中心にした正規分布したデータに対して情報理論的に最適です。このデータ型は、各量子化ビン(特定のビット組み合わせ)に等しい期待値の値が存在するように設計されています。これは、データが正規分布に従っている場合、各ビンが同じ頻度で使用されることを意味します。この特性により、NF4は他の4ビットデータ型(例えば、通常の浮動小数点数)よりも高い精度を提供します。
Double Quantization(DQ)
これは量子化定数をさらに量子化するプロセスで、メモリフットプリントをさらに削減します。一般的に、小さなブロックサイズは高精度の4ビット量子化に必要ですが、それは一方でメモリオーバーヘッドを大きくします。例えば、32ビットの定数と64のブロックサイズを使用すると、量子化定数は平均でパラメータあたり0.5ビットを追加します。Double Quantizationは、この量子化定数のメモリフットプリントを削減します。具体的には、第一量子化の量子化定数を第二量子化の入力として扱い、量子化定数の量子化定数と量子化テンソルを生成します。このプロセスにより、パラメータあたりのメモリフットプリントは0.5ビットから0.127ビットに削減されます。
Paged Optimizers
これはNVIDIAの統一メモリ機能を利用したもので、GPUが一時的にメモリ不足になった場合でもエラーなくGPU処理を行うことができます。この機能は、CPU RAMとディスク間の通常のメモリページングのように動作します。Paged Optimizersは、オプティマイザの状態にページドメモリを割り当て、GPUがメモリ不足になったときに自動的にCPU RAMに退避し、オプティマイザの更新ステップでメモリが必要になったときにGPUメモリにページバックします。これにより、長いシーケンス長のミニバッチを処理するときにのみ発生するページングを管理することができます。
みたいな手法を使って軽量化しつつ精度を落とさないようにしてるのでございますわよ~
つまりメモリ効率がとってもいいのですわ~
ということはメモリをたくさん使う大規模モデルの学習もできそうな感じなのですわ~
ということでシュッと書いたので終わり。