onnx-mlir

Logo

MLIR 編譯器基礎架構中 ONNX 模型的表示和參考降低

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

錯誤也可以在操作的上下文之外回報。在這種情況下,必須提供位置。要回報警告或備註,只需將上面範例中的「Error」替換為「Warning」或「Remark」即可。

編譯器錯誤

一旦 ONNX 圖形經過驗證,所有後續錯誤情況都應使用 assert 回報以停止編譯,因為這是需要妥善處理的編譯器錯誤。可以使用兩個呼叫

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

unreachable 呼叫在應該傳回值的函式中很有用,因為如果該路徑上沒有虛擬值傳回陳述式,編譯器將不會回報警告。否則,在 void 函式中,使用 assert 是完全沒問題的。

參考文獻

其他相關資訊可在以下引用的 LLVM 和 MLIR 文件中找到。