MLIR文件推理解析BUG

Viewed 687

目前TPU-MLIR已经支持MLIR文件推理验证,在推理程序执行之前,存在MLIR文件的两次解析校验工作如下:

需要使用MLIR解析工具ParseSourceFile函数解析文件,获取Module对象,进而对Module Region遍历获取其中的内容进行推理工作。

我注意到TPU层SubnetDivide Pass会新增子函数调用模块,我对该Pass完成之后的文件推理工作感兴趣,着手自己修改源码。首先选择截断SubnetDivide之后的所有Pass:

之后考虑在Python模块中新增一个验证函数validate_final_mlir重用mlir推理函数如下:

以上就是在Python端修改的全部代码,但是我获得了图二中ParseSourceFile函数报出的错误,新增的子函数无法找到如下:

我了解到当前系统不支持该文件的推理,因此尝试了一些解决方案。
首先通过debug版本gdb调试定位问题,发现当前项目对于MLIR的解析函数模块文件Parse以静态链接库形式封装,无法进入。因此通过MLIR官方源码复现问题,定位到该问题是由于CallOp引用的函数Symbol:subfunc_0在ModuleOp的SymbolTable中无法找到,该文件解析成功但验证CallOp的接口函数验证Symbol使用错误。
通过在MLIR官方平台编译,允许未注册Dialect和Operation的上下文环境,成功通过解析器函数解析获取了ModuleOp对象。因此认为final MLIR文件无问题,考虑到是当前平台调用的问题,但通过排查函数调用路径,我并没有获得任何发现。
我也尝试在MLIR社区和MLIR开发人员沟通此项问题,链接如下:
https://discourse.llvm.org/t/create-funop-in-mlir-file-mlir-parse-bug/70423
被告知该文件无问题,除此之外,我还做了新建pybind模块,调整函数插入方式,修改子网划分源码中op创建相关的工作,但都不能解决该解析器解析错误的问题,因此我希望在这里获得一些帮助,如果需要其他问题细节我可以继续补充。

2 Answers

我对该Pass完成之后的文件推理工作感兴趣,着手自己修改源码。首先选择截断SubnetDivide之后的所有Pass

TPU-MLIR现在不支持对final.mlir的推理(interpreter目前只支持对main函数的推理,同时限制main函数是一个basic block),final.mlir中出现了function call, 以及其他的for loop(layer group)语意,这些都是不支持的。可以通过增强ModuleInterpreter.cpp来实现对final.mlir的推理。

是的,后续IR文件出现了很多新的Op,Module的Region也变的更加复杂,可以通过增强interpreter来处理复杂的情况,但目前的问题在推理开始之前的校验部分,使用的是官方API,是否有详细的处理建议,感谢

可以贴一下你的mlir文件。我测试如下:

  1. 在python/test下,使用:./test_onnx.py --case TorchRoiAlign --chip bm1684x 得到TorchRoiAlign_f32_final.mlir
  2. 在 pymlir.cpp:85行(module_ = parseSourceFile(filename, context_.get());之后)注入:module_->dump();,
  3. 使用python code:
import pymlir
module = pymlir.module()
module.load("TorchRoiAlign_f32_final.mlir")

可以得到正确的mlir信息(与TorchRoiAlign_f32_final.mlir内容一致),可以排除c++部分的parser和verify问题。

根据给出的测试步骤,我并不能通过

我获得了该mlir文件,其中确实存在子函数调用,第三步使用python code能否告知在哪个目录,我在python/test下被告知无法导入pymlir模块,我选择在python/tool/model_deploy的主函数最开始加入这三行代码

很遗憾给出了:

SOPHGO Toolchain v1.1.beta.1-20230609
error: 'func.call' op 'subfunc_0' does not reference a valid function
python: ../bindings/pymlir/pymlir.cpp:85: void py_module::load(std::__cxx11::string): Assertion `module_' failed.

我拉取的是最新版本的代码,使用docker以DEBUG版本部署在Linux上,通过gdb我获得了下面的输出

Thread 1 "python3" hit Breakpoint 1, py_module::load (this=0x1298c70, filename="TorchRoiAlign_f32_final.mlir") at ../bindings/pymlir/pymlir.cpp:84
warning: Source file is more recent than executable.
84          module_ = parseSourceFile<ModuleOp>(filename, context_.get());
(gdb) p filename
$1 = "TorchRoiAlign_f32_final.mlir"
(gdb) n
[New Thread 0x7fffee908700 (LWP 19387)]
[New Thread 0x7ffff3109700 (LWP 19388)]
error: 'func.call' op 'subfunc_0' does not reference a valid function
85          assert(module_);

是否有其他地方需要注意以保持环境一致?最新版本的代码除此之外并未做其他改动。