一、推理图优化
下载下来的graph我采用netron进行了可视化,发现该graph中包含预处理op(tf中采用了element-wise op进行了组合,减均值除方差)、也包含了softmax节点(在npu中实现不是很友好,建议抽出cpu进行后处理)。预处理和softmax op的netron可视化如下图:
预处理sub-graph
softmax输出
tf中提供了optimize_for_inference接口进行graph optimization操作,我们的优化思路很简单:即仅采用预处理之后到softmax之前的sub-graph,模型优化和裁剪的python脚本如下:
二、int8模型量化
rk提供了rknn-toolkit进行模型定点化的操作,我这边的诉求只是进行inference的性能评估,其他的我就不管啦,所以直接上量化的业务代码:
三、native 层性能评估业务代码
rk提供了rknn的native api,我们只要在上位机上遵循其api调用规则进行业务代码书写就可以啦,代码的头文件和核心推理代码块我就直接贴上来啦。
推理头文件
核心推理代码
最后
交叉编译后push到板子上进行了性能评估,resnet50的网络,输入为224x224,100次推理的平均耗时为25ms左右,基本跟rk提供的profile的性能文档可以对上。
|