Hailo Dataflow Compiler 量化模型脚本详解
主要介绍下 Hailo Dataflow compiler 中最重要量化这部分的 Model scripts。这里我可能只针对我自己比较了解一点的部分会进行详细解释,我自己不了解的部分以及不重要的部分可能不做任何解释,详细可以查看 Hailo 的官方文档。
可以简单理解,Hailo 支持自动量化一般的模型,但是也可以手动添加很多不同命令去实现自动量化下不支持的功能或者解决量化报错。我们一般将这个 model scripts 保存为 alls 命名的文件,例如模型库里面的alls目录。所有的 alls 文件都是针对不同模型的 Model scripts。
常见的 Optimization 命令
其中,最常见的是归一化(将归一化放在 Hailo 处理):
normalization0 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])
正常来说,大致分为 6 类 optimization 命令:
1. model_modification_commands
模型变化,这个一般指的是,针对本身模型没有的,但是我们希望在 Hailo 内运行的一些功能:
input_conversion– 输入格式的转换,主要是颜色空间转换,例如nv21torgb,可以实现输入 YUV 的数据到一个 RGB 的模型中,颜色转换在 Hailo 运行。transpose– 模型转置,因为 Hailo 对于width > height的模型运行效率要高于height > width的模型,所以实在有需要的时候可以考虑。normalization– 归一化,最常用的功能,Hailo 本身是 int 的 NPU,强烈建议归一化在 Hailo 运行。nms_postprocess– NMS 后处理运行在 Hailo,主要用于 YOLO 模型的后处理 NMS 部分,通过这部分将后处理运行在 Hailort API 内部,直接得到 NMS 后的 BBox 结果。change_output_activation– 添加 activation,主要用于一些 YOLO 模型的 regression 节点,通过添加这个避免在后处理中添加 sigmoid。logits_layerset_seedresize
2. model_optimization_flavor
通过设置压缩级别和优化级别来配置模型量化以及 optimization 工作:
model_optimization_flavor(optimization_level=4)
model_optimization_flavor(optimization_level=2, compression_level=1)
model_optimization_flavor(optimization_level=2, batch_size=4)
设置 optimization_level 以及 compression_level(量化 4bit 率),也可以通过 batch_size 避免 GPU 爆内存。
3. model_optimization_config
与 model_optimization_flavor 类似,但是引入了更多的控制量化的时候使用的系列参数,其中包含:
compression_params– 类似上面的compression_level,但是更加精细,而且支持 16bits 的量化,比如设置所有支持的层为 16bits:model_optimization_config(compression_params, auto_16bit_weights_ratio=1)negative_exponentglobalscalibration– 主要是通过默认是只使用 64 张图片进行量化数据分析的,如果精度出现异常,可以尝试增加这个数字,但是增加这个可能导致量化效果不好,一般会配合 clipping 使用:model_optimization_config(calibration, batch_size=4, calibset_size=128)checker_cfg
4. quantization_param
主要是用于手动调整每层或者指定层的一些量化参数,基本格式为:
quantization_param(<layer>, <parameter>=<value>)
基本参数有:
bias_mode– 设置层的 bias 行为,例如:使用 16bits 而非默认的 8bits。precision_mode– 常用,精度模式设置用于层的权重和激活表示的位数:quantization_param([conv1, maxpool2], precision_mode=a16_w16)quantization_groupsforce_range_out– 此命令在量化过程中强制将指定范围应用于给定层的输出。一般是通过 SNR 得到当前层的主要数据输出,利用这个来强制限制,消除 noise,查看精度是否改善。max_elementwise_feed_repeatmax_bias_feed_repeatnull_channels_cutoff_factoroutput_encoding_vectorgpu_policy
5. pre_quantization_optimization
此命令的所有功能在量化过程之前优化模型。其中一些命令会修改模型结构,并在其余命令之前执行:
dead_channels_removalzero_static_channelszero_static_channels per-layerse_optimizationequalization– 此子命令允许在量化前配置全局均衡行为,并替代了quantize()API 中的旧均衡参数。这个其实就是model_optimization_flavor(optimization_level=0)所做的任务,当然,特殊模型可以通过这个命令关闭此功能。equalization per-layerdead_layers_removalweights_clipping– 此命令允许在运行量化 API 时更改选定层的此行为并应用权重剪裁。对于权重值异常的情况,此命令可能有助于减少量化相关的退化。它仅适用于有权重的层。非常重要的通过 SNR 来进行操作实现精度提升的方式。activation_clipping– 类似weights_clipping,只是用于激活层。ew_add_fusing– 当启用此功能时,ew_add层将融合到卷积层(conv)和加法层(add)中。具有不兼容精度模式的层将不会被融合。类比理解 BN 融合入 Conv。layer_decompositionsmart_softmax_statsdefuse– 此命令允许根据去融合类型对层进行去融合:INPUT FEATURES– 对于选定的全连接层或卷积层,将输入特征去融合为指定数量的分割。也可以用来禁用某层的去融合。MULTI-HEAD ATTENTION (MHA)– 允许将由其第一个矩阵乘法表示的多头注意力块去融合为指定数量的分割。解决一些层比较大,不能量化的问题。
resolution_reduction– 减少所有输入层的模型分辨率,以便更有效地优化模型。这对精度会有影响。resolution_reduction per-layerglobal_avgpool_reduction– 此命令允许通过使用额外的 avgpool 来减少 avgpool 的空间维度。添加的 avgpool 的核大小将为 [1, h // division_factors[0], w // division_factors[1], 1]。可以解决某些时候量化的时候针对 avgpool 的量化报错。add_shortcut_layermatmul_correctionmatmul_equalizationsplit_ew_mult_by_bit_significance
6. post_quantization_optimization
此命令的所有功能在量化过程之后对量化的模型进行优化,以便提升模型的精度:
bias_correction– 此子命令允许在量化后过程期间配置全局偏置校正行为,此命令替代了quantize()API 中的旧ibc参数。bias_correction per-layertrain_encodingfinetune– 此子命令启用基于知识蒸馏的量化来做模型微调。简单来说就是利用浮点模型来知识蒸馏量化模型,以便提高量化模型的精度。optimization_level=2就是这个的简易版本。adaround– 同finetune,只是对每一层都进行知识蒸馏(optimization_level=4),非常耗时。adaround per-layermix_precision_search
发表回复