Paddle-Lite kernel选择和kernel注册方法改进
Created by: DannyIsFunny
【当前问题】Paddle-Lite在运行模型时偶尔出现如下问题:
【问题分析】
Paddle-Lite没有找到与模型中与描述的输入输出精度一致的算子。
例如:
gather
算子在模型中使用的时输入和输出都是int64
类型的,而Paddle-Lite
中同时注册了int64
输入输出和float输入输出的 gather
实现,但是运行时paddle-Lite
选择了float类型实现的gather
。
选中不一致精度实现的kernel后就会往模型的算子之间加入cast 算子来转换精度
【框架问题分析】
- 为什么Paddle-Lite选kernel时没有选择输入输出精度更匹配的int64实现
- kernel的int64\int32\float精度指的是什么,时输入输出的精度吗?
- 我们尝试将注册为int64精度的kernel修改为float32注册,发现注册会失败,找不到kernel
【问题定位与修复方法】
- 为什没选输入输出更匹配的int64 kenrel: static_pick_kernel.h 中为kernel打分算法
- kernel的精度
int64\int32\float
指什么? kernel精度应该只分int8
和float
,表示是否采用int8量化,没有其他精度类型。 - kernel 注册时为什么不能随意指定精度类型?
kernel 注册方法问题。当前所有的被注册kernel被被保存在全局map型的单例中。
Register_LITE_KERNEL
和kernel_base
类型实现分别指定了两次kernel的精度类型,而且分别被写入到kernels
单例的map index
和map value
中,两者不一致时可能导致注册kernel找不到自己的输入输出精度问题
【修复计划】
下下一个版本2.7修复kernel
选择方法和注册方式中可能存在的问题