QAT 的流程如下图所示,首先基于预训练好的模型获取计算图,对计算图插入伪量化算子。准备好训练数据进行训练或者微调,在训练过程中最小化量化误差,最终得到 QAT 之后对神经网络模型。 QAT 模型需要转换去掉伪量化算子,为推理部署做准备。 QAT 时会往模型中插入伪量化节点 FakeQuant 来模拟量化引入的误差。 在 QAT 的早期阶段使用学习率预热和余弦退火可以进一步提高训练的稳定性。 然而,在 QAT 中重新训练模型的计算成本可能是数百个 epoch。 QAT 和 PTQ 对比 PTQ QAT 通常较快 较慢 无需重新训练模型 需要训练/微调模型 量化方案即插即用 量化方案即插即用(需要重新训练) 对模型最终精度控制较少 对最终精度控制更多,因为量化参数是在训练过程中学习到的
QAT反向传播阶段求梯度的公式 我们在反向传播时求得的梯度是模拟量化之后权值的梯度,用这个梯度去更新量化前的权值。 QAT方式明显好于Post Train Quantzation 注意前面有一些精度几乎为0的数据是因为MobileNet训练出来之后某些层的权重非常接近0,使用训练后量化方法之后权重也为0,这就导致推理后结果完全错误 总结 今天介绍了一下基于Pytorch实现QAT量化,并用一个小网络测试了一下效果,但比较遗憾的是并没有获得论文中那么理想的数据,仍需要进一步研究。
为了解决这个问题,QAT算法通过以一种可微分的方式模拟量化,允许网络适应随后的量化。 例如,有研究建议在全精度网络训练中注入伪量化噪声。 量化可能导致质量下降,因此QAT被用来恢复质量并确保模型的鲁棒性。 依次应用重参数化和QAT。训练好的重参数化全精度块被转换为单层,然后每个单层都应用标准QAT。 同时应用重参数化和QAT,如下所示。 独立地对一个重参数化块内的每个层进行量化,然后在QAT之后将它们合并为一个单独的量化层。 这部分展示了这种合并训练如何使QAT受益。
.l.4.10.0-00014.tar.gz # mkdir QAT # tar xvf qat1.7.l.4.10.0-00014.tar.gz -C QAT ... # cd QAT QAT# . QAT# make QAT# make install 安装过程中会在节点上部署一个 systemd 服务,可以通过查看服务状态来验证是否安装成功: # systemctl status qat_service | grep qat qat_c62x 20480 0 intel_qat 204800 2 qat_c62x,usdm_drv uio 20480 1 intel_qat QAT Device Plugin DaemonSet 在云原生的大背景下,一般会在 Kubernetes 中使用 QAT 设备,就需要在 QAT 设备所在节点上安装 QAT 的代码,可以认为是 QAT Plugin,它会调用底层的 QAT Library 完成具体的加解密操作。
该版本经过量化感知训练(Quantization-Aware Training,QAT)优化,能在保持高质量的同时显著降低内存需求。 答案是采用 QAT。 谷歌还与众多热门开发者工具合作,让用户无缝体验基于 QAT 的量化 checkpoint: Ollama:从今天起,只需一个简单命令即可原生支持 Gemma 3 QAT 模型。 LM Studio:通过用户友好界面,轻松下载并在桌面上运行 Gemma 3 QAT 模型。 MLX:利用 MLX 在苹果芯片上对 Gemma 3 QAT 模型进行高效推理。 llama.cpp:得益于对 GGUF 格式 QAT 模型的原生支持,可轻松集成到现有工作流程中。
四、量化感知训练(QAT)1. 量化感知训练(QAT)实现 大模型 QAT 无法全量训练(显存 / 算力成本过高),主流方案是“PTQ 预量化 + LoRA-QAT 微调”:先做 8 位 PTQ,再用 LoRA 低秩适配量化误差 5.5 模型保存与 QAT 效果验证# 保存QAT后的模型(仅保存LoRA权重)model.save_pretrained(". 第二步:PTQ 不达标,评估 QAT 可行性如果 PTQ 量化后精度暴跌,检查项目是否满足两个条件:① 有完整训练数据;② 有充足算力和时间。满足则选择 QAT。3. 第三步:折中方案,PTQ+QAT 混合量化若只有部分训练数据或算力有限,可先用 PTQ 量化模型,再用少量数据做 1-2 个 epoch 的 QAT 微调。
权重:对称 激活:对称(人为设定)因为激活是可训练的,你可以通过训练让它“对称”起来,精度损失更可控2.2 PTQ & QAT! notePTQ 是直接对训练后的模型参数进行量化,因此适合于快速部署;QAT是通过插入伪量化节点,在训练过程中模拟量化误差以达到更高的精度,因此需要重新训练。 tip QAT伪量化节点作用:在训练时模拟量化的误差。在每一层训练时,权重、激活值依然是FT32,但在每一层的传播中,值被“量化再还原”,模拟了量化过程。 FX Graph QAT Export QAT 实现方式 动态图模式 符号化重写 编译器优化 控制流支持✅ ❌ note无论是PTQ 还是 QAT , 每一种实现方式都需要 prepare_fx 和 convert_fxmodel_prepared = quantize_fx.prepare_fx(model,
量化感知训练(QAT) 是什么:QAT通过降低模型权重的精度(从32位到8位)来缩小模型体积。这使得模型运行更快、占用内存更少,同时不会损失太多准确性。 在YOLOv8中实现QAT和训练后量化 现在我们已经讨论了优化技术,接下来让我们探讨如何在YOLOv8中实际实现量化感知训练(QAT)和训练后量化。 在YOLOv8中实现量化感知训练(QAT): QAT需要修改训练流程,以在训练阶段模拟量化。这使得模型能够调整并适应低精度。 import torch import torchvision from torch.quantization import get_default_qat_qconfig, prepare_qat, ('fbgemm') # For CPU backend model.qconfig = qconfig model = prepare_qat(model) 步骤2:使用QAT训练模型 像平常一样训练模型
qconfig for PTQ qconfig = torch.quantization.get_default_qconfig('fbgemm') # or, set the qconfig for QAT qconfig = torch.quantization.get_default_qat_qconfig('fbgemm') # set the qengine to control weight packing qconfig for PTQ qconfig = torch.quantization.get_default_qconfig('qnnpack') # or, set the qconfig for QAT qconfig = torch.quantization.get_default_qat_qconfig('qnnpack') # set the qengine to control weight return x # create a model instance model_fp32 = M() # model must be set to train mode for QAT
此外,作者提出了一种简单的QAT校正方法,称为QC,它只需要在标准的量化感知训练(QAT)过程之后的一个单周期训练,就能校正由振荡的权重和激活引起的误差,从而得到更准确的量化模型。 提出了两种简单的技术,即EMA和QC,可以与任何QAT技术结合使用,在QAT过程中降低有效网络振荡的影响。 3 预备知识 在这里,作者提供一个关于量化感知训练(QAT)的简要背景,并使用一个小玩具的例子来介绍QAT中的振荡问题。 3.1 量化感知训练(QAT) 量化感知训练(QAT)可以通过在神经网络的训练过程中模拟全精度计算操作来实现。 3.2 量化感知训练(QAT)中的振荡 最近的一些工作观察到,QAT中的振荡现象是一种由QAT的近似梯度通过量化函数传递而引起的副作用。由于近似梯度通过量化函数传递,潜在权重在量化阈值附近振荡。
云可以使用动态引擎轻松地提供硬件,并且存在几种可加载模块实现,例如CloudHSM、IBMCA或QAT引擎。 对于云部署,理想的场景是将这些模块作为容器工作负载的一部分交付。 入口控制器的容器 QAT HW HAL用户空间库(Intel® QAT SW发行版的一部分)和 内置OpenSSL QAT引擎 使用Haproxy-ingress ConfigMap启用QAT引擎 ssl-engine ="qat" ssl-mode-async=true Haproxy-ingress部署.yaml 请求qat.intel.com: n资源 请求runtimeClassName: kata-containers (名称值取决于集群配置) (容器中配置了可用的OpenSSL引擎的QAT设备配置文件) 一旦构建块可用,就可以按照TLS终止示例步骤测试硬件加速SSL/TLS。 为了验证硬件的使用,你可以检查主机上的/sys/kernel/debug/*/fw_counter文件,它们会由Intel® QAT固件更新。
Quantization-Aware Training(QAT): QAT就是在训练中插入fake quantize节点 做dequantize(quantize(x, b, s), b, s),对quantize QAT的实验如下table 7,会发现有些情况下QAT-int8比float32还好一丢丢,这时候论文作者的描述格局非常大:”Likewise, we do not interpret cases where ; QAT:加载效果最好的量化模型参数,插入伪量化节点,用原来初始学习率的1%做完QAT的初始学习率,采用退化学习率衰减器。 QAT的实验如下table 7,会发现有些情况下QAT-int8比float32还好一丢丢,这时候论文作者的描述格局非常大:”Likewise, we do not interpret cases where ; QAT:加载效果最好的量化模型参数,插入伪量化节点,用原来初始学习率的1%做完QAT的初始学习率,采用退化学习率衰减器。
本文采用4阶段训练过程,包括在BDD100K数据集上进行预训练,在BDD1000K和iVS数据集上微调,以及在BDD100K上进行量化感知训练(QAT)。 2.2、量化 量化感知训练(QAT)是一种旨在使神经网络更易于量化的技术。在QAT过程中,本文通过依次应用量化和反量化操作,在训练过程中引入量化误差。 最后,本文将QAT应用于额外的20个Epoch进行量化。 3.2、推理 推理过程包括对输入图像进行预处理,包括从1080×1920调整到384×640。 将QAT应用于微调模型不仅保持了模型的性能,而且提高了检测任务,分别达到0.622mAP和0.612mIoU。 比赛组织者提供的比赛中私有数据集的测试结果见表3。 然而,这种性能下降可以通过采用量化感知训练(QAT)策略来缓解。本文的实验结果证明了QAT在减轻量化导致的性能下降方面的有效性。
当下预训练模型的量化为了保证性能,大多采用量化感知训练(Quantization-aware Training, QAT)。 诺亚方舟实验室的研究者从以下四个方面对 QAT 与 PTQ 进行了详细对比: 训练时间:QAT 由于模拟量化算子等操作,训练耗时远远超出全精度训练(FP),而 PTQ 仅仅需要几十分钟,大大缩短量化流程 ; 显存开销:QAT 显存消耗大于全精度训练(FP),使得在显存有限的设备上难以进行量化训练。 ; 性能:鉴于 QAT 在整个训练集上充分训练,其性能在不同的量化 bit 上均领先 PTQ。 在 MNLI 上与 QAT 和 REM 的对比。 研究者同时在 GLUE 上与现有的其他算法进行了对比。
为了克服这些不足,作者提出利用量化感知训练(QAT)技术对大规模DiT模型进行极低比特量化。在LLM领域,已经讨论了针对大规模模型的低比特QAT方法。 这表明大规模模型中仍然存在显著的精度冗余,并暗示了QAT方案对于大规模DiT模型的可行性。 作为PTQ的替代方法,专门为低比特扩散模型量化引入了量化感知训练(QAT)方法。尽管这些QAT方法有效,但目前它们仅限于基于小型U-Net的扩散模型,这表明在大型DiT模型中应用QAT的研究还有空白。 作者发现这可能是由于三元线性层通常导致大的激活值,作者将在下面的小节中通过特定的QAT模型结构改进来解决这个问题。 对于QAT Baseline ,作者在4.3节的adaLN模块中直接训练不带RMS归一化的三元DiT模型。
为了克服这些不足,作者提出利用量化感知训练(QAT)技术对大规模DiT模型进行极低比特量化。在LLM领域,已经讨论了针对大规模模型的低比特QAT方法。 这表明大规模模型中仍然存在显著的精度冗余,并暗示了QAT方案对于大规模DiT模型的可行性。 作为PTQ的替代方法,专门为低比特扩散模型量化引入了量化感知训练(QAT)方法。尽管这些QAT方法有效,但目前它们仅限于基于小型U-Net的扩散模型,这表明在大型DiT模型中应用QAT的研究还有空白。 作者发现这可能是由于三元线性层通常导致大的激活值,作者将在下面的小节中通过特定的QAT模型结构改进来解决这个问题。 对于QAT Baseline ,作者在4.3节的adaLN模块中直接训练不带RMS归一化的三元DiT模型。
注:这里直接编译会使用QAT硬件加速,你需要手动安装QAT_Engine依赖。这里直接禁用硬件加速,编译时排除qat:. /configure --without-http_qat_module# 安装makesudo make install # 这里还需要安装resty.http模块 /usr/local/openresty
TensorRT引入的QDQ算子方式在针对Yolo模型的PTQ和QAT方式时都有详细的阐述,当然这个过程也没有那么顺利。 4、针对YoloV6这种难量化模型,分别采用部分量化和QAT来弥补量化精度损失 在部分量化阶段,我们采用量化敏感层分析技术来判断哪些层最需要恢复原始精度,给出各种metric的量化敏感层实现。 在QAT阶段,不同于原始Yolov6论文中蒸馏+RepOPT的方式,我们直接采用上述部分量化后的模型做出初始模型进行finetune,结果发现finetune后的模型依然取得不错效果。
采用量化感知训练(QAT)范式的方法最近有了快速增长,但往往在概念上较为复杂。 本文提出了一种新颖而高效的QAT方法,即量化特征蒸馏(QFD)。 最近,已经提出了各种方法,而量化感知训练(QAT)由于在极低比特设置下仍能恢复网络准确性的能力而成为一种成熟的范式。 现代QAT方法基于一个通用原理:使用任务损失来优化量化区间(参数)。 2、相关工作 神经网络量化可以分为两种范式: 量化感知训练(QAT) 后训练量化(PTQ) 在本文中,作者采用了QAT。 在本节中,作者将描述QAT中的基础知识、知识蒸馏以及视觉Transformer。 2.1、量化感知训练 QAT是一种强大的范式,可以在不显著降低准确性的情况下处理低比特(例如3位或4位)量化。 现代的QAT方法采用优化量化区间的原则与任务损失,并采用更复杂的技术,包括非均匀量化器、梯度近似或额外的正则化。然而,它们的简洁性和有效性仍然是重要的挑战。
bin\_loss(pred\_dict['dir'], gt\_dict['dir']) return hm\_loss + 2\*box\_loss + dir\_loss4.2 量化感知训练(QAT )针对 INT8 部署,采用 PyTorch 2.1 torch.ao.quantization: from torch.ao.quantization import get\_default\_qat \_qconfigmodel.qconfig = get\_default\_qat\_qconfig('fbgemm')torch.quantization.prepare\_qat(model, inplace