欢迎光临
我们一直在努力

从原理到部署:LLaMA Factory 量化实战(Ubuntu 22.04)——PTQ/GPTQ/AWQ 等 9 种方法

作者:吴业亮
博客: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.py或cli_demo.py实现。

3.1 PTQ(训练后量化)

原理补充

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

实操命令

# 运行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精度最接近原模型,但需少量训练数据和算力。

实操步骤
  • 准备微调数据集(如data/alpaca_data.json);
  • 运行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种量化方法的落地。核心选型逻辑:

  • 快速部署选PTQ/bitsandbytes;
  • 精度优先选QAT/AWQ/GPTQ;
  • 极致压缩选HQQ;
  • 推理速度优先选EETQ;
  • 大模型选AQLM;
  • 任务适配选OFTQ。
  • 量化的核心是平衡“精度、速度、显存”,建议根据实际场景(显存限制、任务精度要求、推理速度需求)选择合适的方法。

    赞(0)
    未经允许不得转载:171主机测评 » 从原理到部署:LLaMA Factory 量化实战(Ubuntu 22.04)——PTQ/GPTQ/AWQ 等 9 种方法
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址