这个不用特别的指定,BPU支持的算子,工具链会优先选择通过BPU支持的。对于临输出的算子,考虑高精度输出,肯能链路会提前反量化后将一些算子运行在CPU上,对于这种如果确实需要跑回到BPU的,可以 在量化配置中的node_config中配置中指定类型为int8/int16就OK了,如下"node_config": { // 配置某个节点的输入数据类型"node_name1": {"qtype": "int8"/"int16"}}
上面这个是J5上的情况,J6上算子约束列表中没写,但是应该也是这样的,我确认后跟你说。但无论默认如何,CPU的精度相对好,性能不好;BPU性能好,但精度可能不好但也不绝对,所以通过配置然后以你编译的结果测试为准,毕竟你都知道怎么配置跑BPU,CPU了
上面这个是默认不做特殊配置这个是手动量化配置之后结论:j6和J5一样,正对softmap,考虑精度影响,默认是CPU运行的,但支持BPU运行,需要手动配置并由用户自己对开启后的精度影响评估然后确定是否要再BPU运行
1. 对的,默认就是在CPU上跑的,你如果想通过BPU加速就手动配置,但是跑BPU后肯能精度不好,这个评估和是否要通过BPU加速,你自己决定。2. 拆成这么多算子是使用BPU加速时硬件结构等因素决定的,这个数据算子实现的事情,用户侧只需要决定是否在BPU上跑就OK。其实你也可以看到SOFT落地过程中存在LUT(查表)算子,这个大部分时候对精度是有损伤的。
前面这个截图的这段话有点儿不理解。int32也是运行在bpu上吧?意思是通常情况下,conv+relu融合,一起为int8执行在bpu上。但如果conv在模型结尾,变成int32输出,还是在bpu上,relu没办法一起融合为int32,所以relu单独变成float32在cpu上执行?