operand #3 does not dominate this use

Viewed 201

问题如图:image.png

1 Answers

分析思路:

这种问题一般是因为前面的Op引用了后面的Op,可以通过打印有问题的mlir结构,查看问题发生的地方。
分析过程:

1) 从打印知道是这条命令出错的:

tpuc-opt mobilebert_tf_bm1684x_int8_asym_tpu.mlir --strip-io-quant="quant_input=False quant_output=False" --weight-reorder --subnet-divide --layer-group --address-assign --save-weight --codegen="model_file=mobilebert_tf_bm1684x_int8_asym.bmodel" --mlir-print-debuginfo -o mobilebert_tf_bm1684x_int8_asym_final.mlir

2) 逐步从后到前减少pass,确定是哪个pass导致的错误。发现是subnet-divide出错:

tpuc-opt mobilebert_tf_bm1684x_int8_asym_tpu.mlir --strip-io-quant="quant_input=False quant_output=False" --weight-reorder --subnet-divide --save-weight --mlir-print-debuginfo -o mobilebert_tf_bm1684x_int8_asym_final.mlir

3)gdb定位到subnet-divide pass,如下:

gdb --args tpuc-opt mobilebert_tf_bm1684x_int8_asym_tpu.mlir --strip-io-quant="quant_input=False quant_output=False" --weight-reorder --subnet-divide --save-weight --mlir-print-debuginfo -o mobilebert_tf_bm1684x_int8_asym_final.mlir
image.png
(gdb) b SubnetDivide.cpp:191
(gdb) r
(gdb) p module.dump()
发现28%引用的32%的weight,这个是不符合mlir要求的,输入必须在输出前面定义,如下:
image.png

4) 从图中可以发现是因为33%也用了32%,把32%拉下来了,可以定位到代码处理2个相同weight时的bug。在SubNet中寻找这一块的逻辑错误。

发现这个地方对导致weight被push两次,32%就被会mv两次,导致32%跑到28%后面的。调整后问题解决。image.png