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 个不同的调用:emitErroremitWarning 和 ‘emitRemark`。错误通常应报告给调用函数以便妥善处理。典型用法如下所示。

  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");

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

编译器错误

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

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

unreachable 调用在应该返回值但没有虚拟返回值语句的函数中很有用。否则,在 void 函数中,使用 assert 是完全可以的。

参考资料

更多相关信息请参阅下面引用的 LLVM 和 MLIR 文档。