大模型量化知识总结

📑 目录

  • [1. 一句话理解模型量化](#1. 一句话理解模型量化)
  • [2. 量化有什么用](#2. 量化有什么用)
  • [3. 关键概念](#3. 关键概念)
    • [3.1 权重量化、激活量化、KV cache 量化](#3.1 权重量化、激活量化、KV cache 量化)
    • [3.2 PTQ 和 QAT](#3.2 PTQ 和 QAT)
    • [3.3 静态量化和动态量化](#3.3 静态量化和动态量化)
  • [4. 常见量化方法对比](#4. 常见量化方法对比)
  • [5. QLoRA 是什么](#5. QLoRA 是什么)
  • [6. 微调时量化 vs 导出后量化](#6. 微调时量化 vs 导出后量化)
    • [6.1 微调时量化:QLoRA](#6.1 微调时量化:QLoRA)
    • [6.2 导出后量化:GPTQ 等 PTQ](#6.2 导出后量化:GPTQ 等 PTQ)
  • [7. 在 LLaMA-Factory 中怎么使用](#7. 在 LLaMA-Factory 中怎么使用)
    • [7.1 安装依赖](#7.1 安装依赖)
    • [7.2 QLoRA 训练配置示例](#7.2 QLoRA 训练配置示例)
    • [7.3 训练时使用 8-bit](#7.3 训练时使用 8-bit)
    • [7.4 使用已经量化好的 GPTQ/AWQ 模型](#7.4 使用已经量化好的 GPTQ/AWQ 模型)
    • [7.5 合并 LoRA](#7.5 合并 LoRA)
    • [7.6 导出 GPTQ 量化模型](#7.6 导出 GPTQ 量化模型)
  • [8. 怎么选量化方案](#8. 怎么选量化方案)
  • [9. 常见坑](#9. 常见坑)

1. 一句话理解模型量化

模型量化(Model Quantization)就是把模型中原本用 FP32、FP16、BF16 等高精度格式保存或计算的数值,压缩成 INT8、INT4、NF4、FP4 等更低位宽格式。

大模型里最占空间的是权重。以参数量粗略估算:

精度 每个参数约占空间 7B 模型权重粗略占用 作用
FP32 4 bytes 约 28 GB 训练早期常见,推理太重
FP16/BF16 2 bytes 约 14 GB 常见训练/推理精度
INT8 1 byte 约 7 GB 推理省显存,质量通常较稳
INT4/NF4/FP4 0.5 byte 约 3.5 GB 显存压力大幅下降,常用于 QLoRA 或低显存部署

实际占用会更高,因为还包括 KV cache、激活值、优化器状态、LoRA adapter、临时张量、框架开销等。

2. 量化有什么用

  1. 降低显存门槛

    比如 7B/14B/32B 模型在 FP16 下可能放不进消费级显卡,4-bit 后可以显著降低加载门槛。

  2. 降低推理成本

    同样显存可以放更大的模型,或者同一张卡服务更多并发。

  3. 提升推理速度

    低比特权重减少内存带宽压力;但是否真正变快取决于推理框架、kernel、GPU 架构、batch size 和量化格式。

  4. 让低资源微调变得可行

    QLoRA 的思路是冻结 4-bit 量化后的基座模型,只训练少量 LoRA 参数,从而显著降低微调显存。

  5. 便于本地和边缘部署

    GGUF/llama.cpp、AWQ、GPTQ 等格式常用于本地推理、单卡部署或 CPU/边缘环境。

3. 关键概念

3.1 权重量化、激活量化、KV cache 量化

  • 权重量化:压缩模型参数,是 LLM 量化里最常见的对象。
  • 激活量化:压缩前向过程中的中间激活值,收益大,但更容易影响质量和稳定性。
  • KV cache 量化:长上下文推理时,KV cache 可能占用大量显存;部分推理框架支持 KV cache 量化来节省显存。

3.2 PTQ 和 QAT

  • PTQ(Post-Training Quantization,训练后量化):模型训练完成后再做量化。部署场景最常见,如 GPTQ、AWQ、GGUF 量化。
  • QAT(Quantization-Aware Training,量化感知训练):训练过程中模拟或引入量化影响,让模型适应低精度。成本更高,工程复杂度也更高。

3.3 静态量化和动态量化

  • 静态量化:先用校准数据确定量化参数,之后参数固定。GPTQ、AWQ 通常属于这一类。
  • 动态量化:加载或推理时动态处理,使用更方便,常见代表是 bitsandbytes 的 8-bit/4-bit 加载。

4. 常见量化方法对比

方法 常见位宽 主要用途 是否常需校准数据 优点 注意点
bitsandbytes LLM.int8 8-bit 推理、加载大模型 使用简单,Transformers 集成好 加速效果依赖环境
bitsandbytes 4-bit / QLoRA 4-bit, NF4/FP4 低显存 LoRA 微调 微调门槛低,LLaMA-Factory 易用 基座冻结,主要训练 LoRA
GPTQ 2/3/4/8-bit 常见 部署推理 精度保持较好,生态成熟 量化耗时,依赖校准集和推理 kernel
AWQ 3/4-bit 常见 部署推理 关注关键权重,硬件友好,推理常较快 不同框架支持差异明显
HQQ 2-8 bit 快速量化、无需校准 不需要校准,速度快 生态和兼容性要按框架确认
EETQ 8-bit 推理 通常否 简单快速 位宽选择不如 GPTQ/AWQ 丰富
GGUF 多种,如 Q4_K_M llama.cpp/CPU/本地推理 转换量化时需要 本地生态好,CPU 可用 LLaMA-Factory 不直接导出 GGUF,通常用 llama.cpp 转

5. QLoRA 是什么

QLoRA 可以理解为"4-bit 量化基座模型 + LoRA 微调":

  1. 把预训练基座模型以 4-bit 加载。
  2. 冻结量化后的基座权重。
  3. 插入少量可训练的 LoRA 参数。
  4. 训练时梯度通过量化模型回传,但真正更新的是 LoRA adapter。

QLoRA 论文提出了几个关键点:

  • NF4:适合近似正态分布权重的 4-bit 数据类型。
  • Double Quantization:再量化量化常数,进一步省显存。
  • Paged Optimizers:缓解训练过程中的显存峰值。

6. 微调时量化 vs 导出后量化

6.1 微调时量化:QLoRA

目标是让训练跑得动。

在 LLaMA-Factory 里,典型做法是在 LoRA 训练配置中加入:

yaml 复制代码
finetuning_type: lora
quantization_bit: 4
quantization_method: bitsandbytes
quantization_type: nf4
double_quantization: true

这表示:用 4-bit 方式加载基座模型,并在其上训练 LoRA。

6.2 导出后量化:GPTQ 等 PTQ

目标是让最终模型更适合部署。

典型流程是:

  1. 先完成 LoRA/QLoRA 微调,得到 adapter。
  2. 如果需要完整模型,先把 LoRA adapter 合并回未量化的基座模型。
  3. 再对合并后的完整模型做导出量化,如 GPTQ。

7. 在 LLaMA-Factory 中怎么使用

7.1 安装依赖

如果使用 CUDA 环境,通常需要安装 LLaMA-Factory 以及 bitsandbytes:

bash 复制代码
pip install -e ".[torch,bitsandbytes]"

Windows 平台上 bitsandbytes 兼容性要特别注意。LLaMA-Factory GitHub README 提到,在 Windows 平台启用 QLoRA 需要安装支持对应 CUDA 版本的 bitsandbytes 预编译版本。

7.2 QLoRA 训练配置示例

下面是一个偏通用的 SFT QLoRA 配置示例,可保存为 examples/train_lora/qwen_qlora_sft.yaml 之类的文件,再用 llamafactory-cli train 启动。

yaml 复制代码
### model
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
trust_remote_code: true

### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all

### quantization
quantization_bit: 4
quantization_method: bitsandbytes
quantization_type: nf4
double_quantization: true

### dataset
dataset: identity,alpaca_en_demo
template: qwen3_nothink
cutoff_len: 2048
max_samples: 1000
preprocessing_num_workers: 16
dataloader_num_workers: 4

### output
output_dir: saves/qwen3-4b/qlora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
save_only_model: false
report_to: none

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
resume_from_checkpoint: null

启动:

bash 复制代码
llamafactory-cli train examples/train_lora/qwen_qlora_sft.yaml

最小理解:

  • quantization_bit: 4:启用 4-bit 加载,是 QLoRA 的关键。
  • quantization_method: bitsandbytes:使用 bitsandbytes 量化加载。
  • quantization_type: nf4:QLoRA 常用 NF4。
  • double_quantization: true:使用双重量化,进一步省显存。
  • finetuning_type: lora:训练 LoRA adapter,而不是全参训练。

7.3 训练时使用 8-bit

如果 4-bit 不稳定,或者显存略充足,可以尝试:

yaml 复制代码
quantization_bit: 8
quantization_method: bitsandbytes

8-bit 通常比 4-bit 更保守,显存节省少一些,但数值风险也较低。

7.4 使用已经量化好的 GPTQ/AWQ 模型

如果只是加载一个已经 GPTQ/AWQ 量化好的模型,通常直接把 model_name_or_path 指向对应模型即可,例如:

yaml 复制代码
model_name_or_path: TechxGenus/Meta-Llama-3-8B-Instruct-GPTQ

或:

yaml 复制代码
model_name_or_path: TechxGenus/Meta-Llama-3-8B-Instruct-AWQ

注意:如果模型本身已经是 PTQ 量化模型,再设置 quantization_bit 不一定会产生你期望的效果。训练、推理、导出的量化入口要分清。

7.5 合并 LoRA

训练得到 LoRA adapter 后,如果希望导出完整模型:

yaml 复制代码
### model
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
adapter_name_or_path: saves/qwen3-4b/qlora/sft
template: qwen3_nothink
trust_remote_code: true

### export
export_dir: saves/qwen3_sft_merged
export_size: 5
export_device: cpu
export_legacy_format: false

执行:

bash 复制代码
llamafactory-cli export examples/merge_lora/qwen3_lora_sft.yaml

重点:合并时使用未量化的基座模型,不要在这个配置里写训练时的 quantization_bit: 4

7.6 导出 GPTQ 量化模型

LLaMA-Factory 官方示例里的 GPTQ 导出配置类似:

yaml 复制代码
### model
model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
template: qwen3_nothink
trust_remote_code: true

### export
export_dir: saves/qwen3_gptq
export_quantization_bit: 4
export_quantization_dataset: data/c4_demo.jsonl
export_size: 5
export_device: cpu
export_legacy_format: false

执行:

bash 复制代码
llamafactory-cli export examples/merge_lora/qwen3_gptq.yaml

关键参数:

  • export_quantization_bit:导出量化位宽。
  • export_quantization_dataset:校准数据集路径。
  • export_quantization_nsamples:校准样本数量,默认文档中为 128。
  • export_quantization_maxlen:校准输入最大长度,默认文档中为 1024。

8. 怎么选量化方案

场景 推荐优先尝试 原因
显存不够,想做 SFT 微调 QLoRA 4-bit NF4 最成熟的低显存微调路线
显存略够,想更稳一点 LoRA + 8-bit 或普通 LoRA 质量和稳定性更保守
已有 LoRA,想部署为完整模型 先合并,再 GPTQ/AWQ/GGUF 部署格式和训练格式分离
Transformers 内推理,想简单省显存 bitsandbytes 8-bit/4-bit 接入简单
vLLM/TGI 等服务部署 看框架支持的 AWQ/GPTQ/FP8 推理速度取决于 kernel 支持
CPU/本地客户端推理 GGUF + llama.cpp 本地生态成熟
极低显存但能接受质量风险 3-bit/2-bit/HQQ/AQLM 等 需要实际评测,不建议一上来就用

9. 常见坑

  1. 把 QLoRA 和 GPTQ 混为一谈

    QLoRA 是训练策略;GPTQ 是更典型的训练后量化部署方法。

  2. 合并 LoRA 时用了量化基座

    LLaMA-Factory 官方文档提醒,合并 LoRA 时应使用未量化基座,不要设置训练时的 quantization_bit

  3. 以为 4-bit 一定更快

    4-bit 一定省显存,但不一定在所有硬件/框架上更快。是否加速取决于 kernel、batch size、模型结构、推理引擎。

  4. 校准数据随便选

    GPTQ/AWQ 等 PTQ 方法的校准数据会影响量化效果,最好接近真实使用场景。

  5. 忽略 bitsandbytes 版本和平台兼容性

    Windows、NPU、ROCm、CUDA 版本都可能影响 bitsandbytes 可用性。遇到错误先核对 PyTorch、CUDA、bitsandbytes 版本。

  6. 以为量化后还能随便全参训练

    低精度权重直接训练往往不稳定。QLoRA 的关键是冻结量化基座,只训练 LoRA adapter。

相关推荐
怪我冷i1 小时前
人工智能的数学基础——学习笔记
人工智能·笔记·学习
AI客栈1 小时前
GPU 分时复用与 MIG 切分:云原生 AI 平台资源利用率提升的工程实践
人工智能
顾北顾1 小时前
AI 中的 MCP、Skills、Rules 到底是什么?
人工智能
羊羊小栈1 小时前
基于混合检索RAG的食品生产质量问答系统(BGE_BM25_大语言模型)
前端·人工智能·语言模型·自然语言处理·毕业设计·大作业
财迅通Ai1 小时前
视觉中国向港交所递交H股上市申请
人工智能·视觉中国
syc78901231 小时前
同架构编码工具实测 口述开发场景体验对比
人工智能·架构
Master_oid1 小时前
机器学习46:逻辑回归--基础篇
人工智能·机器学习·逻辑回归
kaixuan_dashen1 小时前
崩铁 ChatBox 1.0.0版本发布!基于KMP的开源AI 对话客户端
人工智能
aneasystone本尊1 小时前
带小龙虾逛 ClawHub:自定义 Skill 实战
人工智能