ONNX 模型在 MLIR 编译器基础设施中的表示和参考降低
该项目由 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,提供了 ZHigh
和 ZLow
的附加阶段。您可以使用 --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
这里解释了时间测量的输出。
PERF-REPORT
。onnx_node_name
属性时,将显示此名称。before
还是 after
。这里解释了内存测量的输出。
MEM-REPORT
。NNPA 的其他示例
onnx-mlir --mcpu=z16 --maccel=NNPA --instrument-stage=Onnx --instrument-ops=onnx.* --InstrumentBeforeOp --InstrumentAfterOp --InstrumentReportTime mymodel.onnx
onnx-mlir --mcpu=z16 --maccel=NNPA --instrument-stage=ZHigh --instrument-ops=onnx.*,zhigh.* --InstrumentBeforeOp --InstrumentAfterOp --InstrumentReportTime mymodel.onnx
onnx-mlir --mcpu=z16 --maccel=NNPA --instrument-stage=ZLow --instrument-ops=zlow.* --InstrumentBeforeOp --InstrumentAfterOp --InstrumentReportTime mymodel.onnx
通过在运行时提供某些环境变量,您可以禁用检测库的报告。
ONNX_MLIR_NO_INSTRUMENT
,则不会有任何报告。ONNX_MLIR_NO_INSTRUMENT_TIME
,则会禁用时间使用情况的报告。ONNX_MLIR_NO_INSTRUMENT_MEMORY
,则会禁用内存使用情况的报告。ONNX_MLIR_INSTRUMENT_FILE
,则此变量将提供保存检测的文件名。请注意,启用检测的唯一方法是在编译时请求它。如果在运行时没有打开任何详细报告(例如时间和内存使用情况),则仍然会打印出检测点的进度。此功能被认为对作为进度指示器很有用。要完全禁用在编译时请求的任何输出,您必须设置 ONNX_MLIR_NO_INSTRUMENT
。
检测点的函数称为 OMInstrumentPoint
。可以在此函数内部设置断点,以便逐个步骤执行 onnx 操作。