量子化に関して
量子化は、精度をほとんど低下させることなく、モデルのサイズを削減し、その実行を高速化できる手法。
8-bit integers (INT8)
16-bit integers (INT16)
16-bit floating points (FP16)
16-bit brain floating points (BF16)
fp16,fp32,bf16の解説
引用:https://cloud.google.com/tpu/docs/bfloat16?hl=ja
S⇨正負を表す符号部
E⇨小数点の位置を表す指数部
M⇨各桁の値の並びを表す仮数部
指数部が全0でない限り黙示的な「1」のビットを仮数部に持つ(「ケチ表現」)。このため仮数部に記録するのは10ビットだが11ビットの精度を持つ
INT8
埋め込み層と線形層の重みを量子化
非量子化レイヤーは、元のモデルの浮動小数点精度で実行される。
(例:モデルがfloat16に保存されている場合は、int8_float16)
FP16
すべてのモデルの重みがFP16で保存され、すべてのレイヤーがFP16で実行される。
BF16
すべてのモデルの重みが BF16 に保存され、すべてのレイヤーがこのタイプで実行される。
Activation-aware Weight Quantization (AWQ)
- モデルの中で特に重要な1%の重みを保護する
- GPTQ(後述)より1.45倍のスピードアップを実現
Transformers でawqをサポートしているライブラリはllm-awq とautoawqの模様
さまざまな量子化ツール
bitsandbytes
PyTorchでk-bit quantizationを実現化する。
pip install bitsandbytes
bnb_config = transformers.BitsAndBytesConfig(
load_in_4bit=True, # 4bit 量子化を有効化。
bnb_4bit_use_double_quant=True, # Nested quantization)を有効化
bnb_4bit_quant_type="nf4", # 量子化データタイプ
bnb_4bit_compute_dtype=torch.bfloat16 # 量子化計算時のデータタイプを設定します。
)
bnb_4bit_use_double_quant=True
量子化の後に2回目の量子化を可能にし、パラメータごとに追加で0.4ビットを節約する。
bnb_4bit_quant_type
トレーニング時 4ビット基本モデルをトレーニングする場合
bnb_4bit_quant_type='nf4'
二つのタイプがある。FP4 and NF4
推論時 同じ bnb_4bit_compute_dtypeおよびtorch_dtypeを使う。
Inference: For inference, bnb_4bit_quant_type does not have a huge impact on the performance. However for consistency with the model’s weights, make sure you use the same bnb_4bit_compute_dtype and torch_dtype arguments.
AutoGPTQ
cuda12.1の場合
pip install auto-gptq --no-build-isolation
量子化モデルとして保存できる。
llama.cpp
主にデコーダーモデルに対応。高速化
CT2(CTranslate2)
Python と C++で書かれた高速推論用ライブラリ
参考