混合精度在精度损失范围内实现数倍的性能提升。
支持的量化特性
构建混合精度的流程
构建混合精度的流程如下,支持浮点或半精度编程,以及量化精度编程两种方式。
- 浮点或半精度 无需提供tensor分布
- 量化编程需要设置tensor分布。
网络粒度和算子粒度的设置输入精度和输出数据类型
网络中算子的输入精度和输出数据类型在不做修改时维持原始精度。如果需要修改输入精度和输出的类型,有两种方式:
1、按照网络粒度设置。推荐方法,整个网络所有的算子所使用的输入精度和输出数据类型都设置了。
2、按照算子粒度设置。精细化设置每一个算子使用的输入精度和输出类型。比较灵活但是比较复杂。算子粒度比网络粒度的优先级高,同时设置时,会使用算子粒度。
网络设置的配置示例:
算子颗粒度设置示例:
2混合精度编程
基本概念:
- 整网输入
- 整网输出
- 中间层输入
- 中间层输出
- const tensor输出
默认情况下
整网输入、整网输出、const tensor 在网络创建时直接指定或者后续更改。
网络中间层输入类型由上一层算子连接关系自动推导,中间层输出类型(除ICastNode可以指定目标类型外)默认为float 32
设置类型
使用INodeSetxxx 后,即使不同的网络层的类型不匹配,MagicMind 会自动完成必要的数据转换。
一种途径:创建float32 的网络,然后设置INodeSetxxxx偏好。
第二种途径:改变整网的输入类型,const tensor类型、整网输出类型,结合偏好输入和输出类型,构建全float16网络,减少MagicMind的自动插入数据类型转换Node。
3 量化数据类型
onnx框架量化参数和寒武纪量化参数,以及数值范围Range
手动设置量化参数
如果用户知道数据的分布范围,可以调用接口,将数据范围手动设置到Range类。
使用校准器获得并设置数据的分布范围
基于浮点模型和样本数据—>计算并设置数据分布范围,并根据滤波器的数据分布特点选择不同的量化粒度。
要求:
- 提供浮点网络
- 样本数据
快速生成量化模型并完成部署。
远端校准
校准器一般运行在本地MLU,(也就是校准需要运行MLU?),可以远程调用MLU。
校准器会按照给定的设置进行数据动态范围的调整和设置。
量化统计方法
两种方法:线性统计和最小二乘统计(最小二乘仅支持int8)。
量化粒度设置
两种量化设置 per_tensor :按照张量量化,per_axis:按照通道量化。
配置选项:weight_quant_granularity 和 custom_nodes
1weight_quant_granularity 配置除DepthWise卷积外的全局量化粒度
2custom_nodes 配置DepthWise卷积量化粒度
3custom_nodes 支持“按照节点类型”配置某些类的粒度
4ITensor::SetDynamicRange ITensor::SetDynamicRangPerAxis 配置某算子是否分通道
量化对称性
从量化统计到量化参数计算,支持对称量化和非对称量化。
舍入模式
(正文完)