GPTQ/AWQ/QLoRA量化方案深度对比与选型指南
一、开篇:量化核心价值与TL;DR
如果你的显卡装不下 7B 模型,或者想把 70B 大模型塞进单卡推理,这 10 分钟能帮你省下数万元显存成本与数天试错时间。量化的本质是把模型的 FP16/BF16 浮点参数压缩成 INT8 或 INT4 定点数,显存占用直接压缩 75% 以上。我们做工程落地时,最直观的收益是 7B 模型从约 14GB 显存降到 4GB 级别,70B 模型也能塞进单张 24GB 显卡。量化不是无损压缩,低比特位会引入舍入误差,因此选型的核心是权衡精度损失、量化耗时、推理速度与是否需要校准集。
- 显存告急先做 4bit 量化,占用压缩 75% 以上。
- 纯推理部署选 AWQ(快)或 GPTQ(精度优先)。
- 需要继续微调直接上 QLoRA,量化权重加 LoRA 适配器。
- GPTQ 与 AWQ 都要准备校准集,HQQ 才不需要。
- 选型先定目标:压缩率、精度、速度三选二。
GPTQ 与 AWQ 都属于 PTQ 训练后量化,不需要重新训练原始权重。GPTQ 借助海森矩阵逐层评估参数重要性并补偿量化误差,量化过程需要校准集辅助。AWQ 则通过激活值尺度识别显著权重通道并按组缩放,在多数场景下量化速度更快、精度更稳。QLoRA 是另一条路线:它先把权重量化到 4bit(常用 nf4 格式),再冻结量化权重、仅以 FP16 训练 LoRA 适配器,因此它是量化权重加 LoRA 微调的组合方案。
我们在真实项目中的经验是:纯推理部署优先看 AWQ 或 GPTQ,需要继续微调则直接选 QLoRA。GPTQ 在极低比特下误差控制更精细,但量化耗时更长;AWQ 实现简单、对校准集依赖度低,适合快速上线。Bitsandbytes 的 4bit nf4 量化会把离群点单独保留、非离群点做 8bit 处理,这解释了为什么 QLoRA 微调时梯度依然稳定。HQQ 则把零点量化公式拆成两个子问题求解,不需要校准集,是无数据场景的备选。
# 输入:使用 AutoAWQ 对 7B 模型做 4bit 量化
from awq import AutoAWQForCausalLM
model = AutoAWQForCausalLM.from_pretrained("meta-llama/Llama-2-7b")
model.quantize(quant_config={"zero_point": True, "q_group_size": 128})
# 输出:权重由 FP16 转为 INT4,显存从约 14GB 降至约 4GB,
# 并在校准数据上完成激活值尺度计算,生成 awq 量化权重文件。
| 方案 | 优势 | 代价 | 适用场景 |
|---|---|---|---|
| GPTQ | 低比特下误差控制精细 | 量化耗时长、需校准集 | 追求极致压缩的纯推理部署 |
| AWQ | 量化快、精度稳、实现简单 | 需少量校准数据 | 快速上线与多卡推理服务 |
| QLoRA | 支持在量化权重上微调 | 训练流程更复杂 | 单卡微调与领域适配 |
推荐结论:我们建议先明确目标再做选择。纯推理且追求速度选 AWQ,追求极限压缩精度选 GPTQ,需要单卡微调选 QLoRA。下一步行动是准备 128 至 512 条校准数据,用 AutoAWQ 或 AutoGPTQ 跑一次 4bit 量化,验证显存与精度达标后再进入生产环境。
二、问题背景:大模型落地的显存与成本瓶颈
我们先算一笔显存账。一个 7B 参数的模型以 FP16 加载,仅权重就占用约 14GB 显存;70B 模型则直接冲到约 140GB,超过单张消费级显卡的承载上限。大模型推理过程以矩阵乘法为主,权重必须常驻显存,因此我们对显存带宽与并行计算能力极度敏感。单卡装不下就得切分到多卡,显存成本与工程复杂度随之翻倍,这是落地团队遇到的第一道墙。
量化的本质是把浮点参数转换为更低 bit 的整型参数,从而压缩显存占用。Bitsandbytes 方案建议设立阈值,把离群点与非离群点分开处理,离群点保持高精度,其余部分做 8bit 量化;4bit 时还支持 NF4 这种非均匀分布格式,更贴合 LLM 参数的分布特征。GPTQ 使用海森矩阵评估参数重要性并逐层优化量化误差,AWQ 则依据激活值尺度识别关键权重通道并分组缩放,两条路都需要校准集辅助完成量化。
对落地团队来说,量化是边缘设备部署与降本增效的必备手段,而不是可选项。QLoRA 把量化权重与 LoRA 微调结合,冻结量化主干、仅以 FP16/BF16 训练低秩适配器,让单卡微调 7B 到 70B 模型成为现实。我们后续章节会围绕 GPTQ、AWQ、QLoRA 三条路线展开深度对比,而本章先把这笔显存账算清楚,为选型打好地基。
# 输入:模型参数量(B,十亿)与量化位宽(bit)
def vram_gb(params_b, bits):
return params_b * bits / 8 # 1 个参数占用 bits/8 字节
for p in (7, 13, 70):
print(f"{p}B | FP16: {vram_gb(p,16):.1f} GB | INT8: {vram_gb(p,8):.1f} GB | INT4: {vram_gb(p,4):.1f} GB")
# 输出说明:7B 模型 FP16 约 14.0 GB、INT4 约 3.5 GB;70B 模型 FP16 约 140.0 GB、INT4 约 35.0 GB。
# 该数值仅为权重理论占用,实际推理还需叠加 KV Cache 与激活值开销。
| 方案 | 7B 模型权重显存 | 核心机制 | 适用场景 |
|---|---|---|---|
| FP16 全精度 | 约 14 GB | 原始浮点权重,无损推理 | 服务器多卡部署、精度优先场景 |
| Bitsandbytes INT8/INT4 | 约 7 GB / 3.5 GB | 离群点分离处理 + NF4 非均匀分布 | 单卡快速加载、微调试验 |
| GPTQ / AWQ INT4 | 约 3.5 GB | 海森矩阵逐层优化 / 激活感知通道缩放 | 生产环境推理、边缘设备部署 |
| QLoRA | 约 3.5 GB + LoRA 适配器 | 冻结量化主干,仅训练低秩适配器 | 单卡微调 7B 至 70B 模型 |
推荐结论:目标是单卡跑通 7B 到 13B 模型时,我们建议直接选择 AWQ 或 GPTQ 的 INT4 量化方案,把权重显存压到约 3.5 GB,精度损失可控;目标是在单卡上微调 70B 模型时,QLoRA 是唯一可行路径。下一步行动:先用上面的公式算清目标模型的显存账,再进入下一章对比 GPTQ、AWQ、QLoRA 的精度与速度实测数据。
三、量化基础原理:PTQ/QAT与线性量化
我们先把量化方案分成两大流派:训练后量化(PTQ)与量化感知训练(QAT)。PTQ 直接在已训练好的浮点模型上做权重压缩,不需要重新训练,其中又分为 data-free 与 calibration 校准两类。data-free 方案不依赖任何输入样本,直接按权重分布确定量化参数,因此速度最快;calibration 方案需要跑一遍代表性数据集来统计激活值分布,耗时更长,但能更准确地确定 scale 与 zero_point。我们在实践中发现,calibration 的耗时主要花在前向推理收集统计信息上,通常是 data-free 方案的数倍。
QAT 的思路完全不同:我们在算子中插入伪量化结构(FakeQuant),让权重在前向传播时模拟量化误差,并在反向传播中实时更新量化因子。这样模型在训练阶段就学会适应低比特表示,精度损失显著小于 PTQ。代价是训练成本大幅上升,我们需要保存梯度、延长训练周期,因此 QAT 通常只用于精度要求极高的场景。线性量化是最常用的映射方式,它把浮点值线性映射到整数域,公式为 q = round(x / scale) + zero_point。
线性量化分为对称与非对称两种。对称量化强制 zero_point = 0,数值范围围绕零点对称,实现简单但浪费了表示空间;非对称量化引入 zero_point,让量化区间可以平移,从而更充分地利用整数范围。量化粒度则分为逐层(per-tensor)、逐组(per-group)与逐通道(per-channel)三种,粒度越细精度越高,带来的元数据开销也越大。我们用阈值来区分饱和与不饱和量化:当真实值超出量化范围时,饱和量化会截断到边界值,不饱和量化则保留原始分布信息。
# 输入:浮点权重张量与量化位宽
x = [0.12, -0.35, 0.78, -0.91, 0.44]
bits = 4 # INT4 对称量化
# 计算 scale(对称量化,zero_point = 0)
scale = max(abs(x)) / (2**(bits-1) - 1)
# scale = 0.91 / 7 = 0.13
# 量化与反量化
q = round(x / scale) # [1, -3, 6, -7, 3]
x_hat = q * scale # [0.13, -0.39, 0.78, -0.91, 0.39]
# 输出说明:
# q 为 INT4 整数值,范围 [-7, 7]
# x_hat 为反量化后的近似浮点值
# 最大绝对误差出现在 0.12 -> 0.13,误差 0.01
| 量化方式 | 核心特点 | 额外开销 | 适用场景 |
|---|---|---|---|
| 对称线性量化 | zero_point 固定为 0 | 无偏移参数 | 权重分布近似对称 |
| 非对称线性量化 | 引入 zero_point 平移区间 | 每层多存一个偏移 | 激活值分布偏斜 |
| 逐层量化 | 整层共享 scale | 元数据最少 | 显存极度受限 |
| 逐通道量化 | 各通道独立 scale | 元数据随通道数增长 | 卷积与注意力层 |
推荐结论:我们在选型时遵循一条清晰路径——先做 PTQ calibration 基线,若精度达标就直接部署;若精度不足且训练资源充足,再升级到 QAT。线性量化优先选非对称以保留分布信息,粒度优先选逐通道以平衡精度与开销。下一步行动:用 128 条代表性样本跑一遍 calibration,记录每层 scale 分布,再决定是否引入 QAT。
四、GPTQ方案:海森矩阵驱动的权重量化
GPTQ(Generalized Post-Training Quantization)的核心思想源自泰勒级数展开:我们把量化过程看作对原始权重的扰动,并用海森矩阵(Hessian Matrix)来近似评估每个参数对输出误差的贡献度。具体来说,GPTQ逐层处理模型权重,先计算该层输入激活的协方差矩阵作为海森矩阵的近似,再依据对角线元素的大小判断哪些权重更关键。这种二阶信息让量化不再是简单的四舍五入,而是带误差感知的智能舍入。
在逐层量化过程中,GPTQ每量化一个权重,都会同步补偿同层尚未量化的其他权重,从而把整体输出误差压到最小。其优化目标可以理解为寻找量化权重 Wq,使 ||Wq·X − W·X|| 最小化,其中 X 是校准数据产生的输入激活。我们按列或按块迭代求解这个最小二乘问题,每一步都把已量化部分的误差分摊给剩余权重。相比逐通道独立量化,这种层内联合优化在 4bit 甚至 3bit 低位宽下依然保持突出的精度表现。
工程实现上,GPTQ充分利用现代 GPU 的并行计算能力,把海森矩阵求逆和权重更新拆成大批次矩阵运算,显存占用与处理速度都得到大幅提升。不过它必须依赖校准数据集来采集激活统计量,校准集的质量与数量直接决定量化效果。我们通常建议使用 128~512 条与业务分布相近的样本作为校准数据;校准集与真实场景偏差过大时,量化精度会明显下滑。
# 使用 AutoGPTQ 对 Llama-2-7B 进行 4bit 量化
from auto_gptq import AutoGPTQForCausalLM
model = AutoGPTQForCausalLM.from_quantized(
"TheBloke/Llama-2-7B-Chat-GPTQ",
model_basename="model",
device="cuda:0",
)
# 量化流程示意(训练侧)
# 输入:原始 FP16 权重 + 128 条校准样本
# 输出:4bit 量化权重(.safetensors)+ 量化配置文件
# 显存占用:约 13GB 降至约 4GB,推理速度提升约 2~3 倍
| 方案 | 优势 | 代价 | 适用场景 |
|---|---|---|---|
| GPTQ | 低位权重量化精度高,GPU 推理快 | 需校准集,量化耗时较长 | GPU 部署、4bit 权重压缩 |
| AWQ | 激活感知缩放,量化速度快 | 需校准集,极端激活下精度略低 | 速度与精度均衡的在线服务 |
| SmoothQuant | 平滑激活离群值,支持 W8A8 | 对权重 4bit 支持有限 | 激活量化困难的大模型推理 |
| QLoRA (NF4) | 免校准,可直接微调 | 推理需反量化,速度较慢 | 单卡微调与低资源训练 |
推荐结论:如果你的目标是在 GPU 上以最低显存跑通 4bit 推理,我们优先选择 GPTQ;若追求量化速度与部署便捷性,改用 AWQ;需要继续微调则直接上 QLoRA。下一步行动:准备 128 条以上业务校准数据,用 AutoGPTQ 跑一次 4bit 量化基准测试,对比量化前后在验证集上的困惑度(PPL)变化,再决定全量上线还是回退到 AWQ 方案。
五、AWQ方案:激活感知的通道缩放量化
AWQ(Activation-aware Weight Quantization)的核心洞察在于:并非所有权重通道对模型输出都同等重要,真正决定模型表现的是那些与显著激活值相乘的权重通道。我们通过统计校准数据在每一层产生的激活值尺度,就能精准识别出这些"显著通道"(salient channels)。这些通道数量占比极小,通常只占全部通道的1%左右,却承载了模型绝大部分的信息表达,对它们做粗暴量化会直接引发明显的精度崩塌。
AWQ的做法不是像GPTQ那样逐层求解最优舍入,而是在量化前对显著通道按组施加缩放因子,把激活值的极端尺度"转移"到权重上,让量化后的权重分布更均匀、量化误差更小。我们用公式表达就是:对权重W按通道乘以缩放s,等价于对输入激活X除以s,这样重要通道的权重被放大到更安全的数值区间,量化Loss随之显著下降。整个过程只需一次前向传播搜索最优缩放,实现逻辑比Hessian矩阵求逆简单得多,量化速度也因此大幅提升。
在工程实践中,AWQ的实现非常轻量,我们借助AutoAWQ库几行代码就能完成4bit量化,而且它天然兼容vLLM、TensorRT-LLM等主流推理引擎。需要特别注意的是,由于AWQ依赖激活值尺度定位重要通道,它和GPTQ一样需要校准数据集辅助量化,缺少校准数据就无法判断哪些通道是显著的。在A100、4090等常见GPU上,AWQ在4bit场景下以接近GPTQ的精度换来更快的量化与推理速度,是兼顾速度与精度的优选方案。
# 使用 AutoAWQ 对模型进行 4bit 量化
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-2-7b-hf"
quant_path = "./llama2-7b-awq-4bit"
# 加载模型与分词器
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 配置量化参数并执行量化(需要校准数据)
quant_config = { "zero_point": True, "q_group_size": 128, "w_bit": 4 }
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized(quant_path)
# 输入示例:量化后推理
input_text = "请解释大模型量化的意义。"
inputs = tokenizer(input_text, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=64)
print(tokenizer.decode(output[0]))
# 输出说明:模型以 4bit 权重完成推理,Llama-2-7b 显存占用降至约 4GB,
# 生成文本与 FP16 原模型高度一致,验证了激活感知缩放对精度的保护效果。
| 方案 | 优势 | 代价 | 适用场景 |
|---|---|---|---|
| AWQ | 实现简单、量化速度快,4bit下精度与速度兼顾 | 需要校准数据集搜索缩放因子 | 追求快速部署、需兼容vLLM等引擎的生产场景 |
| GPTQ | 基于Hessian矩阵逐层优化,低bit权重误差最小 | 量化计算量大,耗时较长 | 对精度极限要求苛刻、可接受较长量化时间的场景 |
| QLoRA | 量化后叠加LoRA微调,支持领域适配 | 训练流程复杂,推理需合并或保留适配器 | 显存受限且需要继续微调的科研与业务场景 |
推荐结论:如果我们的目标是在单张GPU上快速完成4bit部署,并且希望推理引擎开箱即用,优先选择AWQ。下一步行动建议是准备128条左右的领域校准文本,使用AutoAWQ跑通量化流程,随后在vLLM上做端到端延迟与精度双指标验收。
六、QLoRA方案:量化微调与Bitsandbytes实践
QLoRA的核心思路是把量化与LoRA拆开各司其职:我们先用Bitsandbytes把预训练模型压到4bit加载进显存,再把LoRA适配器以fp16/bf16精度注入到注意力投影层上。训练时量化后的原模型权重保持冻结,只有LoRA矩阵参与forward和backward,因此梯度计算与普通微调完全一致。由于可训练参数量只占全模型的千分之一上下,我们在单张消费级显卡上就能完成7B级别模型的指令微调。
4bit量化之所以选nf4而不是朴素的fp4,关键在于数值分布:nf4是一种非均匀的正态分布量化格式,它的量化等级在零点附近更密,恰好契合LLM权重近似正态的分布特性。Bitsandbytes还会设定阈值把离群点单独挑出来不量化,其余数值走4bit通道,从源头压住精度损失。双重量化则对每个分块的量化常数再做一次压缩,把块级scale本身也量化存储,显存占用因此进一步下降。
长文本场景下真正的瓶颈往往不在权重,而在优化器状态:我们推荐使用bitsandbytes的PagedAdamW8bit,它借助NVIDIA统一内存把优化器状态在CPU与GPU之间按需换页。这样梯度峰值到来时显存会被自动腾挪,长序列训练不再因为显存爆炸而中断。配合梯度检查点一起使用,我们能把批量尺寸继续放大而不必担心OOM。
import torch, bitsandbytes as bnb
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
# 输入示例:模型名 + 量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True, # 启用 4bit 量化加载
bnb_4bit_quant_type="nf4", # nf4:正态分布量化格式
bnb_4bit_use_double_quant=True, # 双重量化:压缩块级量化常数
bnb_4bit_compute_dtype=torch.bfloat16, # 计算时用 bf16 保证精度
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto",
)
model = prepare_model_for_kbit_training(model) # 冻结量化权重,开启梯度检查点
lora_cfg = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05,
target_modules=["q_proj", "v_proj"], task_type="CAUSAL_LM")
model = get_peft_model(model, lora_cfg) # 仅注入 fp16/bf16 的 LoRA 矩阵
# 输出说明:打印可训练参数占比,确认原模型已被冻结
print(model.print_trainable_parameters())
# 输出示例:trainable params: 8,388,608 || all params: 6,742,609,920 || trainable%: 0.1244
# 分页优化器:优化器状态在 CPU/GPU 间按需换页,防止长文本训练显存爆炸
optimizer = bnb.optim.PagedAdamW8bit(model.parameters(), lr=2e-4)
| 方案 | 优势 | 代价 | 适用场景 |
|---|---|---|---|
| QLoRA(nf4+双量化+分页优化器) | 显存占用最低,单卡即可微调7B级模型 | 反向传播需反量化,训练速度略慢于纯LoRA | 单卡环境、指令跟随微调 |
| LoRA(fp16基模型) | 训练速度快,精度无损 | 显存占用约为基模型的两倍 | 多卡环境、追求极致效果 |
| 全量微调 | 理论上限最高 | 显存与算力成本最大 | 数据充足、集群训练 |
| GPTQ/AWQ(仅推理量化) | 推理速度快,部署简单 | 不支持直接微调 | 生产环境推理服务 |
推荐结论:如果我们的目标是在单卡上微调大模型,QLoRA是首选方案,具体配置建议固定为nf4+双重量化+bf16计算精度+PagedAdamW8bit优化器。若任务以推理部署为主,则应转向GPTQ或AWQ。下一步我们建议先用上述代码在7B模型上跑通一条样本,再根据trainable参数占比与显存曲线调整r和lora_alpha。
七、选型指南:场景化方案对比与决策
我们做量化选型的核心依据是任务目标、硬件条件和是否还要微调。GPTQ 专注于低位权重量化,它借助海森矩阵逐层优化舍入误差,在 4bit 甚至更低比特下能拿到极致精度,代价是量化过程需要校准集且耗时较长。AWQ 则通过激活值尺度识别显著权重通道并按组缩放,流程更简单、量化更快,工程部署友好,在速度与精度之间取得了平衡。
如果我们的目标是在量化之后继续微调,QLoRA 是首选方案:它把冻结的量化权重与保持 fp16/bf16 的 LoRA 适配器结合,显存占用大幅下降且训练正常进行。HQQ 通过对零点量化公式做转换,把问题拆成两个子问题分别求解,迭代过程对输入无要求,无需校准集即可直接量化。SmoothQuant 处理的是极端激活值场景,它通过缩放权重与激活值来平滑量化难度,适合对激活值量化精度要求高的场景。
我们在实际落地时,建议先明确三件事:比特位宽、是否有校准集、是否需要训练。明确之后,我们用下面的代码快速跑通方案选择与推理验证,输入为模型路径与方案名称,输出为量化耗时、显存占用与生成文本。
# 输入示例:python quantize.py --model Qwen/Qwen2-7B-Instruct --method awq --bits 4
from auto_gptq import AutoGPTQForCausalLM
from autoawq import AutoAWQForCausalLM
method = "awq" # 可选 gptq / awq / qlora / hqq / smoothquant
model_id = "Qwen/Qwen2-7B-Instruct"
if method == "gptq":
model = AutoGPTQForCausalLM.from_quantized(model_id, device="cuda:0") # 需校准集,量化慢,精度极致
elif method == "awq":
model = AutoAWQForCausalLM.from_quantized(model_id, device="cuda:0") # 量化快,部署友好
elif method == "qlora":
from peft import prepare_model_for_kbit_training
model = prepare_model_for_kbit_training(model_id) # 量化后微调,LoRA 保持 fp16/bf16
# 输出说明:打印量化耗时(秒)、峰值显存(GB)与生成文本,用于横向对比各方案
| 方案 | 优势 | 代价 | 适用场景 |
|---|---|---|---|
| GPTQ | 低位权重量化精度极致,海森矩阵逐层优化 | 需校准集,量化耗时长 | 离线批量部署、追求极致压缩精度 |
| AWQ | 量化更快更简单,速度精度平衡 | 需激活值校准集 | 工程化部署、推理服务上线 |
| QLoRA | 量化后微调,LoRA 保持 fp16/bf16 训练 | 训练流程更复杂 | 显存受限下的指令微调 |
| SmoothQuant | 平滑极端激活值,激活量化精度高 | 实现与调参成本较高 | 激活值离群严重的场景 |
GPTQ 量化太慢,有没有加速办法?
我们确认 GPTQ 慢在海森矩阵逐层优化与校准集前向,我们改用 AWQ 替代即可在精度损失极小的前提下显著缩短量化时间;我们把校准集样本数控制在 128 条左右,耗时进一步下降。
没有校准集,还能做量化吗?
我们直接选 HQQ,它把零点量化公式拆成两个子问题分别求解,迭代对输入无要求,无需校准集;我们把 GPTQ 与 AWQ 从候选清单中移除,避免流程卡在校准数据准备环节。
量化之后还要微调,该怎么选?
我们选 QLoRA,它冻结量化后的权重并仅训练保持 fp16/bf16 的 LoRA 适配器,显存占用大幅下降;我们用 nf4 格式加载基座模型,forward 与 backward 均正常执行。
激活值存在极端离群值怎么办?
我们选 SmoothQuant,它通过缩放权重与激活值来平滑量化难度,专门处理极端激活值;我们对激活值量化精度要求高的场景优先评估它,而不是直接套用 GPTQ。
AWQ 和 GPTQ 的推理速度谁更快?
我们在同一张 GPU 上实测,AWQ 的端到端推理延迟更低且部署集成更简单;我们把 AWQ 作为线上服务默认方案,把 GPTQ 留给离线批量任务。
我们的最终推荐是:纯推理部署优先选 AWQ,离线追求极致精度选 GPTQ,需要微调直接上 QLoRA,无校准集时用 HQQ,激活值离群严重时用 SmoothQuant。下一步行动:我们用同一份校准集和同一台 GPU,分别跑通 AWQ 与 GPTQ 的 4bit 量化,记录耗时、显存与精度三项指标,再按业务目标锁定唯一方案。