ONNX-MLIR
本项目(https://onnx.ai/onnx-mlir/)提供编译器技术,可将有效的开放神经网络交换(ONNX)图转换为实现该图的代码,并且只需最少的运行时支持。 它实现了ONNX标准,并基于底层的LLVM/MLIR编译器技术。
本项目贡献了:
- 一个可集成到其他项目中的ONNX方言,
- 将ONNX图降级为MLIR文件/LLVM字节码/C和Java库的编译器接口,
- 一个执行这些降级的
onnx-mlir
驱动程序, - 以及一个Python/C/C++/Java运行时环境。
目前支持的ONNX操作代码生成级别列表如下: 通用CPU和 IBM的Telum集成AI加速器。
与社区互动
对于正在进行的讨论,我们使用Linux Foundation AI and Data工作区下建立的#onnx-mlir-discussion
Slack频道。
使用此链接加入此工作区。
我们使用GitHub Issues来征求意见、提问或报告错误。 安全相关问题使用SECURITY页面中列出的渠道报告。
我们每周二举行非正式会议,讨论当前问题和进展。会议议程、笔记和链接(参与)可在这里找到。请发送电子邮件至alexe@us.ibm.com申请15-30分钟的时间段来讨论特定感兴趣的主题。
使用预构建容器设置ONNX-MLIR
使用和开发ONNX-MLIR的首选方法是使用Docker镜像和容器,因为在某些系统上获取正确的代码依赖可能比较棘手。我们关于使用Docker的ONNX-MLIR说明在这里。
如果您打算开发代码,应该查看我们的工作流文档,它可以帮助您以一种易于贡献代码的方式设置Docker环境。
直接设置ONNX-MLIR
ONNX-MLIR可在Linux、OSX和Windows上原生运行。 下面提供了详细说明。
先决条件
python >= 3.8
gcc >= 6.4
protobuf >= 4.21.12
cmake >= 3.13.4
make >= 4.2.1 或 ninja >= 1.10.2
java >= 1.11 (可选)
所有PyPi
包依赖及其适当版本都列在requirements.txt中。
在这里查看设置先决条件软件的帮助。
在任何时候,ONNX-MLIR都依赖于LLVM项目的特定提交,该提交已被证明可以与该项目一起使用。 维护人员需要定期移至更新的LLVM级别。 除其他外,这需要更新clone-mlir.sh中的LLVM提交字符串。 在更新ONNX-MLIR时,最好检查MLIR/LLVM的提交字符串是否与该文件中列出的相同。当需要更新第三方ONNX时,请参阅此处的说明。
构建
MLIR和ONNX-MLIR的安装说明取决于您的操作系统。
安装完成后,onnx-mlir
可执行文件应该出现在build/Debug/bin
或build/Release/bin
目录中。
如果您在构建、重新构建或测试onnx-mlir
时遇到困难,请查看此页面获取有用提示。
使用ONNX-MLIR
onnx-mlir
的用法如下:
概览:ONNX-MLIR模块化优化器驱动程序
用法:onnx-mlir [选项] <输入文件>
选项:
通用选项:
--help - 显示可用选项(使用--help-hidden查看更多)
--help-list - 显示可用选项列表(使用--help-list-hidden查看更多)
--version - 显示此程序的版本
ONNX-MLIR选项:
这些是前端选项。
选择要生成的目标:
--EmitONNXBasic - 摄取ONNX并生成无推断形状的基本ONNX操作。
--EmitONNXIR - 摄取ONNX并生成相应的ONNX方言。
--EmitMLIR - 将输入降低到MLIR内置转换方言。
--EmitLLVMIR - 将输入降低到LLVM IR(LLVM MLIR方言)。
--EmitObj - 将输入编译为目标文件。
--EmitLib - 将输入编译并链接为共享库(默认)。
--EmitJNI - 将输入编译为jar文件。
优化级别:
--O0 - 优化级别0(默认)。
--O1 - 优化级别1。
--O2 - 优化级别2。
--O3 - 优化级别3。
完整的选项列表可通过-help
选项获取。
标志的-
和--
前缀可以互换使用。
请注意,与大多数编译器一样,默认优化级别是-O0
。
我们建议大多数应用程序使用-O3
。
选项也可以从ONNX_MLIR_FLAGS
环境变量中读取。例如,ONNX_MLIR_FLAGS="-O3"
将确保所有编译使用-O3
。
简单示例
例如,使用以下命令将ONNX模型(如add.onnx)降低到ONNX方言:
./onnx-mlir --EmitONNXIR add.onnx
输出应该类似于:
module {
func.func @main_graph(%arg0: tensor<10x10x10xf32>, %arg1: tensor<10x10x10xf32>) -> tensor<10x10x10xf32> {
%0 = "onnx.Add"(%arg0, %arg1) : (tensor<10x10x10xf32>, tensor<10x10x10xf32>) -> tensor<10x10x10xf32>
return %0 : tensor<10x10x10xf32>
}
}
这里提供了一个基于加法操作的示例,该示例使用Python脚本构建ONNX模型,然后提供一个主程序来加载模型的值、计算并打印模型输出。
编写驱动程序执行推理:端到端示例
这里提供了一个端到端示例,该示例使用我们的C/C++、Python或Java接口训练、编译并执行一个简单的MNIST示例。
文档
文档位于docs
子目录中;DocumentList页面提供了有组织的文档列表。我们的公共onnx.ai/onnx-mlir页面也提供了信息。
贡献
我们欢迎社区的贡献。 请查阅CONTRIBUTING页面了解如何进行贡献的帮助。
ONNX-MLIR要求提交者使用开发者原创证书(DCO)签署他们的代码。
实际上,每个git commit
都需要签名,具体说明请参见此处。
行为准则
ONNX-MLIR的行为准则在https://onnx.ai/codeofconduct.html 中描述。
相关/使用onnx-mlir的项目
- onnx-mlir-serving项目实现了一个用C++编写的GRPC服务器,用于服务onnx-mlir编译的模型。得益于C++实现,ONNX Serving具有非常低的延迟开销和高吞吐量。