bitsandbytes、4ビットの量子化、そしてQLoRAを使用して、LLMをさらに利用しやすくする
'bitsandbytes、4ビットの量子化、QLoRAを使用して、より使いやすいLLMへ'
LLMは大きいことで知られており、一般のハードウェア上で実行またはトレーニングすることは、ユーザーにとって大きな課題であり、アクセシビリティも困難です。私たちのLLM.int8ブログポストでは、LLM.int8論文の技術がtransformersでどのように統合され、bitsandbytes
ライブラリを使用しているかを示しています。私たちは、モデルをより多くの人々にアクセス可能にするために、再びbitsandbytesと協力することを決定し、ユーザーが4ビット精度でモデルを実行できるようにしました。これには、テキスト、ビジョン、マルチモーダルなどの異なるモダリティの多くのHFモデルが含まれます。ユーザーはまた、Hugging Faceのエコシステムからのツールを活用して4ビットモデルの上にアダプタをトレーニングすることもできます。これは、DettmersらによるQLoRA論文で今日紹介された新しい手法です。論文の概要は以下の通りです:
QLoRAは、1つの48GBのGPUで65Bパラメータモデルをフィントゥーニングするためのメモリ使用量を十分に削減しながら、完全な16ビットのフィントゥーニングタスクのパフォーマンスを維持する効率的なフィントゥーニングアプローチです。QLoRAは、凍結された4ビット量子化された事前学習言語モデルをLow Rank Adapters(LoRA)に逆伝搬させます。私たちの最高のモデルファミリーであるGuanacoは、Vicunaベンチマークで以前に公開されたすべてのモデルを上回り、ChatGPTのパフォーマンスレベルの99.3%に達しますが、1つのGPUでのフィントゥーニングには24時間しかかかりません。QLoRAは、パフォーマンスを犠牲にすることなくメモリを節約するためのいくつかの革新を導入しています:(a)通常分布された重みに対して情報理論的に最適な新しいデータ型である4ビットNormalFloat(NF4)(b)量子化定数を量子化して平均メモリフットプリントを減らすためのダブル量子化、および(c)メモリスパイクを管理するためのページドオプティマイザ。私たちはQLoRAを使用して1,000以上のモデルをフィントゥーニングし、高品質のデータセットを使用した指示の追跡とチャットボットのパフォーマンスの詳細な分析を提供しています。これは通常のフィントゥーニングでは実行不可能である(例えば33Bおよび65Bパラメータモデル)モデルタイプ(LLaMA、T5)とモデルスケールを横断したものです。私たちの結果は、QLoRAによる小規模な高品質データセットでのフィントゥーニングが、以前のSoTAよりも小さいモデルを使用しても最先端の結果をもたらすことを示しています。さらに、ヒューマンとGPT-4の評価に基づいてチャットボットのパフォーマンスの詳細な分析を提供し、GPT-4の評価がヒューマンの評価に対して安価で合理的な代替手段であることを示しています。さらに、現在のチャットボットのベンチマークは、チャットボットのパフォーマンスレベルを正確に評価するための信頼性がないことがわかります。レモンピックされた分析では、GuanacoがChatGPTに比べてどこで失敗するかを示しています。私たちは4ビットトレーニングのためのCUDAカーネルを含む、すべてのモデルとコードを公開しています。
リソース
このブログポストとリリースには、4ビットモデルとQLoRAを始めるためのいくつかのリソースがあります:
- 元の論文
- 基本的な使用法Google Colabノートブック-このノートブックでは、4ビットモデルとその変種を使用した推論の方法、およびGoogle ColabインスタンスでGPT-neo-X(20Bパラメータモデル)を実行する方法を示しています。
- フィントゥーニングGoogle Colabノートブック-このノートブックでは、Hugging Faceエコシステムを使用してダウンストリームタスクで4ビットモデルをフィントゥーニングする方法を示しています。Google ColabインスタンスでGPT-neo-X 20Bをフィントゥーニングすることが可能であることを示しています。
- 論文の結果を再現するための元のリポジトリ
- Guanaco 33b playground-または以下のプレイグラウンドセクションをチェック
はじめに
モデルの精度と最も一般的なデータ型(float16、float32、bfloat16、int8)について詳しく知りたくない場合は、これらの概念の詳細について視覚化を含めた簡単な言葉で説明している私たちの最初のブログポストの紹介を注意深くお読みいただくことをお勧めします。
詳細については、このwikibookドキュメントを通じて浮動小数点表現の基本を読むことをお勧めします。
最近のQLoRA論文では、4ビットFloatと4ビットNormalFloatという異なるデータ型を探求しています。ここでは、理解しやすい4ビットFloatデータ型について説明します。
FP8とFP4は、それぞれFloating Point 8ビットおよび4ビット精度を表しています。これらは浮動小数点値のミニフロートファミリーの一部です(他の精度にはbfloat16とfloat16も含まれます)。
まず、FP8形式で浮動小数点値を表す方法を見てみましょう。次に、FP4形式がどのように見えるかを理解しましょう。
FP8形式
前回のブログ記事で述べたように、浮動小数点数はnビットを含み、各ビットは数値の要素(符号、仮数部、指数部)を表すための特定のカテゴリに属します。これらは以下を表します。
FP8(浮動小数点8)形式は、「FP8 for Deep Learning」という論文で最初に紹介されました。この形式には、E4M3(4ビットの指数部と3ビットの仮数部)とE5M2(5ビットの指数部と2ビットの仮数部)の2つの異なるFP8エンコーディングがあります。
32ビットから8ビットにビット数を減らすことで精度は大幅に低下しますが、どちらのバージョンもさまざまな状況で使用することができます。現在は、加速度を介してHFエコシステムとも連携しているTransformer Engineライブラリを使用することができます。
E4M3形式で表現できる潜在的な浮動小数点数の範囲は-448から448であり、E5M2形式では指数部のビット数が増えることによって範囲が-57344から57344に広がりますが、可能な表現の数は一定ですので精度が低下します。E4M3が順方向の計算に最も適しており、第2バージョンは逆方向の計算に最も適していることが経験的に証明されています。
FP4形式の精度を簡潔に
符号ビットは符号(+/-)を表し、指数ビットはビットで表される整数の2の累乗(例:2^{010} = 2^{2} = 4
)を表します。仮数または仮数部は、各ビットが「1」であるときに「有効」となる負二乗の累乗の和です。ビットが「0」の場合、そのビットの位置を表すiに対して、仮数は2の累乗2^-i
に対して変化しません。たとえば、仮数部が1010の場合、(0 + 2^-1 + 0 + 2^-3) = (0.5 + 0.125) = 0.625
となります。値を得るためには、仮数に1を加えてすべての結果を掛け合わせます。たとえば、指数ビットが2つ、仮数ビットが1つの場合、表現1101は以下のようになります:
-1 * 2^(2) * (1 + 2^-1) = -1 * 4 * 1.5 = -6
FP4には固定された形式はなく、したがってさまざまな仮数部/指数部の組み合わせを試すことができます。一般的には、ほとんどの場合で3つの指数ビットがやや優れていますが、2つの指数ビットと1つの仮数ビットの組み合わせがより良いパフォーマンスを発揮することもあります。
QLoRA論文、量子化された大規模トランスフォーマーモデルの民主化の新しい方法
要点を述べると、QLoRAは、通常の16ビットモデルの微調整と比較して、LLMのメモリ使用量を削減することなく性能を維持します。この方法により、33Bモデルの微調整は単一の24GB GPU上で行うことができ、65Bモデルの微調整は単一の46GB GPU上で行うことができます。
具体的には、QLoRAは事前学習済み言語モデルを4ビットの量子化を使用して圧縮します。LMパラメータは凍結され、比較的少数のトレーニング可能なパラメータがLow-Rank Adaptersの形式でモデルに追加されます。微調整中、QLoRAは凍結された4ビットの量子化された事前学習済み言語モデルからLow-Rank Adaptersへの勾配を逆伝播させます。LoRAレイヤーのみがトレーニング中に更新されるパラメータです。LoRAについて詳しくは、元のLoRA論文を参照してください。
QLoRAは、ベースモデルの重みには一般的に4ビットのNormalFloatというストレージデータ型を使用し、計算には16ビットのBrainFloatという計算データ型を使用します。QLoRAは、順方向および逆方向のパスを実行するために、重みをストレージデータ型から計算データ型に復元しますが、LoRAパラメータに対してのみ重みの勾配を計算します。重みは必要な時にのみ復元されるため、トレーニングおよび推論中のメモリ使用量を低く抑えることができます。
QLoRA微調整は、さまざまな実験で16ビットの微調整手法と一致することが示されています。さらに、QLoRA微調整を使用したGuanacoモデルは、OpenAssistantデータセット(OASST1)でのLLaMAモデルにおいて、ChatGPTに近いベンチマークである最先端のチャットボットシステムです。これは、QLoRA微調整のパワーを示す追加のデモンストレーションです。
より詳細な読み物については、QLoRAの論文を読むことをおすすめします。
transformersでの使用方法は?
このメソッドのtransformers統合を紹介し、使用方法と効果的に量子化できるモデルについて説明します。
始めるには
クイックスタートとして、(この記述時点では)accelerateとtransformersをソースからインストールし、bitsandbytesライブラリの最新バージョン(0.39.0)がインストールされていることを確認すると、4ビットでモデルをロードする方法を説明します。
pip install -q -U bitsandbytes
pip install -q -U git+https://github.com/huggingface/transformers.git
pip install -q -U git+https://github.com/huggingface/peft.git
pip install -q -U git+https://github.com/huggingface/accelerate.git
クイックスタート
4ビットでモデルをロードする基本的な方法は、load_in_4bit=True
引数をfrom_pretrained
メソッドに渡すことです。デバイスマップを提供する場合には、デバイスマップを自動的に推論するために"auto"
を渡します。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m", load_in_4bit=True, device_map="auto")
...
以上が必要なすべてです!
一般的なルールとして、モデルがdevice_map
でロードされた後は、ユーザーに手動でデバイスを設定しないことをお勧めします。したがって、その行以降でモデルやモデルのサブモジュールへのデバイスの割り当て呼び出しは避けるべきです – ただし、自分がやっていることを理解している場合は除きます。
量子化モデルをロードすると、他のモデルのサブモジュールも自動的にfloat16
dtypeにキャストされます。この動作を変更することもできます(たとえば、レイヤーの正規化をfloat32
で行いたい場合など)torch_dtype=dtype
をfrom_pretrained
メソッドに渡すことで。
高度な使用法
NF4(正規化float 4(デフォルト))や純粋なFP4のような4ビット量子化のさまざまなバリアントを試すことができます。論文の理論的な考慮事項と実験結果に基づいて、パフォーマンスの向上のためにNF4量子化の使用を推奨します。
その他のオプションには、bnb_4bit_use_double_quant
(最初の量子化後に2回目の量子化を行い、パラメータごとに追加の0.4ビットを節約する)があります。最後に、計算タイプです。4ビットのbitsandbytesは重みを4ビットで保存しますが、計算は16ビットまたは32ビットで行われ、ここでは任意の組み合わせが選択できます(float16、bfloat16、float32など)。
行列乗算とトレーニングは、16ビットの計算dtype(デフォルトのtorch.float32)を使用すると高速化されます。これらのパラメータを変更するためにtransformersの最近のBitsAndBytesConfig
を活用するべきです。以下はNF4量子化を使用して4ビットでモデルをロードする例で、計算dtypeをbfloat16に設定して高速なトレーニングを行います:
from transformers import BitsAndBytesConfig
nf4_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
model_nf4 = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=nf4_config)
計算dtypeの変更
上記のように、BitsAndBytesConfig
のbnb_4bit_compute_dtype
引数を変更するだけで、量子化されたモデルの計算dtypeも変更することができます。
import torch
from transformers import BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
ネストされた量子化
ネストされた量子化を有効にするには、BitsAndBytesConfig
のbnb_4bit_use_double_quant
引数を使用します。これにより、最初の量子化の後に2回目の量子化が行われ、パラメータごとに追加の0.4ビットが節約されます。私たちはトレーニングGoogle colabノートブックでもこの機能を使用しています。
from transformers import BitsAndBytesConfig
double_quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
)
model_double_quant = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=double_quant_config)
そしてもちろん、セクションの最初に述べたように、これらのコンポーネントはすべて組み合わせることができます。これらのパラメータを組み合わせて、最適なユースケースを見つけることができます。一つの目安は次の通りです:メモリの問題がある場合はダブルクォントを使用し、より高い精度のためにNF4を使用し、より高速なファインチューニングのために16ビットのdtypeを使用します。たとえば、推論デモでは、ネストされた量子化、bfloat16の計算dtype、およびNF4の量子化を使用して、gpt-neo-x-20b(40GB)を4ビットで完全に16GBのGPUに収めています。
よくある質問
このセクションでは、この統合に関連する一般的な質問にも対応します。
FP4量子化にはハードウェアの要件がありますか?
この方法は、GPUとのみ互換性がありますので、CPU上でモデルを4ビット量子化することはできません。GPUの中でも、この方法に関してはハードウェアの要件はありませんので、CUDA>=11.2がインストールされている限り、どのGPUでも4ビットの量子化を実行するために使用することができます。また、計算は4ビットでは行われず、重みと活性化はそのフォーマットに圧縮され、計算は依然として望ましいまたはネイティブのdtypeで行われます。
サポートされているモデルは何ですか?
このブログポストで紹介されたLLM.int8の統合と同様に、この統合はaccelerate
ライブラリに大いに依存しています。したがって、from_pretrained
を呼び出す際にdevice_map
引数をサポートするモデルは、すべて4ビットで量子化することが可能です。また、これはモダリティに完全に無関係であり、モデルがdevice_map
引数でロード可能であれば、量子化することができます。
テキストモデルの場合、この時点での主要なアーキテクチャであるLlama、OPT、GPT-Neo、GPT-NeoXなどが含まれます。多モーダルモデルの場合はBlip2などが含まれます。
この時点でサポートされているモデルは以下の通りです:
[
'bigbird_pegasus', 'blip_2', 'bloom', 'bridgetower', 'codegen', 'deit', 'esm',
'gpt2', 'gpt_bigcode', 'gpt_neo', 'gpt_neox', 'gpt_neox_japanese', 'gptj', 'gptsan_japanese',
'lilt', 'llama', 'longformer', 'longt5', 'luke', 'm2m_100', 'mbart', 'mega', 'mt5', 'nllb_moe',
'open_llama', 'opt', 'owlvit', 'plbart', 'roberta', 'roberta_prelayernorm', 'rwkv', 'switch_transformers',
't5', 'vilt', 'vit', 'vit_hybrid', 'whisper', 'xglm', 'xlm_roberta'
]
お気に入りのモデルがない場合は、Pull Requestをオープンするか、transformersでサポートを追加するための問題を提起することができます。
4ビット/8ビットモデルを訓練することはできますか?
これらのモデルで純粋な4ビットの訓練を行うことはできません。ただし、パラメータの効率的なファインチューニング手法(PEFT)を活用し、それらの上にアダプタを訓練することは可能です。これは論文で行われており、Hugging FaceのPEFTライブラリで公式にサポートされています。また、訓練のノートブックも提供しており、論文の結果を再現したい場合はQLoRAリポジトリを確認することを推奨します。
他にどんな影響がありますか?
この統合により、コミュニティやAI研究にいくつかのポジティブな影響がもたらされる可能性があります。RLHF(人間のフィードバックを用いた強化学習)では、単一のベースモデルを4ビットでロードし、報酬モデリング用のアダプタとバリューポリシートレーニング用のアダプタを複数訓練することが可能です。このユースケースについては、より詳細なブログポストと発表が近日中に行われる予定です。
私たちは、この量子化メソッドが消費者向けのハードウェアで大規模なモデルのトレーニングに与える影響についてもいくつかのベンチマークを行いました。NVIDIA T4(16GB)上で、Llama 7B(fp16で15GB)とLlama 13B(fp16で27GB)の2つの異なるアーキテクチャのファインチューニングを行った実験を複数回実行し、以下に結果を示します。
最新のSFTTrainer
をTRLライブラリから使用し、ベンチマークスクリプトはこちらでご確認いただけます。
プレイグラウンド
論文で引用されているGuanancoモデルをプレイグラウンドまたは直接以下で試してみてください。
謝辞
HFチームは、このプロジェクトに関与したすべての人々、およびこれをコミュニティに提供してくれたワシントン大学の関係者に感謝いたします。
著者は、ブログ記事の審査を親切に行ってくれたPedro Cuenca、論文のアーティファクトをHF Hubに統合するための迅速かつ強力なサポートを提供してくれたOlivier DehaeneとOmar Sansevieroにも感謝いたします。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles