3. Quantization-Tools简介

3.1. 简介

Qantization-Tools是算能自主开发的网络模型量化工具, 它解析各种不同框架已训练好的32bit浮点网络模型,生成8bit的定点网络模型。 该8bit定点网络模型,可用于算能SOPHON系列AI运算平台。在SOPHON运算平台上, 网络各层输入、输出、系数使用8bit来表示,并支持混合精度计算, 从而在保证网络精度的基础上,大幅减少功耗和内存占用以及数据传输延迟,大幅提高运算速度。

Quantization-Tools由三部分组成:Parse-Tools、Calibration-Tools以及U-FrameWork。如 Quantization-Tools结构图 所示:

../_images/ch2_001.png

图 3.1 Quantization-Tools结构图

  • Parse-Tools:

    解析各深度学习框架下已训练好的网络模型,生成统一格式的网络模型文件—umodel, 支持的深度学习框架包括: Caffe、TensorFlow、MxNet、PyTorch、Darknet、ONNX以及PaddlePaddle。

  • Calibration-Tools:

    分析float32格式的umodel文件,默认基于熵损失最小算法(可选MAX等其他算法),将网络系数定点化成8bit,最后 将网络模型保存成int8格式的umodel文件。

  • U-FrameWork:

    自定义的深度学习推理框架,集合了各开源深度学习框架的运算功能,提供的功能包括:

    1. 作为基础运算平台,为定点化提供基础运算。

    2. 作为验证平台,可以验证fp32,int8格式的网络模型的精度。

    3. 作为接口,通过bmnetu,可以将int8umodel编译成能在SOPHON运算平台上运行的bmodel。


3.2. 量化步骤

此版本Quantization-Tools包含了一键式量化工具,其中集成了量化需要的多个步骤,将其分步骤描述可以对量化过程有更直接的了解。

使用Quantization-Tools量化网络流程如下图:

../_images/ch2_002.png

图 3.2 量化流程

具体量化步骤的说明如下:

  1. 量化数据集准备

    Quantization-tools作为Post-Training量化工具,对已经训练好的float32网络进行量化。此过程需要一定 数量的真实数据用float32网络进行推理,推理过程中会统计每层的输入输出数据范围作为量化参考。 如果使用一键量化接口,对于常见的CV类推理任务,设置量化图片的路径和前处理会在一键量化的过程中生成lmdb,分步量化的时候可以直接使用; 如果简单的前处理设置不能满足需求或者对于非CV类的网络输入可能是各种shape,可以参考和修改create_lmdb例子中的python代码,自己制作lmdb。

  2. float32网络转换

    需要将基于不同框架的网络转换为float32 Umodel之后进行量化,此过程中可以指定第一步准备好的数据作为推理输入。 此步骤使用到的工具为ufw.tools.*_to_umodel,或者在一键量化时候根据指定的模型和参数文件后缀判断是何种开源框架的模型自动调用 这些接口转换。

  3. 对齐预处理

    分步量化需要用户确认网络训练时候进行的前处理,依据此修改上一步产生的prototxt文件,对齐网络训练预处理,或者更加推荐在 制作lmdb阶段直接制作包含预处理之后数据的lmdb。

  4. 量化网络

    通过一定次数的推理统计和计算量化参数,将float32 Umodel转化为int8 Umodel。此步骤使用到的工具为calibration_use_pb二进制工具或者其python形式接口。

  5. 精度测试与调优

    此步骤可能与量化网络一起进行多轮,通过验证量化后网络是否满足精度或者速度要求,对量化参数进行调节,然后再次量化,达到预期目标。 此步骤使用到的工具为ufw test_fp32/ufw test_int8以及可视化工具,或者多数情况下需要用户自己开发精度测试程序验证精度。

  6. 网络部署

    量化完成后部署,与float32网络部署类似。使用bmnetu工具将int8 Umodel转换成最终能部署到SOPHON相关设备上的int8 Bmodel。

量化步骤 中有具体步骤的详细描述。

以上提到的所有工具均随BMNNSDK一起发布。