ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

Transformers 中的 EETQ:在 NVIDIA GPU 上启用免校准的 INT8 仅权重量化 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/transformersEETQEasy 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 需要满足以下前置条件来自官方文档与量化器源码双重确认CUDA 11.4EETQ 的编译与运行依赖 NVIDIA CUDA 环境。GPU 必需量化器的环境校验直接要求torch.cuda.is_available()无 GPU 会抛出No GPU found运行时错误见 quantizer_eetq.py。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版本-cppy版本-cppy版本-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, dtypeauto, device_mapauto, quantization_configquantization_config )这段代码背后发生了什么理解它有助于把握 EETQ 的边界条件。EetqConfig可用的配置参数EetqConfig定义在 quantization_config.py是一个标准的 Transformers 量化配置 dataclass支持字段如下参数类型默认值说明weightsstrint8目标权重类型当前仅支持int8传入其他值会在post_init中被ValueError拒绝modules_to_not_convertlist[str] \| NoneNone不做量化的模块名列表用于显式保留某些层为原始精度典型如输出头lm_headEetqConfig(int8)与EetqConfig(weightsint8)等价。其内部会设置quant_method QuantizationMethod.EETQ该标识在后续权重加载时被 quantizers/auto.py 中的量化方法注册表解析从而路由到EetqHfQuantizer。从配置到替换量化器与集成层调用链模型加载时EetqHfQuantizer 会执行如下关键步骤环境校验validate_environment校验 kernels/accelerate/CUDA若device_map中含 CPU 或 disk 设备则直接报错EETQ 不支持把层放到 CPU/磁盘见 quantizer_eetq.py。决定保留层_process_model_before_weight_loading把modules_to_not_convert与模型自带的_keep_in_fp32_modules合并随后调用replace_with_eetq_linear完成模块替换见 quantizer_eetq.py。惰性加载内核replace_with_eetq_linear通过get_kernel(kernels-community/quantization-eetq, version1)从社区内核仓库获取 EETQ 的量化与 GEMM 内核句柄见 integrations/eetq.py。这就是为什么环境校验要求 kernels 支持可用。模块替换本身在 integrations/eetq.py 中递归遍历模型的所有nn.Linear跳过应保留的模块后在meta设备上用EetqLinear原位替换。EetqLinear的内部布局非常直接见 integrations/eetq.pyweight(in_features, out_features)的 int8 参数requires_gradFalseweight_scales长度为out_features的 fp16 每通道缩放因子bias若原层存在偏置则以 fp16 保留前向调用EetqLinearMMFunction内部执行w8_a16_gemmint8 权重 × 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_mapauto)在仓库测试 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}_scalesintegrations/eetq.py。再次from_pretrained时checkpoint 内携带的quant_method: eetq配置会被自动识别进入预量化加载路径此时不再执行实时量化而是直接把 int8 权重装载进EetqLinear。结合 PEFT 微调 EETQ 量化模型官方文档明确 EETQ 支持 PEFT 微调。从源码看该能力由以下设计共同支撑量化器声明is_trainable - Truequantizer_eetq.py允许模型进入训练/微调管线EetqLinearMMFunction.backward实现了针对 int8 权重的反向传播通过w8_a16_gemm将 int8 权重与单位矩阵相乘完成反量化再与梯度做矩阵乘得到输入梯度integrations/eetq.py。int8 权重本身冻结requires_gradFalse可训练的额外参数如 LoRA 适配器照常更新。典型场景是先按上文加载 EETQ 量化模型再叠加 PEFT 提供的 LoRA 配置做指令微调或领域适配从而获得量化省显存 低秩微调的组合收益。需要说明的是PEFT 属于独立生态组件其具体 API 与版本配合以对应集成文档为准。使用建议与注意事项结合官方文档与源码约束实践中有几点值得注意优先把dtype设为torch.float16update_dtype会在加载 dtype 不是 fp16 时提示We suggest you to set dtypetorch.float16 for better efficiency with EETQquantizer_eetq.py因为EetqLinear的权重缩放因子与偏置都以 fp16 存储、w8_a16_gemm面向 fp16 激活设计。文档示例中的dtypeauto亦可但显式 fp16 通常效率最佳。device_map不能包含 CPU/disk 设备EETQ 要求权重与计算都在 GPU 上混排会直接抛错若未指定device_map量化器也会告警提醒设置 GPU 设备quantizer_eetq.py。关键层保持全精度默认会把lm_head等输出层留在原始精度以保证数值稳定性可通过modules_to_not_convert显式扩展保留列表integrations/eetq.py。已量化模型请使用预量化语义加载从保存路径直接加载即可无需再次传入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),仅供参考
返回列表