拓冰建站拓冰建站
首页 / 资讯中心 / 正文

172、MLIR的Deterministic(确定性)编译与调试

MLIR的Deterministic(确定性)编译与调试一个让我熬夜到凌晨三点的bug去年做AI加速器编译器的时候,遇到一个极其诡异的bug:同样的模型,同样的输入,连续跑两次推理,结果居然不一样。第一次输出[0.1, 0.2, 0.3],第二次变成[0.1, 0.2, 0.30000001]。差异在第三位小数,但客户那边做金融风控的,小数点后六位都不允许抖动。我第一反应是浮点精度问题,但检查了所有算子,都是标准的FP32。然后怀疑是随机数种子没固定,但模型里根本没有dropout或随机初始化。最后把目光投向MLIR编译流程——问题出在编译器的“非确定性”上。非确定性从哪里来MLIR的编译过程,本质上是一个多趟pass的流水线。每一趟pass都可能引入非确定性,常见的有这么几类:Pass调度顺序的不确定性。MLIR的pass管理器默认是多线程的,不同pass之间如果有依赖关系,但依赖声明不完整,就可能出现A pass在B pass之前或之后执行,产生不同的中间表示。我遇到的那个bug,就是某个优化pass在另一个pass之前执行时,会错误地折叠掉一个reshape操作,导致后续的buffer分配偏移了一个字节。内存分配地址的不确定性。MLIR的bufferization pass会把tensor映射到内存buffer。如果分配策略是“首次适应”或“最佳适应”,不同运行环境下堆的初始状态不同,分配到的地址就不同。地址不同本身不是问题,但有些
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门