onnx-mlir

Logo

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

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

操作指南

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

参考

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

开发

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

工具

工具

RunONNXModel.py
DocCheck

本项目由 onnx 维护

托管于 GitHub Pages — 主题由 orderedlist 提供

MLIR 中的错误处理

错误有两种不同类型:来自用户输入的错误和编译器错误。对于用户输入错误,我们应提供有意义的用户反馈,并使用 emitError 函数。编译器错误应使用 assertsllvm_unreachable 调用报告。实践中,如果函数中检查错误并可以返回“失败”,首选方式是使用 emitError 并返回失败。另一方面,如果函数不允许返回失败,则应使用断言或不可达调用。返回错误对于检查用户输入的 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(condition-that-should-hold-true && "error message");
  llvm_unreachable("error message");

当函数应该返回值时,不可达调用很有用,因为如果该路径上没有 dummy-value return 语句,编译器将不会报告警告。否则,在 void 函数中,使用断言是完全可以的。

参考

更多相关信息可在下方引用的 LLVM 和 MLIR 文档中找到。