最近在使用transformer模型做图像拼接任务,需要在RK3588上部署,所以尝试将该pytorch模型转ONNX再转RKNN,目前的情况是使用rknn toolkit2转换成功了,获得的rknn模型在PC端使用python接口可以正常运行,但在RK3588板子上使用C接口运行rknn_run时报错。我是分别使用了rknn toolkit2_1.3.0和rknn toolkit2_1.4.0生成的rknn模型并分别在对应的rknpu2_1.3.0与1.4.0下运行模型,以下图片贴出了两个版本的模型分别的报错内容(打印信息里有表明rknn版本信息)以及报错的层"Conv:ReduceSum_99_2conv"的可视化信息: 关于该模型的rknn部署工作我前前后后持续了有相当长的一段时间,也进行了许多尝试,最初模型运行时报错信息的“Div, unsupported type”,感兴趣可以看我之前的帖子《关于rknn多输入情况下模型推理出现错误》。后来查到是rknn的int8量化下的模型不支持div的广播操作(或者说有限的支持,经过我的测试仅支持除数与被除数shape完全一样或者被除数是数字的情形)。于是为了解决不能广播的问题,我手动重写了LayerNorm算子,在div之前,手动将除数的维度扩大(简单说就是把1x1200x32 div 1x1200x1的手动变成1x1200x32 div 1x1200x32),从而避开了rknn不支持div的广播的问题。 紧接着rknn toolkit2_1.3.0模型转换又报错不支持sqrt算子,sqrt就是个开根号的算子,为啥会不支持呢,我又用pow(0.5)也就是0.5次方代替了根号操作,至此又解决一个问题。 紧接着就又遇到了开头提到的问题。我用netron可视化仔细对比了一下ONNX模型与RKNN模型,发现报错的层"Conv:ReduceSum_99_2conv"对应ONNX模型中的“ReduceMean”算子。想来想去也没能理解一个求均值的操作为啥要用卷积来实现,以及为啥会在卷积这一层报错。至于RKNPU2_1.4.0的报错信息“Segementation fault”就更是无从下手。 以上就是我的整个transformer模型在RK3588上的部署经历,希望有大佬能帮忙答疑解惑,或者我的整个过程哪里有问题都可以帮忙指正,感谢不吝赐教。或者如果rknn目前就是不支持transformer(因为我发现迄今为止遇到的所有错误信息都是在LayerNorm中产生的,而它又可以说是transformer的关键),也可以直接告知。感谢! |
-
微信图片_20221202152111.png (36.79 KB, 下载次数: 632)
-
微信图片_20221202152131.png (36.61 KB, 下载次数: 626)
-
微信图片_20221202152136.png (14.36 KB, 下载次数: 591)
-
144 Bytes, 下载次数: 0, 下载积分: 灯泡 -1 , 经验 -1