目录

ONNX

1. 模型格式规范

2. 核心工具链

Sherpa-onnx

量化

1. 定义

2. 为什么需要量化?

3.量化的核心原理

4.核心量化阶段:参数计算与转换

(一)训练后量化(PTQ)流程

(二)量化感知训练(QAT)流程

总结


ONNX

ONNX(Open Neural Network Exchange,开放神经网络交换格式) 是一种跨平台、与框架无关的开源文件格式,旨在标准化神经网络模型的结构和参数表示,解决不同深度学习框架之间的模型兼容性问题。

ONNX 的生态主要包含两部分:模型格式规范配套工具链

1. 模型格式规范

ONNX 用协议缓冲区(Protocol Buffers,protobuf) 定义模型结构,最终生成的.onnx文件本质是 protobuf 的二进制序列化结果,包含两个核心部分:

  • 模型结构(Graph):描述神经网络的计算流程,包括输入 / 输出张量、网络层(如卷积、激活函数、全连接层等)、层与层之间的连接关系。
  • 模型参数(Weights):存储网络层的可学习参数(如卷积核权重、偏置值等),以张量形式二进制存储。

此外,ONNX 会持续更新以支持新的算子(Operator),例如 Transformer、ConvTranspose 等主流深度学习组件,确保对现代神经网络的兼容性。

2. 核心工具链

ONNX 的生态围绕 “模型转换、优化、推理、验证” 构建了一系列完善的工具:

  • 模型训练与导出:在 PyTorch、TensorFlow 等训练框架中完成模型训练,得到原生格式模型(如.pth、.pb);再通过框架自带的转换工具(如 PyTorch 的torch.onnx.export()、TensorFlow 的tf2onnx)将模型导出为 ONNX 格式,确保算子兼容性与输入输出维度正确。

  • 模型简化与优化:使用 ONNX Simplifier 去除模型中的冗余节点,简化网络结构;再通过 ONNX Optimizer 进行算子级优化,减少计算步骤与内存访问开销。

  • 模型验证与可视化:用 Netron 可视化工具加载 ONNX 模型,检查计算图结构是否完整、层间连接是否正确、输入输出维度是否匹配预期,确保模型转换过程无异常。

  • 部署级优化:通过 ONNX Runtime Tools 对模型进行量化,在精度损失可控的前提下减小模型体积并提升推理速度;同时可进行性能 profiling,定位计算瓶颈。

  • 跨平台推理部署:最终通过 ONNX Runtime 在目标设备加载优化后的 ONNX 模型,利用其硬件自适应能力实现高效推理,支持多语言 API 集成到业务系统中。

Sherpa-onnx

sherpa-onnx 是一个 轻量级、高性能的端到端语音识别推理框架,专为将 训练好的 ASR 模型(如 Zipformer)部署到实际应用中而设计并提供高效、易用的跨平台部署能力。

量化

在深度学习领域,量化(Quantization) 是一种通过降低模型参数和计算的数值精度,来优化模型存储、计算效率和部署成本的核心技术。它是模型从 “实验室训练” 走向 “产业级部署” 的关键步骤,尤其在资源受限的端侧设备(如手机、嵌入式设备、IoT 终端)中不可或缺。

1. 定义

在深度学习中,权重(Weights) 是模型训练过程中学习到的固定参数,激活(Activations) 是每一层输入经过权重计算后输出的中间结果。

量化的核心对象正是这两者:将原本以高精度(如 FP32)存储和计算的权重与激活,转换为低精度格式(如 INT8、FP16 等)。

  • 高精度:FP32(单精度浮点数,32 位)、FP64(双精度,64 位),数值范围广、精度高,但存储和计算成本高。
  • 低精度:INT8(8 位整数)、INT4(4 位整数)、FP16(半精度浮点数)、BF16(脑浮点数),数值范围和精度较低,但存储和计算效率高。

2. 为什么需要量化?

深度学习模型(尤其是大模型)存在 “三高一低” 问题:

  • 高存储:一个 10 亿参数的 FP32 模型,存储量约 4GB(每个参数 4 字节),难以部署在内存有限的端侧设备。
  • 高计算:模型推理时的乘法、加法等运算多基于 FP32,计算量大,导致推理延迟高。
  • 高能耗:高精度计算需要更多硬件资源,功耗高,不适合电池供电的移动设备。
  • 低效率:实际应用中,模型无需 FP32 级别的精度即可保持性能(研究表明,多数模型的权重和激活值分布集中,可通过低精度近似)。

量化的核心目标是:在精度损失可接受的前提下,大幅降低模型的存储需求、计算量和能耗

类型 精度特点 存储效率(相对 FP32) 典型应用场景
FP16 半精度浮点数(16 位) 1/2 GPU 加速推理(如 NVIDIA GPU)
BF16 脑浮点数(16 位,范围同 FP32) 1/2 大模型训练与推理(如 Transformer)
INT8 8 位整数 1/4 端侧设备(手机、嵌入式)
INT4 4 位整数 1/8 极致压缩场景(如智能手表)
INT2/1 2 位 / 1 位整数 1/16~1/32 超轻量模型(如传感器节点)

3.量化的核心原理

量化的本质是通过 “映射规则” 将高精度数值范围压缩到低精度数值范围,核心是解决 “如何用低精度数值近似高精度数值” 的问题。

动态范围:指高精度数据的取值范围,通常用 [x_min, x_max] 表示(某层权重或激活值的最小值和最大值)。动态范围是量化映射的基础,范围估计不准会直接导致精度损失。

缩放因子:高精度范围到低精度范围的线性映射比例,计算公式:

scale = (x_max - x_min) / (q_max - q_min),将高精度数值范围压缩到低精度数值范围内。

零点:低精度数值中对应高精度 “0” 的值,确保映射的对称性,计算公式:

zero_point = q_min - round(x_min / scale),通过消除量化偏移,使低精度计算更接近原始高精度结果。

量化:公式:q = round(x / scale) + zero_point。

反量化:公式:x ≈ (q - zero_point) * scale,确保输出格式与后续模块兼容。

4.核心量化阶段:参数计算与转换

(一)训练后量化(PTQ)流程

无需重新训练,适用于快速部署,核心依赖 “校准” 统计动态范围:

  1. 统计动态范围(核心步骤)

    • 权重量化:直接遍历模型各层权重(如卷积核、全连接层矩阵),计算每个权重张量(或通道)的 动态范围(因权重是固定值,无需输入数据)。
    • 激活量化:用校准数据输入模型,运行 FP32 推理,记录各层激活值(如 ReLU 输出、卷积特征图)的 动态范围(激活值随输入变化,需通过校准统计典型范围)。
  2. 计算量化参数:基于动态范围 为每个权重 / 激活张量(或通道)计算scale 和 zero_point。

  3. 执行量化转换

    • 权重:将 FP32 权重按公式转换为低精度,离线存储(量化后权重固定)。
    • 激活:推理时实时将 FP32 激活值转换为低精度(因激活值随输入变化,无法离线预量化)。
  4. 替换高精度算子将模型中的 FP32 算子(如卷积、矩阵乘法)替换为低精度算子(如 INT8 卷积),确保计算过程用低精度完成,同时保留反量化节点(将低精度结果转回 FP32 供后续层使用)。

(二)量化感知训练(QAT)流程

需重新训练,适用于对精度敏感的场景,核心是 “模拟量化误差” 让模型适应低精度:

  1. 修改模型结构在网络各层插入 “量化节点” 和 “反量化节点”:

    • 量化节点:模拟 FP32→低精度的转换(使用与 PTQ 相同的 scale/zero_point 计算逻辑)。
    • 反量化节点:模拟低精度→FP32 的转换(引入量化误差)。这些节点仅在训练时生效,用于模拟低精度计算的误差。
  2. 训练模型适应量化误差

    • 用原始训练数据训练模型,反向传播时,量化 / 反量化节点引入的误差会被纳入梯度计算,使模型参数逐渐适应低精度带来的偏差(如调整权重分布,减少量化误差)。
    • 训练中需定期更新 scale/zero_point(基于当前权重和激活值的动态范围)。
  3. 导出量化模型训练完成后,移除模拟用的量化 / 反量化节点,按最终的 scale/zero_point 将权重转换为低精度,激活值保留实时量化逻辑,得到真正的低精度模型。

总结

量化的核心流程可概括为:“明确目标→准备资源→计算参数→执行量化→验证优化→部署落地”。其中,PTQ 以 “校准统计” 为核心,追求简单高效;QAT 以 “模拟训练” 为核心,追求高精度。两者均需通过量化参数(scale/zero_point)实现高精度到低精度的映射,并通过验证优化平衡效率与精度,最终在硬件上实现高效推理。

🦋🦋🦋...

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐