目前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创建相关的工作,但都不能解决该解析器解析错误的问题,因此我希望在这里获得一些帮助,如果需要其他问题细节我可以继续补充。