[ PROMPT_NODE_22806 ]
quantization-formats
[ SKILL_DOCUMENTATION ]
# 量化格式
关于 bitsandbytes 中 INT8、NF4、FP4 量化格式、双重量化及自定义配置的完整指南。
## 概述
bitsandbytes 支持多种量化格式:
- **INT8**: 8-bit 整数量化 (LLM.int8())
- **NF4**: 4-bit NormalFloat(适用于正态分布权重)
- **FP4**: 4-bit FloatPoint(适用于均匀分布权重)
- **双重量化 (Double Quantization)**:对量化常数进行量化
## INT8 量化
### LLM.int8() 算法
LLM.int8() 使用混合 8-bit/16-bit 矩阵乘法:
- 大多数特征 (>99.9%) 在 INT8 中计算
- 异常值特征 (>阈值) 在 FP16 中计算
- 结果合并以获得最终输出
**内存**:减少 50%(每个参数从 2 字节减少到 1 字节)
**准确度**:下降 阈值的激活值保留在 FP16 中
- 较低 = 更多 FP16(更慢但更准确)
- 较高 = 更多 INT8(更快但准确度较低)
python
# 保守模式(更准确)
llm_int8_threshold=5.0
# 激进模式(更快)
llm_int8_threshold=8.0
**`llm_int8_has_fp16_weight`** (默认: False):
- `False`: 将权重存储在 INT8 中(节省 50% 内存)
- `True`: 存储在 FP16 中,仅在计算时量化(不节省内存)
**`llm_int8_skip_modules`**:
python
# 跳过特定层(保持在 FP16)
llm_int8_skip_modules=["lm_head", "embed_tokens"]
### 示例
python
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-13b-hf",
quantization_config=config,
device_map="auto"
)
# 内存: 26GB (FP16) → 13GB (INT8)
### 何时使用 INT8
✅ **在以下情况使用 INT8**:
- 需要高准确度(损失 <0.5%)
- 模型在 50% 缩减后可以装入显存
- 拥有 Turing+ GPU(张量核心)
❌ **在以下情况不要使用**:
- 需要最大程度的内存节省(请使用 4-bit)
- 推理速度至关重要(请使用 GPTQ/AWQ)
## 4-Bit 量化
### NormalFloat4 (NF4)
针对正态分布权重(大多数神经网络)进行了优化。
**工作原理**:
- 选择分箱以最小化正态分布的量化误差
- 非对称量化分箱
- 更适合 Transformer 权重
**配置**