onnx-mlir

Logo

ONNX 模型在 MLIR 编译器基础设施中的表示和参考下推

在 GitHub 上查看项目 onnx/onnx-mlir

操作指南

使用 Python 进行推理
使用 C/C++ 进行推理
使用 Java 进行推理

参考资料

ONNX 方言
OMTensor C99 运行时 API
OMTensorList C99 运行时 API
OMTensor Java 运行时 API
OMTensorList Java 运行时 API
生成 ONNX 方言
关于文档

开发

添加操作
测试指南
错误处理
命令行选项
插桩
常量传播
添加加速器

工具

工具

RunONNXModel.py
DocCheck

此项目由 onnx 维护

托管于 GitHub Pages — 主题来自 orderedlist

在 MLIR 中处理错误

错误有两种:用户输入错误和编译器错误。对于用户输入错误,我们应提供有意义的用户反馈,并应使用 emitError 函数。编译器错误应使用 assertsllvm_unreachable 调用报告。实际上,如果函数中存在错误检查功能,并且能够返回“失败”,则首选方式是使用 emitError 并返回失败。另一方面,如果函数不允许返回失败,则应使用 assert 或 unreachable 调用。返回错误对于检查用户输入的 Pass 很重要,例如在 ONNX 模型的引入过程中。

用户错误

MLIR 根据严重程度提供 3 种不同的调用:emitErroremitWarningemitRemark。错误通常应报告给调用函数以进行适当处理。典型用法如下所示。

  return op->emitError("message");
  return op->emitError() << "message";

上述调用将包含操作的位置。它返回一个 LogicalResult,可以按如下方式设置/测试。请注意,emitError 调用返回一个 failure() 值;

  LogicalResult isEven(int i) { return (i%2 == 0) success() : failure(); }

  if (succeeded(isEven(0)) && failed(isEven(1))) printf("It is all good.\n");

错误也可以在操作上下文之外报告。在这种情况下,必须提供一个位置。要报告警告或备注,只需在上述示例中将“Error”替换为“Warning”或“Remark”即可。

编译器错误

一旦 ONNX 图已验证,后续所有错误情况都应使用 assert 报告以停止编译,因为这是需要适当处理的编译器错误。可以使用两个调用

  assert(condition-that-should-hold-true && "error message");
  llvm_unreachable("error message");

unreachable 调用对于应返回值的函数很有用,因为如果该路径上没有虚拟值返回语句,编译器将不会报告警告。否则,在 void 函数中,使用 assert 是完全可以的。

参考资料

其他相关信息可在下面提到的 LLVM 和 MLIR 文档中找到。