欢迎光临散文网 会员登陆 & 注册

rknn转换wenet,chunk输出正常而cache输出异常的bug调试记录(上)

2023-08-24 11:18 作者:叫我小云或者云哥  | 我要投稿

问题就是板端encoder输出的有三个值,chunk,attcache,cnncache,只有chunk的精度是正常的,两个cache掉精度很严重,这里来调试一波!


用rknn分析工具说是第一层的layernorm有问题,但是layernorm只影响了chunk的输出,对cache影响不大,如果是layernorm有问题,那么chunk的输出也不会是0.999的准确度,所以先不管分析工具

首先确定attcacahe的出口,发现是在每层的selfattn,而且只涉及两个linear+一个cat

每次输出的new att cache都是k和vcat后的输出,而k和v是chunk经过不同的linear生成的

每次selfattn输入如下:

qkv都是相同的,因为我们最终的chunk是正确的,所以按理说这里的qkv和板端的输出是一致的,所以先找第0层encoder在onnx中的位置,然后寻找板端逐层输出的结果取出来

在selfattn外,x先经过了一个layernorm名字叫mha,所以就找这一层的输出:

很轻松找到了这个输出,在模型中计算余弦相似度

然而却是负的,说明我找错了板端输出,果然,这个rknn的runtime输入的chunk和torch的chunk都不一样:

震惊,原来没找错,是因为我torch输入的语音和rknn的不一样...(好丢人,赶紧写下来教训一下自己)修正后此处的余弦为0.9999是正确的,但是selfattn的输入还是不对

然而位置是正确的:

就是这个值啊

再往前追,第一次输入encoder的值是正确的,也就是encoders.0的输入:

接下来他就要经过模生的第一个layernorm了,看看结果:

结果果然不对....而且和rknn分析工具的结果一致:

所以问题又来了,rknn工具给出的最终chunk的输出精度也很低

但实际chunk精度正常,所以真相只有一个!

这个工具逐层分析的结果,板端输出的不是runtime的结果,不然根本对不上

rknn转换wenet,chunk输出正常而cache输出异常的bug调试记录(上)的评论 (共 条)

分享到微博请遵守国家法律