TVM教程-----Export and Load Relax Executables
Export and Load Relax Executables目录Export and Load Relax Executables本教程演示如何将编译好的 Relax module export 为共享对象shared object再加载回 TVM runtime并在交互环境或独立脚本中运行结果。本教程展示如何使用tvm.relaxAPI将 Relax或导入的 PyTorch / ONNX程序变成可部署产物。Note本教程以 PyTorch 作为源格式但对 ONNX 模型而言export/load 工作流相同。对于 ONNX请使用from_onnx(model, keep_params_in_inputTrue)替代from_exported_program()随后按相同步骤进行 build、export 与 load。IntroductionTVM 将 Relax 程序构建为tvm.runtime.Executable对象。它们包含 VM bytecode、已编译的 kernel 以及常量。通过export_library()导出该 executable你会得到一个共享库例如 Linux 上的.so可以把它运到另一台机器、经 RPC 上传或稍后用 TVM runtime 重新加载。本教程给出端到端的确切步骤并说明过程中会产生哪些文件。importosfrompathlibimportPathtry:importtorchfromtorch.exportimportexportexceptImportError:# pragma: no covertorchNone# type: ignorePrepare a Torch MLP and Convert to Relax我们从一个小型 PyTorch MLP 开始以便示例保持轻量。模型被 export 为torch.export.ExportedProgram再翻译成 RelaxIRModule。importtvm_ffiimporttvmfromtvmimportrelaxfromtvm.relax.frontend.torchimportfrom_exported_program# Check dependencies firstIS_IN_CIos.getenv(CI,).lower()trueHAS_TORCHtorchisnotNoneRUN_EXAMPLEHAS_TORCHandnotIS_IN_CIifHAS_TORCH:classTorchMLP(torch.nn.Module):def__init__(self)-None:super().__init__()self.nettorch.nn.Sequential(torch.nn.Flatten(),torch.nn.Linear(28*28,128),torch.nn.ReLU(),torch.nn.Linear(128,10),)defforward(self,data:torch.Tensor)-torch.Tensor:# type: ignore[override]returnself.net(data)else:# pragma: no coverTorchMLPNone# type: ignore[misc, assignment]ifRUN_EXAMPLE:torch_modelTorchMLP().eval()example_args(torch.randn(1,1,28,28,dtypetorch.float32),)withtorch.no_grad():exported_programexport(torch_model,example_args)modfrom_exported_program(exported_program,keep_params_as_inputTrue)# Separate model parameters so they can be bound later (or stored on disk).mod,paramsrelax.frontend.detach_params(mod)print(Imported Relax module:)mod.show()Build and Export withexport_library我们为llvm构建以生成 CPU 代码然后导出得到的 executable。传入workspace_dir会保留中间打包文件便于检查产物内容。TARGETtvm.target.Target(llvm)ARTIFACT_DIRPath(relax_export_artifacts)ARTIFACT_DIR.mkdir(exist_okTrue)ifRUN_EXAMPLE:# Apply the default Relax compilation pipeline before building.pipelinerelax.get_pipeline()withTARGET:built_modpipeline(mod)# Build without params - well pass them at runtimeexecutabletvm.compile(built_mod,targetTARGET)library_pathARTIFACT_DIR/mlp_cpu.soexecutable.export_library(str(library_path),workspace_dirstr(ARTIFACT_DIR))print(fExported runtime library to:{library_path})# The workspace directory now contains the shared object and supporting files.produced_filessorted(p.nameforpinARTIFACT_DIR.iterdir())print(Artifacts saved:)fornameinproduced_files:print(f -{name})# Generated files:# - mlp_cpu.so: The main deployable shared library containing VM bytecode,# compiled kernels, and constants. Note: Since parameters are passed at runtime,# you will also need to save a separate parameters file (see next section).# - Intermediate object files (devc.o, lib0.o, etc.) are kept in the# workspace for inspection but are not required for deployment.## Note: Additional files like *.params, *.metadata.json, or *.imports# may appear in specific configurations but are typically embedded into the# shared library or only generated when needed.生成的文件说明mlp_cpu.so主要的可部署共享库包含 VM bytecode、已编译 kernel 和常量。注意由于参数在 runtime 传入你还需要单独保存一份参数文件见下一节。中间目标文件devc.o、lib0.o等会保留在 workspace 中供检查但部署时不需要。Note在特定配置下还可能出现*.params、*.metadata.json或*.imports等额外文件但它们通常被嵌入共享库或仅在需要时生成。Load the Exported Library and Run It一旦共享对象生成我们就可以在任意具有兼容指令集的机器上将其重新加载回 TVM runtime。Relax VM 直接消费该 runtime module。ifRUN_EXAMPLE:loaded_rt_modtvm.runtime.load_module(str(library_path))devtvm.cpu(0)vmrelax.VirtualMachine(loaded_rt_mod,dev)# Prepare input datainput_tensortorch.randn(1,1,28,28,dtypetorch.float32)vm_inputtvm.runtime.tensor(input_tensor.numpy(),dev)# Prepare parameters (allocate on target device)vm_params[tvm.runtime.tensor(p,dev)forpinparams[main]]# Run inference: pass input data followed by all parameterstvm_outputvm[main](vm_input,*vm_params)# TVM returns Array objects for tuple outputs, access via indexing.# For models imported from PyTorch, outputs are typically tuples (even for single outputs).# For ONNX models, outputs may be a single Tensor directly.ifisinstance(tvm_output,tvm_ffi.Array)andlen(tvm_output)0:result_tensortvm_output[0]else:result_tensortvm_outputprint(VM output shape:,result_tensor.shape)print(VM output type:,type(tvm_output),-,type(result_tensor))# You can still inspect the executable after reloading.print(Executable stats:\n,loaded_rt_mod[stats]())Save Parameters for Deployment由于参数在 runtime 传入并未嵌入.so我们必须单独保存它们以便部署。这是在其他机器或独立脚本中使用该模型的必要步骤。importnumpyasnpifRUN_EXAMPLE:# Save parameters to diskparams_pathARTIFACT_DIR/model_params.npzparam_arrays{fp_{i}:p.numpy()fori,pinenumerate(params[main])}np.savez(str(params_path),**param_arrays)print(fSaved parameters to:{params_path})# Note: Alternatively, you can embed parameters directly into the .so to# create a single-file deployment. Use keep_params_as_inputFalse when# importing from PyTorch:## .. code-block:: python## mod from_exported_program(exported_program, keep_params_as_inputFalse)# # Parameters are now embedded as constants in the module# executable tvm.compile(built_mod, targetTARGET)# # Runtime: vm[main](input) # No need to pass params!## This creates a single-file deployment (only the .so is needed), but you# lose the flexibility to swap parameters without recompiling. For most# production workflows, separating code and parameters (as shown above) is# preferred for flexibility.Note或者你也可以把参数直接嵌入.so形成单文件部署。从 PyTorch 导入时使用keep_params_as_inputFalsemodfrom_exported_program(exported_program,keep_params_as_inputFalse)# Parameters are now embedded as constants in the moduleexecutabletvm.compile(built_mod,targetTARGET)# Runtime: vm[main](input) # No need to pass params!这样只需.so一个文件即可部署但会失去不重新编译就更换参数的灵活性。对多数生产工作流而言按上文所示将代码与参数分离通常更灵活、更可取。Loading and Running the Exported Model要在另一台机器或独立脚本中使用已导出的模型你需要同时加载.so库和参数文件。下面是重新加载并运行模型的完整示例。将其保存为run_mlp.py要从命令行直接执行chmodx run_mlp.py ./run_mlp.py# Run it like a regular program完整脚本#!/usr/bin/env python3importnumpyasnpimporttvmfromtvmimportrelax# Step 1: Load the compiled librarylibtvm.runtime.load_module(relax_export_artifacts/mlp_cpu.so)# Step 2: Create Virtual Machinedevicetvm.cpu(0)vmrelax.VirtualMachine(lib,device)# Step 3: Load parameters from the .npz fileparams_npznp.load(relax_export_artifacts/model_params.npz)params[tvm.runtime.tensor(params_npz[fp_{i}],device)foriinrange(len(params_npz))]# Step 4: Prepare input datadatanp.random.randn(1,1,28,28).astype(float32)input_tensortvm.runtime.tensor(data,device)# Step 5: Run inference (pass input followed by all parameters)outputvm[main](input_tensor,*params)# Step 6: Extract result (output may be tuple or single Tensor)# PyTorch models typically return tuples, ONNX models may return a single Tensorifisinstance(output,tvm_ffi.Array)andlen(output)0:result_tensoroutput[0]else:result_tensoroutputprint(Prediction shape:,result_tensor.shape)print(Predicted class:,np.argmax(result_tensor.numpy()))在 GPU 上运行若要在 GPU 而非 CPU 上运行做如下修改为 GPU 编译教程前文大约在 line 112 附近TARGETtvm.target.Target(cuda)# Change from llvm to cuda在脚本中使用 GPU devicedevicetvm.cuda(0)# Use CUDA device instead of CPUvmrelax.VirtualMachine(lib,device)# Load parameters to GPUparams[tvm.runtime.tensor(params_npz[fp_{i}],device)# Note: device parameterforiinrange(len(params_npz))]# Prepare input on GPUinput_tensortvm.runtime.tensor(data,device)# Note: device parameter脚本其余部分保持不变。所有张量参数与输入都必须分配在与已编译模型相同的设备GPU上。部署检查清单当迁移到另一台主机经 RPC 或 SCP时你必须复制两个文件mlp_cpu.soGPU 则为mlp_cuda.so——已编译的模型代码model_params.npz——以 NumPy 数组序列化的模型参数远端机器需要这两个文件位于同一目录。上面的脚本假设它们相对于脚本位置在relax_export_artifacts/下。请按你的部署调整路径。对于 GPU 部署请确保目标机器有兼容的 CUDA 驱动且模型是为相同的 GPU 架构编译的。Deploying to Remote Devices要将已导出的模型部署到远端 ARM Linux 设备例如 Raspberry Pi可以使用 TVM 的 RPC 机制进行交叉编译、上传并远程运行模型。该工作流在以下场景很有用目标设备编译资源有限你希望在真实硬件上运行以微调性能你需要部署到嵌入式设备参见 cross_compilation_and_rpc 获取完整指南涵盖在远端设备上设置 TVM runtime在设备上启动 RPC server为 ARM 目标交叉编译例如llvm -mtripleaarch64-linux-gnu经 RPC 上传已导出的库远程运行推理ARM 部署工作流的快速示例importtvm.rpcasrpcfromtvmimportrelax# Step 1: Cross-compile for ARM target (on local machine)TARGETtvm.target.Target({kind:llvm,mtriple:aarch64-linux-gnu})executabletvm.compile(built_mod,targetTARGET)executable.export_library(mlp_arm.so)# Step 2: Connect to remote device RPC serverremoterpc.connect(192.168.1.100,9090)# Device IP and RPC port# Step 3: Upload the compiled library and parametersremote.upload(mlp_arm.so)remote.upload(model_params.npz)# Step 4: Load and run on remote devicelibremote.load_module(mlp_arm.so)vmrelax.VirtualMachine(lib,remote.cpu())# ... prepare input and params, then run inference关键差异在于编译时使用 ARM target triple并通过 RPC 上传文件而不是直接拷贝。FAQCan I run the.soas a standalone executable (like./mlp_cpu.so)?不行。.so文件是共享库不是独立可执行二进制。你不能从终端直接运行它。必须通过 TVM runtime 程序加载如上文 “Loading and Running” 一节所示。.so打包了 VM bytecode 与已编译 kernel但仍需要 TVM runtime 才能执行。Which devices can run the exported library?目标必须与你编译时所针对的 ISA 匹配本例为llvm。只要 target triple、runtime ABI 以及可用设备对齐就可以在机器之间迁移该产物。对于异构构建CPU 加 GPU还需要一并携带额外的设备库。What about the.paramsandmetadata.jsonfiles?这些辅助文件仅在特定配置下生成。在本教程中由于我们在 runtime 传入参数它们不会生成。当它们确实出现时可以与.so放在一起供检查但核心内容通常已嵌入共享对象本身因此通常仅部署.so就足够了。Download Jupyter notebook: export_and_load_executable.ipynbDownload Python source code: export_and_load_executable.py

相关新闻

Dockerfile入门:构建镜像的完整指南

Dockerfile入门:构建镜像的完整指南

目录 一、dockerfile简介 什么是dockerfile? dockerfile是什么? 为什么要用dockerfile? Dockerfile、Docker镜像和Docker容器的关系 二、DockerFile需要注意的编写规范 三、Docekrfile指令解析 四、常用的Dockerfile指令详解、格式与用法 4.1…

2026/7/31 1:24:58 阅读更多 →
Dify开源LLMOps平台:高效构建AI应用的实践指南

Dify开源LLMOps平台:高效构建AI应用的实践指南

1. 项目概述:Dify作为开源LLMOps平台的崛起在2023年AI智能体爆发式增长的背景下,Dify作为一款开源的LLMOps(大语言模型运维)平台迅速进入开发者视野。这个由国内团队开发的项目,本质上是一个面向生产环境的AI应用开发框…

2026/7/31 1:24:58 阅读更多 →
Unity URP自定义后处理开发指南:从ScriptableRendererFeature原理到Bloom实战

Unity URP自定义后处理开发指南:从ScriptableRendererFeature原理到Bloom实战

1. 项目概述:为什么URP的自定义后处理是必学技能?如果你正在用Unity的URP管线做项目,尤其是对画面表现有要求的项目,比如二次元风格、赛博朋克或者需要特殊滤镜效果,那你大概率已经遇到过内置后处理(Post-P…

2026/7/31 1:24:58 阅读更多 →

最新新闻

木箱采购全攻略:从选型到验收的实用指南

木箱采购全攻略:从选型到验收的实用指南

这类木箱、配件箱、木托盘和胶合板木箱的采购问题,最实际的不是看广告词,而是先搞清楚你的具体用途、承重要求和运输环境。很多第一次采购的人容易只看价格或规格表,结果收到货后发现尺寸不对、承重不够或运输途中损坏。下面按实际采购决策顺…

2026/7/31 2:12:13 阅读更多 →
粒子群优化算法(PSO)原理、实现与应用全解析

粒子群优化算法(PSO)原理、实现与应用全解析

1. 从鸟群觅食到算法核心:粒子群算法的直觉理解如果你曾经观察过鸟群在空中协同飞行,或者鱼群在水里灵活转向,你可能会惊叹于这种看似没有指挥官的群体,却能展现出如此高效、统一的集体智慧。它们是如何做到的呢?这个源…

2026/7/31 2:12:13 阅读更多 →
家政服务评价结算一体化智慧系统开发思路

家政服务评价结算一体化智慧系统开发思路

家政服务评价结算一体化智慧系统开发思路在家政行业数字化运营体系中,服务评价与薪资结算是管控服务质量、稳定师傅团队、规范企业财务的两大核心环节。绝大多数家政平台将用户评价、工单履约、薪资结算拆分为独立模块运行,评价仅作为简单的口碑展示&…

2026/7/31 2:12:13 阅读更多 →
VMware Workstation 17 Pro 安装与配置全指南:从虚拟化原理到实战技巧

VMware Workstation 17 Pro 安装与配置全指南:从虚拟化原理到实战技巧

1. 从“为什么”开始:虚拟化到底解决了什么痛点?如果你是一名开发者、运维工程师,或者只是对技术充满好奇的爱好者,那么“虚拟化”这个词你肯定不陌生。但很多时候,我们只是跟着教程,点击“下一步”安装好V…

2026/7/31 2:12:13 阅读更多 →
研究生必备:8款高效降AIGC工具深度评测与使用指南

研究生必备:8款高效降AIGC工具深度评测与使用指南

1. 研究生必备:8款高效降AIGC工具深度评测在学术写作领域,AI生成内容(AIGC)的检测正成为研究生群体面临的新挑战。去年某高校研究生院公布的数据显示,超过60%的学术不端案例涉及AI生成内容未规范标注的问题。作为经历过…

2026/7/31 2:12:13 阅读更多 →
先编译再检索:一个不用 embedding 的开源知识库

先编译再检索:一个不用 embedding 的开源知识库

市面上大多数「知识库问答」工具的套路都差不多:把文档切块、算 embedding、塞进向量库,提问时按相似度召回若干碎片喂给 LLM。KaaS 做了两个和主流不太一样的选择: 先编译再检索:不直接对原始碎片做 RAG。先用 LLM 把散乱内容编…

2026/7/31 2:11:12 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻