iree onnx demo
計劃協議系列博客,記錄學習iree編譯器的過程.
今天第一篇博客,記錄安裝和測試iree
文章目錄
- iree onnx demo
- 下載安裝iree
- python環境安裝
- 編譯測試
- 1. [前端] onnx模型轉MLIR文件
- 2. [后端] MLIR文件轉可執行文件
- 3. [執行] 執行測試編譯后的文件
- 關于后端設備的介紹
下載安裝iree
IREE官網教程
這里都已經非常詳細了,按照官網教程可以成功配置
當然如果你和我一樣懶得看這么多, 你可以直接下載iree項目后, 項目內有一個編譯腳本
build_tools/cmake/build_all.sh
,直接執行 build_tools/cmake/build_all.sh build
就可以編譯iree到build文件夾了.
python環境安裝
上述的編譯步驟會自動編譯iree python的相關庫,前端IR的導入就是依賴這一部分,可以慘考 官網-python包編譯安裝 , 我是使用cmake指令直接安裝的
CMAKE_INSTALL_METHOD=ABS_SYMLINK python -m pip install -e ../iree-build/compiler
CMAKE_INSTALL_METHOD=ABS_SYMLINK python -m pip install -e ../iree-build/runtime
編譯測試
1. [前端] onnx模型轉MLIR文件
下載onnx 模型可以在: https://github.com/onnx/models/tree/main 這里找onnx 模型用來實驗.
本文將下載模型: https://github.com/onnx/models/tree/main/Computer_Vision/adv_inception_v3_Opset16_timm 用于后續的測試
- 使用下述指令即可將onnx模型轉為mlir文件,
free-import-onnx
是python工具,需要編譯IREE后安裝python相關的東西,- 也可以直接使用pip下載,自行查閱官網文檔.
iree-import-onnx \./*.onnx \--opset-version 17 \-o model.mlir
生成的MLIR文件是一個文本文件,可以直接打開
里面基本分類2個部分:
-
有哪些算子,比如
-
卷積算子
-
%190 = torch.operator "onnx.Conv"(%arg0, %2, %3) {torch.onnx.dilations = [1 : si64, 1 : si64], torch.onnx.group = 1 : si64, torch.onnx.kernel_shape = [3 : si64, 3 : si64], torch.onnx.pads = [0 : si64, 0 : si64, 0 : si64, 0 : si64], torch.onnx.strides = [2 : si64, 2 : si64]} : (!torch.vtensor<[1,3,299,299],f32>, !torch.vtensor<[32,3,3,3],f32>, !torch.vtensor<[32],f32>) -> !torch.vtensor<[1,32,149,149],f32>
-
常量算子
-
%188 = torch.operator "onnx.Constant"() {torch.onnx.value = dense_resource<_onnx__Conv_1156> : tensor<192x2048x1x1xf32>} : () -> !torch.vtensor<[192,2048,1,1],f32>
-
-
-
-
有哪些常量
-
一般就是權重和算子的參數
_onnx__Conv_1156: "0x0800000098233D3B52728ABEE29334BE1F0CF4BD48A5BDBD8D90713D..."
-
2. [后端] MLIR文件轉可執行文件
- 編譯MLIR
iree-compile \model.mlir \--iree-hal-target-backends=llvm-cpu \--iree-llvmcpu-target-cpu=host \-o model_cpu.vmfb
可以生成最終的編譯結果 vmfb
文件, 這是一個flatbuffer格式的, 可以通過 iree-dump-module ./model_cpu.vmfb
指令來看模型的結構.
# # | Offset | Length | Blocks | i32 # | ref # | Requirements | Aliases
# ----+----------+----------+--------+-------+-------+--------------+-----------------------------------------------------
# 0 | 00000000 | 17232 | 1 | 340 | 4 | |
# 1 | 00004350 | 488 | 1 | 24 | 8 | | main_graph$async
# 2 | 00004538 | 90 | 1 | 2 | 3 | | main_graph
# 3 | 00004598 | 2311 | 14 | 26 | 6 | | __init
其中J:
# main_graph$async 和 main_graph 更有可能是用于模型推理的函數。其中,main_graph$async 或許是異步執行的函數,而 main_graph 是同步執行的函數。你可以先嘗試使用 main_graph 作為函數名來運行模型
3. [執行] 執行測試編譯后的文件
- 執行測試
- 這里使用的是fp32全是2的數值的TV.
iree-run-module \--module=model_cpu.vmfb \--device=local-task \--function=main_graph \--input="1x3x299x299xf32=2" \./model_cpu.vmfb
關于后端設備的介紹
1. llvm-cpu
- 通用 CPU 后端(默認選項)
- 基于 LLVM 編譯器優化 CPU 指令
- 支持 x86/ARM 等主流 CPU 架構
- 適合沒有專用加速硬件的設備
2. metal-spirv
- 蘋果專有 GPU 加速方案
- 支持 iOS/macOS 設備的 Metal API
- 適配 Apple Silicon(M 系列芯片)和 A 系列芯片
- 需要 macOS 10.13 + 或 iOS 11+
3. vmvx
- 針對 Intel 視覺處理單元(VPU)
- 如 Movidius Myriad X 等邊緣 AI 芯片
- 適合低功耗嵌入式設備的視覺推理
- 需安裝 VPU 驅動和相關工具鏈
4. vmvx-inline
- 實驗性的 VPU 內聯編譯模式
- 直接在 CPU 上模擬 VPU 指令集
- 主要用于開發調試,性能較低
5. vulkan-spirv
- 跨平臺 GPU 加速方案
- 支持 NVIDIA/AMD/Intel 等主流 GPU
- 適用于 Linux/Windows/macOS 等系統
- 需安裝對應 GPU 的 Vulkan 驅動
6. webgpu-spirv
- 瀏覽器端 GPU 加速方案
- 基于 WebGPU API(需 Chrome/Firefox 等支持)
- 允許在網頁中直接運行 AI 模型
- 適用于 WebAssembly 環境
選擇建議:
- CPU 設備 → llvm-cpu
- 蘋果設備 → metal-spirv
- 通用 GPU → vulkan-spirv
- 邊緣 AI 設備 → vmvx
- 網頁應用 → webgpu-spirv