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 提供

检测

检测在 onnx-mlir 中原型化,可用于调试运行时问题。

编译以进行检测

默认情况下,检测处于关闭状态。您需要使用以下命令行选项将其打开。检测传递将使用 --instrument-stage 选项插入到某些阶段。例如,当您指定 Onnx 时,检测将在 onnx-to-onnx 转换后插入以获得 onnx 级别的分析。 --instrument-ops 选项是一个用于指定要检测的操作的选项。例如,您可以使用 onnx.Conv 来代表 onnx Conv 操作。此外,您可以使用星号,例如 onnx.* 代表所有 onnx 操作,并使用 , 指定两个表达式,例如 onnx.Conv,onnx.Add 代表 Conv 和 Add 操作。 --InstrumentBeforeOp--InstrumentAfterOp 是在指定操作之前和/或之后插入检测的选项。当您使用 --instrument-ops=onnx.* --InstrumentBeforeOp --InstrumentAfterOp 时,检测将在所有 onnx 操作之前和之后插入。对于 NNPA,提供了 ZHighZLow 的附加阶段。您可以使用 --instrument-stage=ZHigh--instrument-ops=onnx.*,zhigh.* 获取 onnx 和 zhigh 操作的分析,并使用 --instrument-stage=ZLow--instrument-ops=zlow.* 获取 zlow 操作的分析。

  --instrument-stage=<value>                        - Specify stage to be instrumented:
    =Onnx                                             -   Profile for onnx ops. For NNPA, profile onnx ops before lowering to zhigh.
    =ZHigh                                            -   NNPA profiling for onnx and zhigh ops.
    =ZLow                                             -   NNPA profiling for zlow ops.

  --instrument-ops=<string>                         - Specify operations operations to be instrumented:
                                                      "NONE" or "" for no instrument,
                                                      "ops1,ops2, ..." for the multiple ops.
                                                      e.g. "onnx.Conv,onnx.Add" for Conv and Add ops.
                                                      Asterisk is also available.
                                                      e.g. "onnx.*" for all onnx operations.

  Specify what instrumentation actions at runtime:
      --InstrumentBeforeOp                          - insert instrument before op,
      --InstrumentAfterOp                           - insert instrument after op,
      --InstrumentReportTime                        - instrument runtime reports time usage,
      --InstrumentReportMemory                      - instrument runtime reports memory usage.

目前,初始化调用 OMInstrumentInit 需要在您加载动态库之前添加。正在考虑将其添加到编译器中的 main_graph 的开头。

使用检测运行

以与往常相同的方式运行模型。检测库将在每个检测点打印出时间和内存使用情况。例如,一个模型 mymodel.onnx 使用 onnx-mlir --instrument-stage=Onnx --instrument-ops=onnx.* --InstrumentAfterOp --InstrumentReportMemory --InstrumentReportTime mymodel.onnx 编译。其运行时输出列示如下

==PERF-REPORT==, onnx.Cast, bert/encoder/Reshape__27, before, 0.000001, 1692654182.738546
==PERF-REPORT==, onnx.Cast, bert/encoder/Reshape__27, after, 0.000001, 1692654182.738547
==PERF-REPORT==, onnx.Concat, bert/encoder/Reshape__27, before, 0.000000, 1692654182.738547
==PERF-REPORT==, onnx.Concat, bert/encoder/Reshape__27, after, 0.000001, 1692654182.738548
==PERF-REPORT==, onnx.Reshape, bert/encoder/Reshape, before, 0.000001, 1692654182.738549
==PERF-REPORT==, onnx.Reshape, bert/encoder/Reshape, after, 0.000001, 1692654182.738550

这里解释了时间测量的输出。

这里解释了内存测量的输出。

NNPA 的其他示例

在运行时控制检测

通过在运行时提供某些环境变量,您可以禁用检测库的报告。

请注意,启用检测的唯一方法是在编译时请求它。如果在运行时没有打开任何详细报告(例如时间和内存使用情况),则仍然会打印出检测点的进度。此功能被认为对作为进度指示器很有用。要完全禁用在编译时请求的任何输出,您必须设置 ONNX_MLIR_NO_INSTRUMENT

在 gdb 中使用

检测点的函数称为 OMInstrumentPoint。可以在此函数内部设置断点,以便逐个步骤执行 onnx 操作。