☰
Transformers 中的 EETQ:在 NVIDIA GPU 上启用免校准的 INT8 仅权重量化
2026/10/18 14:29:48 网站建设 项目流程

Transformers 中的 EETQ:在 NVIDIA GPU 上启用免校准的 INT8 仅权重量化

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

EETQ(Easy & Efficient Quantization for Transformers)是一种面向 NVIDIA GPU 的 int8 仅权重量化(weight-only quantization)方案,由网易伏羲实验室开源贡献。它不要求校准数据集、不需要预量化模型权重,仅通过每通道(per-channel)缩放即可把torch.nn.Linear层的高精度权重压缩为 int8,并在运行时以专用 GEMM/GEMV 内核加速推理。本文将以 Transformers 仓库中的 官方 EETQ 文档 为骨架,结合量化器与集成层的源码实现,讲解 EETQ 的原理特性、安装方式、开箱量化用法、量化模型保存复用,以及与 PEFT 结合微调的完整实践路径。

EETQ 的核心特性:int8 仅权重 + 免校准

根据 官方量化文档,EETQ 在 Transformers 生态中的定位非常清晰:

  • int8 weight-only per-channel 量化:只量化权重、不量化激活,且按输出通道维度记录独立的 fp16 缩放因子,因此即便不经过校准也能把精度损失控制在可忽略的水平。
  • 复用高性能内核:GEMM(矩阵乘)与 GEMV(矩阵向量乘)内核源自 FasterTransformer 与 TensorRT-LLM,注意力层则可用 FlashAttention2 优化——这些都是面向 GPU 深度优化过的实现。
  • 零额外流程:无需校准数据集,也无需预量化权重,加载时"即量化"(on-the-fly quantization)。
  • 支持微调:EETQ 权重仍可参与 PEFT(如 LoRA)训练流程。

正因为免校准、开箱即用,EETQ 特别适合希望快速把大语言模型(如 Llama 系列)跑在单卡/多卡 GPU 上、又想降低显存占用与访存带宽压力的推理与微调场景。

在整个 Transformers 量化方案图谱中,EETQ 也占据固定位置:文档导航 quantization/overview.md 的能力对照表将 EETQ 与 AWQ、GPTQ、bitsandbytes 等方案并列,供读者横向比较不同方法的适用精度与硬件要求。

安装与环境要求

EETQ 需要满足以下前置条件(来自官方文档与量化器源码双重确认):

  1. CUDA 11.4+:EETQ 的编译与运行依赖 NVIDIA CUDA 环境。
  2. GPU 必需:量化器的环境校验直接要求torch.cuda.is_available(),无 GPU 会抛出No GPU found运行时错误,见 quantizer_eetq.py。
  3. kernels 与 accelerate 依赖:同一份校验逻辑还会检查当前 Transformers 的 kernels 支持(缺失时报pip install kernels)与 accelerate(缺失时报pip install accelerate),见 quantizer_eetq.py。

安装 EETQ 运行时本身有两条官方路径:

方式一:Release 预编译包

在 EETQ 的官方 release 页面选择与自身环境匹配的 wheel(文件名中通常标注 CUDA 与 PyTorch 版本,如cu121、torch2.1.2、cp310),然后:

pip install --no-cache-dir <path-to>/EETQ-<版本>+cu<版本>+torch<版本>-cp<py版本>-cp<py版本>-linux_x86_64.whl

方式二:源码编译

git clone <EETQ 仓库地址> cd EETQ/ git submodule update --init --recursive pip install .

仓库通过 submodule 引入所需的 CUDA 内核源码,因此--recursive拉取子模块是编译成功的关键步骤。

开箱量化:一条EetqConfig完成加载

在模型加载阶段指定量化方式即可完成整个量化替换流程。官方文档给出的核心示例是对 Llama-3.1-8B 做 EETQ int8 量化:

from transformers import AutoModelForCausalLM, EetqConfig quantization_config = EetqConfig("int8") model = AutoModelForCausalLM.from_pretrained( "meta-llama/Llama-3.1-8B", dtype="auto", device_map="auto", quantization_config=quantization_config )

这段代码背后发生了什么?理解它有助于把握 EETQ 的边界条件。

EetqConfig:可用的配置参数

EetqConfig定义在 quantization_config.py,是一个标准的 Transformers 量化配置 dataclass,支持字段如下:

参数类型默认值说明
weightsstr"int8"目标权重类型,当前仅支持"int8";传入其他值会在post_init中被ValueError拒绝
modules_to_not_convertlist[str] \| NoneNone不做量化的模块名列表,用于显式保留某些层为原始精度(典型如输出头lm_head)

EetqConfig("int8")与EetqConfig(weights="int8")等价。其内部会设置quant_method = QuantizationMethod.EETQ,该标识在后续权重加载时被 quantizers/auto.py 中的量化方法注册表解析,从而路由到EetqHfQuantizer。

从配置到替换:量化器与集成层调用链

模型加载时,EetqHfQuantizer 会执行如下关键步骤:

  1. 环境校验(validate_environment):校验 kernels/accelerate/CUDA;若device_map中含 CPU 或 disk 设备则直接报错(EETQ 不支持把层放到 CPU/磁盘,见 quantizer_eetq.py)。
  2. 决定保留层(_process_model_before_weight_loading):把modules_to_not_convert与模型自带的_keep_in_fp32_modules合并,随后调用replace_with_eetq_linear完成模块替换,见 quantizer_eetq.py。
  3. 惰性加载内核:replace_with_eetq_linear通过get_kernel("kernels-community/quantization-eetq", version=1)从社区内核仓库获取 EETQ 的量化与 GEMM 内核句柄,见 integrations/eetq.py。这就是为什么环境校验要求 kernels 支持可用。

模块替换本身在 integrations/eetq.py 中递归遍历模型的所有nn.Linear:跳过应保留的模块后,在meta设备上用EetqLinear原位替换。EetqLinear的内部布局非常直接(见 integrations/eetq.py):

  • weight:(in_features, out_features)的 int8 参数,requires_grad=False;
  • weight_scales:长度为out_features的 fp16 每通道缩放因子;
  • bias:若原层存在偏置则以 fp16 保留;
  • 前向调用EetqLinearMMFunction,内部执行w8_a16_gemm(int8 权重 × fp16 激活的高性能 GEMM),再把偏置加上,见 integrations/eetq.py。

值得留意的是requires_calibration = False这一量化器属性(quantizer_eetq.py):它从架构层面明确了"无需校准数据"这一特性,量化只是纯数学上的权重重编码。

保存与复用量化模型

量化的价值在于一次转换、多次部署。官方文档给出保存与再加载的标准流程:

quant_path = "/path/to/save/quantized/model" model.save_pretrained(quant_path) model = AutoModelForCausalLM.from_pretrained(quant_path, device_map="auto")

在仓库测试 tests/quantization/eetq_integration/test_eetq.py 中,这一行为被完整覆盖:

  • EetqConfigTest验证to_dict/from_dict往返,即量化配置可随 checkpoint 序列化到磁盘并能被反向解析;
  • EetqTest.test_quantized_model_conversion与test_quantized_model验证模块替换与权重加载结果;
  • test_save_pretrained将量化模型保存到临时目录后再次加载;
  • test_quantized_model_multi_gpu覆盖device_map多 GPU 分配场景。

能够保存的前提是量化器声明is_serializable() -> True(见 quantizer_eetq.py)。保存时 int8 权重与*_scales缩放因子会一并落盘(见EetqQuantize.convert返回的键名{layer}_scales,integrations/eetq.py)。再次from_pretrained时,checkpoint 内携带的quant_method: eetq配置会被自动识别,进入"预量化"加载路径:此时不再执行实时量化,而是直接把 int8 权重装载进EetqLinear。

结合 PEFT 微调 EETQ 量化模型

官方文档明确 EETQ 支持 PEFT 微调。从源码看,该能力由以下设计共同支撑:

  • 量化器声明is_trainable -> True(quantizer_eetq.py),允许模型进入训练/微调管线;
  • EetqLinearMMFunction.backward实现了针对 int8 权重的反向传播:通过w8_a16_gemm将 int8 权重与单位矩阵相乘完成反量化,再与梯度做矩阵乘得到输入梯度(integrations/eetq.py)。int8 权重本身冻结(requires_grad=False),可训练的额外参数(如 LoRA 适配器)照常更新。

典型场景是:先按上文加载 EETQ 量化模型,再叠加 PEFT 提供的 LoRA 配置做指令微调或领域适配,从而获得"量化省显存 + 低秩微调"的组合收益。需要说明的是,PEFT 属于独立生态组件,其具体 API 与版本配合以对应集成文档为准。

使用建议与注意事项

结合官方文档与源码约束,实践中有几点值得注意:

  1. 优先把dtype设为torch.float16:update_dtype会在加载 dtype 不是 fp16 时提示We suggest you to set dtype=torch.float16 for better efficiency with EETQ(quantizer_eetq.py),因为EetqLinear的权重缩放因子与偏置都以 fp16 存储、w8_a16_gemm面向 fp16 激活设计。文档示例中的dtype="auto"亦可,但显式 fp16 通常效率最佳。
  2. device_map不能包含 CPU/disk 设备:EETQ 要求权重与计算都在 GPU 上,混排会直接抛错;若未指定device_map,量化器也会告警提醒设置 GPU 设备(quantizer_eetq.py)。
  3. 关键层保持全精度:默认会把lm_head等输出层留在原始精度以保证数值稳定性,可通过modules_to_not_convert显式扩展保留列表(integrations/eetq.py)。
  4. 已量化模型请使用"预量化"语义加载:从保存路径直接加载即可,无需再次传入quantization_config,系统会依据 checkpoint 元数据自动走 int8 装载路径。

小结

EETQ 为 Transformers 用户提供了一条低门槛的 NVIDIA GPU int8 仅权重量化路径:以 EetqConfig 一处配置完成模块替换与内核加载,免校准即可获得 int8 权重带来的显存与带宽收益,并支持 checkpoint 序列化复用与 PEFT 微调。深入 量化器实现 与 EETQ 集成层,可以看到其"每通道 fp16 缩放 + w8_a16 专用内核 + autograd 反量化反向"的完整闭环——这正是它能在精度、速度与易用性之间取得平衡的根本原因。若想对照更多量化方案做选型,可继续阅读 量化方案总览;想复现上述行为,可运行 EETQ 集成测试。

【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询