Toybrick

RKNN是否支持部署Transformer模型?

Meeeteor

新手上路

积分
20
楼主
发表于 2022-12-5 15:42:35    查看: 3368|回复: 0 | [复制链接]    打印 | 只看该作者
最近在使用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的关键),也可以直接告知。感谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表