F8L-rknn问题案例和解答
客户在开发rknn遇到的问题案例及解答:
Q:int8量化精度怎么提升?
mxnet float32特征和RK量化后特征相似度内积求和结果对比:
asymmetric_u8(8bit) 0.965
dynamic_fix_point-8(8bit) 0.917
dynamic_fix_point-16(16bit) 0.999
可见 dynamic_fix_point-16 没有问题,asymmetric_u8精度有损失,如何提升?
工具版本:rknn-toolkit 1.4.0
A:rknn有支持混合量化,可以通过量化精度分析,精度损失比较大的层可以通过dynamic_fixed_point-16 量化。
Q:对量化损失很大的模型安装step2操作,修改指定层量化精度为float32, 但量化出来的模型损失更大,这个量化精度提高,损失不是变少吗?
A:1109 不支持浮点,所以设置float32无效
Q:你们一般提高量化精度的方法有哪些?
A:asymmetric_quantized-u8 、dynamic_fixed_point-8 、dynamic_fixed_point-16 、混合量化
Q:能不能支持TVM量化后的模型导入?
A:只支持TensorFlow框架已量化模型。
Q:请问int16和int8组成混合量化后,有速度比int16更慢的情况吗?
就是假设一共三层,第一层和第三层是int8,第二层是int16,这个速度比3层都是int16的要慢。
A:应该不会
Q:您好,我们这边转换的一个模型,调用 C API在目标板上运行报错,请问可能是什么原因呢?
A:放在rv1109上跑的话转换时候需要配置target_platform=['rv1109','rv1126']
Q:初始化模型,获取模型输入输出属性,耗时50秒左右,这个也不正常吧?
A:模型加载慢的话可以用预编译模型
Q:python从darknet量化的配置,错误码-6,这个可能是什么原因?python转换的模型,在提供的docker内可以跑,但在开发板上,用c++报错-6的信息.
A1:板子上用的是不是mini-drvier,mini-drvier只能支持预编译模型?对比机器里面的文件,看下用的哪个
external\rknpu\drivers\linux-armhf-puma
external\rknpu\drivers\linux-armhf-puma-mini
mini-drvier只能支持预编译模型。你们可以编译个完整drvier固件试一下
A2:云盘上的固件F8-NPU-1112.img是完整drvier的npu固件
Q:如果使用的是预编译模型,mini-driver 跟完整 driver 在模型运行性能方面有没有差别?驱动方面,两个driver对模型运行性能有无差异?
A:预编译模型加载会更快,无性能影响
Q:python的inference模型支持yolo的检测输出层,c++的不支持,yolo解anchor层。其实python的解anchor也是在外运行的,但模型里有这么一层。
A:python上能跑,c++应该也没问题,PC上连接1109板子,联机跑一下
ret = init_runtime(target=’rv1109’, device_id=’xxxxxx’)
Q:您好,想问下,我们有一个模型转RKNN模型时,如果未启用预编译,则可以实现单层输出,但若启用预编译,则实现不了单层输出(outout有多层),请问这可能是什么原因呢?有没有可能在预编译模式下也可以实现单层输出?原始模型为YoloV3类型。
A:直接从板子上导出预编译模型试一下。即先在PC上转换非预编译的RKNN模型,用examples\common_function_demos\export_rknn_precompile_model脚本直接从板子上导出预编译模型
。
Q:rk现在不能转l2 norm这个op吗,其他模型报错,l2 norm no implemention
A:支持的op列表: https://github.com/rockchip-linux/rknn-toolkit/blob/master/doc/RKNN_OP_Support_V1.4.0.md
Q:模型输入的属性显示tensor类型为INT16,是否要求实际输入到模型进行推理的数据也是INT16类型?
A:这个是可以配置的,你输入的数据是什么类型就配置什么类型,如果类型不一致的话,可能会出问题.