[ PROMPT_NODE_22822 ]
calibration
[ SKILL_DOCUMENTATION ]
# GPTQ 校准指南
关于校准数据选择和量化过程的完整指南。
## 校准数据选择
### 为什么校准很重要
校准数据用于:
1. **计算权重重要性** (Hessian 矩阵)
2. **最小化量化误差**(针对重要权重)
3. **保持模型精度**(量化后)
**影响**:
- 良好校准:困惑度 (perplexity) 增加 <1.5%
- 较差校准:困惑度增加 5-10%
- 无校准:模型可能输出乱码
### 数据集大小
**推荐**:
- **128-256 个样本**,每个样本 512 个 token
- 总计:65K-131K tokens
**并非越多越好**:
- 512 个样本:边际收益递减,量化速度变慢
### 按领域选择数据集
**通用模型 (GPT, Llama)**:
python
from datasets import load_dataset
# C4 数据集 (推荐用于通用模型)
dataset = load_dataset("c4", split="train", streaming=True)
calibration_data = [
tokenizer(example["text"])["input_ids"][:512]
for example in dataset.take(128)
]
**代码模型 (CodeLlama, StarCoder)**:
python
# The Stack 数据集
dataset = load_dataset("bigcode/the-stack", split="train", streaming=True)
calibration_data = [
tokenizer(example["content"])["input_ids"][:512]
for example in dataset.take(128)
if example["lang"] == "Python" # 或你的目标语言
]
**聊天模型**:
python
# ShareGPT 或 Alpaca 格式
dataset = load_dataset("anon8231489123/ShareGPT_Vicuna_unfiltered", split="train")
calibration_data = []
for example in dataset.select(range(128)):
# 格式化为对话
conversation = tokenizer.apply_chat_template(
example["conversations"],
tokenize=True,
max_length=512
)
calibration_data.append(conversation)
**特定领域 (医疗, 法律)**:
python
# 使用特定领域的文本
dataset = load_dataset("medical_dataset", split="train")
calibration_data = [
tokenizer(example["text"])["input_ids"][:512]
for example in dataset.take(256) # 小众领域使用更多样本
]
## 量化过程
### 基础量化
python
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer
from datasets import load_dataset
# 1. 加载模型
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoGPTQForCausalLM.from_pretrained(
model_name,
quantize_config=BaseQuantizeConfig(
bits=4,
gro