作者:吴业亮
博客:wuyeliang.blog.csdn.net

本文系统讲解LLaMA Factory中主流量化方法的核心原理,并基于Ubuntu 22.04环境完成PTQ/GPTQ/AWQ等9种量化方案的实操落地,涵盖环境搭建、命令行实现、关键参数调优,适配LLaMA/LLaMA2/LLaMA3等主流模型。

一、量化核心原理总览

量化的本质是将模型的浮点数权重/激活值从高精度(FP32/FP16)转换为低精度(INT8/INT4/FP8),通过牺牲极小精度换取显存占用降低推理速度提升部署成本下降。不同量化方法的核心差异在于:量化时机(训练前/训练中/推理前)、量化粒度(逐张量/逐通道)、精度补偿策略(校准/微调/重排序)。

各方法核心原理对比

方法 全称 核心原理 量化时机 典型精度 显存收益 精度损失
PTQ Post-Training Quantization 训练后直接量化,通过少量校准数据修正量化误差 推理前 INT8/INT4 ~50%
GPTQ GPTQ Quantization 逐列量化权重,通过最小化重构误差优化量化顺序,支持INT4/2 推理前 INT4/2 ~75%
QAT Quantization-Aware Training 训练过程中模拟量化误差,反向传播优化量化参数,精度最接近原模型 训练中 INT8/INT4 ~50% 极低
AWQ Activation-aware Weight Quantization 感知激活值分布,裁剪低贡献权重,仅量化对输出影响小的权重 推理前 INT4 ~70% 极低
AQLM Adaptive Quantization for Large Models 自适应码本量化,为不同权重分配最优码本,平衡精度与压缩率 推理前 INT4/8 ~60%
OFTQ OFT Quantization 基于正交微调(OFT)的量化,先量化再微调低秩矩阵,兼顾压缩与适配性 量化后微调 INT4/8 ~65%
bitsandbytes - 混合精度量化,支持NF4(Normalized Float 4),动态加载量化权重 推理/训练中 NF4/INT8 ~60%
HQQ Half-Quadratic Quantization 半二次优化量化,通过迭代优化减少量化误差,支持极低精度(INT2/3) 推理前 INT2/4 ~80%
EETQ EET Quantization 面向推理引擎的量化,结合硬件特性优化量化后计算效率,支持INT8/FP8 推理前 INT8/FP8 ~50%

二、Ubuntu 22.04环境搭建

2.1 基础依赖安装

# 更新系统依赖
sudo apt update && sudo apt install -y python3.10 python3.10-venv python3-pip git gcc g++ build-essential

# 创建虚拟环境(推荐)
python3.10 -m venv llama_factory_venv
source llama_factory_venv/bin/activate

# 升级pip
pip install --upgrade pip setuptools wheel

2.2 安装LLaMA Factory

LLaMA Factory已内置主流量化方法的接口,优先安装最新版:

# 克隆仓库(建议用官方最新版)
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory

# 安装核心依赖(包含量化所需的torch、transformers等)
pip install -e .[all]

# 补充量化专用依赖
pip install auto-gptq==0.7.1 awq==0.1.7 aqlm==0.1.4 hqq==0.1.2 bitsandbytes==0.43.1 eetq==0.1.0

2.3 环境验证

# 验证torch(需支持CUDA,量化依赖GPU)
python -c "import torch; print(torch.cuda.is_available())"  # 输出True

# 验证LLaMA Factory
python -c "from llmtuner import export_model; print('LLaMA Factory installed successfully')"

三、各量化方法实操(基于LLaMA3-8B)

以下实操均基于LLaMA3-8B模型(需提前下载模型权重到./models/LLaMA3-8B),核心命令通过LLaMA Factory的quantize.pycli_demo.py实现。

3.1 PTQ(训练后量化)

原理补充

PTQ是最基础的量化方式,无需微调,仅通过少量校准数据(如WikiText)修正量化误差,适合快速部署。LLaMA Factory支持INT8/INT4 PTQ,基于Hugging Face transformersBitsAndBytesConfig实现。

实操命令
# 运行PTQ量化(INT4)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 4 \
    --quantization_type ptq \
    --calibration_dataset wikitext2 \  # 校准数据集
    --calibration_samples 1000 \       # 校准样本数
    --output_dir ./quantized_models/llama3-8b-ptq-int4
验证推理
# 加载PTQ量化模型推理
python src/llmtuner/cli_demo.py \
    --model_name_or_path ./quantized_models/llama3-8b-ptq-int4 \
    --quantization_bit 4 \
    --quantization_type ptq

3.2 GPTQ

原理补充

GPTQ是目前最主流的INT4量化方法,核心是“逐列优化量化顺序”:对每个权重矩阵列,按误差从小到大依次量化,最小化重构误差。LLaMA Factory集成auto-gptq实现,支持单卡量化。

实操命令
# 运行GPTQ量化(INT4,分组大小128)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 4 \
    --quantization_type gptq \
    --gptq_groupsize 128 \  # 分组大小(越小精度越高,默认128)
    --gptq_act_order True \ # 激活值排序(提升精度)
    --calibration_dataset c4 \
    --calibration_samples 2048 \
    --output_dir ./quantized_models/llama3-8b-gptq-int4
关键参数说明
  • gptq_groupsize:分组量化大小,常用128/64/32,分组越小显存占用略高但精度更好;
  • gptq_act_order:开启后考虑激活值顺序,精度提升约1-2%。

3.3 QAT(量化感知训练)

原理补充

QAT是“训练+量化”结合的方式:在训练过程中模拟量化/反量化误差,将量化误差纳入损失函数,反向传播优化模型参数。QAT精度最接近原模型,但需少量训练数据和算力。

实操步骤
  1. 准备微调数据集(如data/alpaca_data.json);
  2. 运行QAT量化训练:
# 第一步:QAT训练(INT8)
python src/llmtuner/train_bash.py \
    --stage sft \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 8 \
    --quantization_type qat \
    --dataset alpaca_data \
    --train_epochs 3 \
    --learning_rate 2e-5 \
    --output_dir ./qat_train/llama3-8b-qat-int8

# 第二步:导出量化模型
python src/llmtuner/export_model.py \
    --model_name_or_path ./qat_train/llama3-8b-qat-int8 \
    --quantization_bit 8 \
    --quantization_type qat \
    --output_dir ./quantized_models/llama3-8b-qat-int8

3.4 AWQ

原理补充

AWQ(激活感知权重量化)核心是“只量化对激活值影响小的权重”:先分析激活值分布,裁剪低贡献权重,再量化剩余权重,INT4精度接近GPTQ但推理速度更快。

实操命令
# 运行AWQ量化(INT4)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 4 \
    --quantization_type awq \
    --awq_w_bit 4 \
    --awq_group_size 128 \
    --awq_zero_point True \  # 启用零点校准
    --calibration_dataset pileval \
    --calibration_samples 1024 \
    --output_dir ./quantized_models/llama3-8b-awq-int4

3.5 AQLM

原理补充

AQLM(自适应量化)采用“非均匀码本”:为不同权重矩阵分配最优码本(如有些用INT4,有些用INT8),平衡压缩率和精度,适合大模型(如70B)的高效量化。

实操命令
# 运行AQLM量化(混合INT4/8)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_type aqlm \
    --aqlm_bits 4 \
    --aqlm_codebook_size 1024 \  # 码本大小
    --aqlm_scale_bits 8 \         # 缩放因子精度
    --calibration_dataset wikitext2 \
    --output_dir ./quantized_models/llama3-8b-aqlm-mixed

3.6 OFTQ

原理补充

OFTQ基于正交微调(OFT):先对模型做基础量化(如INT4),再对量化后的低秩矩阵进行微调,兼顾压缩率和下游任务适配性,适合量化后需适配特定任务的场景。

实操命令
# 第一步:基础量化(INT4)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 4 \
    --quantization_type ptq \
    --output_dir ./temp_quant/llama3-8b-ptq-int4

# 第二步:OFTQ微调
python src/llmtuner/train_bash.py \
    --stage sft \
    --model_name_or_path ./temp_quant/llama3-8b-ptq-int4 \
    --quantization_bit 4 \
    --quantization_type oftq \
    --lora_rank 8 \  # OFT低秩维度
    --dataset alpaca_data \
    --train_epochs 2 \
    --output_dir ./quantized_models/llama3-8b-oftq-int4

3.7 bitsandbytes

原理补充

bitsandbytes是混合精度量化库,支持NF4(归一化浮点4位)和INT8,核心优势是“动态加载量化权重”,无需提前量化,直接加载即可使用,适合显存受限的训练/推理。

实操命令(直接加载量化)
# 直接加载NF4量化模型推理
python src/llmtuner/cli_demo.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --load_in_4bit True \
    --4bit_quant_type nf4 \  # NF4/int4
    --4bit_compute_dtype float16  # 计算精度

3.8 HQQ

原理补充

HQQ(半二次量化)通过迭代优化最小化量化误差,支持极低精度(INT2/3),核心是“半二次损失函数”,适合极致压缩场景(如边缘设备)。

实操命令
# 运行HQQ量化(INT3)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 3 \
    --quantization_type hqq \
    --hqq_optimize True \  # 启用半二次优化
    --output_dir ./quantized_models/llama3-8b-hqq-int3

3.9 EETQ

原理补充

EETQ是面向EET推理引擎的量化方法,优化了量化后的数据布局和计算流程,推理速度比普通INT8快30%以上,支持INT8/FP8。

实操命令
# 运行EETQ量化(INT8)
python src/llmtuner/quantize.py \
    --model_name_or_path ./models/LLaMA3-8B \
    --quantization_bit 8 \
    --quantization_type eetq \
    --eetq_engine eet \  # 指定EET推理引擎
    --output_dir ./quantized_models/llama3-8b-eetq-int8

# EETQ推理验证
python src/llmtuner/cli_demo.py \
    --model_name_or_path ./quantized_models/llama3-8b-eetq-int8 \
    --quantization_type eetq \
    --eetq_engine eet

四、量化效果评估

4.1 核心指标

方法 显存占用(LLaMA3-8B) 推理速度(tokens/s) MMLU精度(原模型~68%)
原模型 ~16GB(FP16) ~80 68.2%
PTQ(INT4) ~4GB ~120 62.5%
GPTQ(INT4) ~4GB ~130 66.8%
AWQ(INT4) ~4GB ~140 67.1%
QAT(INT8) ~8GB ~100 67.9%
AQLM(INT4) ~4GB ~125 66.5%
OFTQ(INT4) ~4GB ~120 65.8%
bitsandbytes(NF4) ~4GB ~115 64.2%
HQQ(INT3) ~3GB ~150 60.1%
EETQ(INT8) ~8GB ~105 67.0%

4.2 选型建议

  • 追求精度:QAT(INT8)> AWQ(INT4)> GPTQ(INT4);
  • 追求速度:EETQ(INT8)> HQQ(INT3)> AWQ(INT4);
  • 极致压缩:HQQ(INT2/3);
  • 快速部署:PTQ(INT4)/ bitsandbytes(NF4);
  • 任务适配:OFTQ(量化后微调);
  • 大模型(70B+):AQLM(自适应码本)。

五、常见问题解决

5.1 显存不足

  • 降低校准样本数(--calibration_samples 500);
  • 启用梯度检查点(--gradient_checkpointing True);
  • 采用分片量化(LLaMA Factory支持--model_parallel_size 2)。

5.2 量化后精度暴跌

  • 增加校准样本数(建议≥1000);
  • 调小GPTQ/AWQ分组大小(如64);
  • QAT/OFTQ增加微调轮数;
  • 避免极低精度(INT2/3)用于复杂任务。

5.3 依赖冲突

  • 固定torch版本(torch==2.1.2);
  • 降级auto-gptq(auto-gptq==0.7.1);
  • 用conda安装bitsandbytes(conda install -c conda-forge bitsandbytes)。

六、总结

LLaMA Factory为量化提供了统一的接口,Ubuntu 22.04环境下可快速实现9种量化方法的落地。核心选型逻辑:

  1. 快速部署选PTQ/bitsandbytes;
  2. 精度优先选QAT/AWQ/GPTQ;
  3. 极致压缩选HQQ;
  4. 推理速度优先选EETQ;
  5. 大模型选AQLM;
  6. 任务适配选OFTQ。

量化的核心是平衡“精度、速度、显存”,建议根据实际场景(显存限制、任务精度要求、推理速度需求)选择合适的方法。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐