ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

TVM TIRx 后端扩展 API 全解析:tvm.backend 的加载机制与 CUDA / Trainium 注册集成

TVM TIRx 后端扩展 API 全解析:tvm.backend 的加载机制与 CUDA / Trainium 注册集成 模型编译深度学习推理引擎【免费下载链接】tvmOpen Machine Learning Compiler Framework项目地址https://gitcode.com/gh_mirrors/tv/tvm点击查看免费下载导读本文以 docs/tirx/api/backend.rst 为骨架深入解析 Apache TVM 中tvm.backend这一后端扩展 API它如何发现并加载目标设备拥有target-owned的 Python 语义如何通过一次注册同时挂载 TVMScript 命名空间、tile-dispatch 实现、目标标签、编译流水线入口点与代码生成支持。读完本文你将掌握tvm.backend.load/is_loaded的调用方式、自动加载的触发路径与开关、CUDAtvm.backend.cuda与 Trainiumtvm.backend.trn两大内置后端的注册入口及其在编译流水线中的实际作用并具备为自定义硬件编写独立后端包的能力。一、Backend Extension API 是什么在 TIRxTVM 新一代 Tile IR 编程框架中核心 IR 与编译机制集中在tvm.tirx命名空间下而目标设备target专属的语义——脚本命名空间、tile 原语分派、目标标签、编译流水线入口、代码生成回调——则统一由tvm.backend包承载。二者通过tvm.backend的发现 加载机制连接起来。按照 docs/tirx/api/backend.rst 的官方描述tvm.backenddiscovers and loads target-owned Python semantics. Depending on the target, loading a backend registers its TVMScript namespaces, tile-dispatch implementations, target tags, compilation-pipeline entry points, and code-generation support.即加载一个后端backend的副作用side effect是向tvm.tirx注册该目标设备拥有的全部 Python 语义。这些注册是幂等的因此多次导入不会产生重复注册。tvm.backend的包入口非常精简见 python/tvm/backend/init.py其对外 API 只有两个tvm.backend.load(name)加载名为name的后端触发其注册钩子tvm.backend.is_loaded(name)查询该后端是否已加载。二、后端加载机制load 与 is_loaded2.1 加载流程load的实现位于 python/tvm/backend/loader.py其执行步骤为幂等检查若name已存在于内部字典_LOADED_BACKENDS直接返回导入后端包importlib.import_module(ftvm.backend.{name})即后端包必须位于tvm.backend.name校验注册钩子包内必须暴露register_backend()函数否则抛出AttributeError挂载到 TIRx将模块对象同时写入tvm.tirx.name属性与sys.modules[tvm.tirx.name]调用register_backend()执行全部注册副作用建立公开别名调用_alias_loaded_backend_modules把tvm.backend.name.*下所有已加载子模块映射为tvm.tirx.name.*失败回滚任何异常都会从_LOADED_BACKENDS与tvm.tirx上回滚避免留下半加载状态。2.2 公开别名机制loader.py中通过_AliasModule、_AliasLoader与_BackendAliasFinder三件套实现了一个巧妙的导入重定向当代码执行from tvm.tirx.cuda import ...时sys.meta_path中的_BackendAliasFinder会将其重定向到真实的tvm.backend.cuda.*模块见 python/tvm/backend/loader.py。这意味着公开面用户统一通过tvm.tirx.backend.*访问后端能力实现面后端代码实际存放于tvm.backend.backend.*两者是同一模块的不同名字。这一层抽象让后端拥有backend-owned的边界清晰可见核心编译器不直接依赖任何具体硬件后端而具体后端也不会污染核心命名空间。2.3 自动加载与内置后端清单python/tvm/backend/_autoload_backends.py 实现了import tvm时的自动加载内置后端元组_BUILTIN_BACKENDS包含 9 个cuda、metal、rocm、trn、opencl、vulkan、webgpu、hexagon、adreno_load_builtin_backends()逐一调用load(name)并尝试加载libtvm_runtime_extra动态库以获取 C 侧注册副作用通过环境变量TVM_DEVICE_BACKEND_AUTOLOAD0可整体关闭自动加载纯运行时模式_RUNTIME_ONLY下跳过内置后端加载。2.4 树外out-of-tree后端扩展点自动加载同样面向第三方扩展开放。_autoload_backends会遍历 Python 包入口点分组tvm.backends并逐一调用声明的钩子函数见 python/tvm/backend/_autoload_backends.py# pyproject.toml以树外后端 tvm_foo 为例 [project.entry-points.tvm.backends] tvm_foo tvm_foo:_autoload其中tvm_foo._autoload()内部通常调用tvm.backend.load(foo)。若钩子抛异常只会产生warnings.warn警告不影响import tvm的其余流程。三、CUDA 注册register_backend 与脚本命名空间CUDA 是 TIRx 中最重要的后端之一其注册入口集中在 python/tvm/backend/cuda/init.py对应文档 docs/tirx/api/backend.rst 中 CUDA registration 一节的三个公开函数3.1tvm.backend.cuda.register_backend()执行以下注册动作见 python/tvm/backend/cuda/init.py运行时侧库加载尝试加载tvm_runtime_cudaRTLD_LOCAL模式失败时静默跳过设备目标探测器注册调用register_device_target_detector(cuda, _detect_target_from_device)让 TVM 能从Device对象自动推导 CUDATargetsm_compute_version、共享内存/线程上限、warp 大小等见同一文件_detect_target_from_deviceTVMScript 命名空间注册遍历script_namespaces()的返回值逐个调用register_script_namespace(name, namespace)挂载到 TIRx 脚本构建器导入触发副作用导入cpp、tile_primitive、target_tags三个子模块——它们本身不提供面向 kernel 作者的 API但导入过程会注册 C 代码生成回调、tile 原语分派与命名 NVIDIA 目标标签文档明确将这类模块称为实现面而非额外的 kernel 编写 API。3.2script_namespace()与script_namespaces()script_namespaces()返回 5 个 CUDA 拥有的脚本命名空间对象见 python/tvm/backend/cuda/init.pycuda、nvshmem、ptx_legacy、ptx、s_tirscript_namespace()是取单个cuda命名空间的便捷封装。加载完成后Tx.cuda、Tx.ptx、Tx.nvshmem等脚本命名空间即可在from tvm.script import tirx as Tx后直接使用用法示例见 docs/tirx/api/cuda.rstfrom tvm.script import tirx as Tx Tx.cuda.cta_sync() leader Tx.cuda.elect_sync()CUDA 命名空间的辅助函数覆盖同步参与any_sync/elect_sync/cta_sync/grid_sync/cluster_sync/__shfl_sync族、屏障与内存序mbarrier_wait/thread_fence/atomic_add/atomic_cas、归约warp_reduce/cta_sum/reduce_add_sync_u32等、描述符与地址wgmma.encode_matrix_descriptor/tcgen05.encode_matrix_descriptor/cvta_generic_to_shared/mov_sreg等、加载调用与诊断ldg/func_call/printf/clock64/ffs_u32、数值转换与打包运算half2float/float22half2/fmul2_rn/hmin2/fdividef等以及插桩兼容iket.mark/iket.range_start/timer_start/mma_store等。单条 PTX 指令级操作则走表驱动的Tx.ptx命名空间参见 docs/tirx/api/ptx.rst。3.3 CUDA 后端的模块化分工按 docs/tirx/arch/backends.rst 中 CUDA ownership 一节的划分tvm.backend.cuda按编译器职责切分为源码目录见 python/tvm/backend/cuda模块职责script、ptx构建Tx.cuda、Tx.ptx、兼容命名空间与 NVSHMEM 命名空间op定义 CUDA 脚本命名空间使用的 IR 构建器tile_primitive注册Tx.tile常见操作的 CUDA 实现copy/copy_async/gemm/elementwise/reduction/permute_layout 等子目录codegen、cpp注册源码生成回调与 CUDA C 辅助asm/builtins/descriptors/nvshmem 等transforms提供 CUDA 专属编译 passtarget_tags注册命名 NVIDIA 目标见下lang、iket提供可复用 kernel 工具tile 调度器、流水线、barrier、SMEM/TMEM 池与性能剖析编排其中target_tagspython/tvm/backend/cuda/target_tags.py通过register_tag注册形如nvidia/nvidia-a100sm_80、nvidia/nvidia-h100sm_90a等数据中心目标并针对 Jetson 系列注册带aarch64-linux-gnuhost 配置的嵌入式目标标签配置包含max_shared_memory_per_block、max_threads_per_block、thread_warp_size、registers_per_block等关键资源参数。四、Trainium 注册register_backend 与 NKI 命名空间AWS Trainium 后端遵循与 CUDA 完全相同的集成边界入口集中在 python/tvm/backend/trn/init.py对应文档 Trainium registration 一节4.1tvm.backend.trn.register_backend()注册动作见 python/tvm/backend/trn/init.py脚本命名空间注册将script_namespaces()返回的{nki: NKINamespace(...)}注册到 TIRx 脚本构建器导入副作用导入tile_primitive注册 Trainium 目标分派、pipeline、target_tags注册命名 AWS Trainium 目标、transform注册 Trainium 专属 pass编译流水线注册调用compilation_pipeline.register_tir_pipeline(trn, trn_pipeline.trn_pipeline)把 Trainium 的 TIR pass 序列挂到命名流水线trn上。4.2 脚本命名空间函数script_namespace(op_wrapperNone)返回NKINamespace实例script_namespaces(op_wrapperNone, **_)返回{nki: ...}。加载后Tx.nki命名空间即告就绪当前支持的算子包括load、store、tensor_copy、matmul、activation、activation_reduce、reciprocal、tensorreduce、tensortensor、tensorscalar、memset、identity、affine_select等完整列表见 docs/tirx/api/trainium.rst。4.3 Trainium 模块分工同样依据 docs/tirx/arch/backends.rst 的 Trainium ownership 一节tvm.backend.trn源码见 python/tvm/backend/trn的分工为script、op构建Tx.nki编程面tile_primitive注册目标分派实现binary/copy/gemm/reduction/select/unary/compose_op 等子目录layout、transform下沉 Trainium 专属内存映射如TrnNaiveAllocator、TrnPrivateBufferAllocpipeline组装 Trainium pass 序列target_tags注册命名 AWS Trainium 目标。五、注册副作用背后的核心注册点tvm.backend的每次register_backend()最终都落到 TIRx 核心的几个注册表上这是理解后端集成机制的关键脚本命名空间注册register_script_namespace(name, namespace)将命名空间挂到 TIRx 脚本构建器门面并同步写入__all__见 python/tvm/tirx/script/builder/ir.py。CUDA 注册的cuda、ptx、nvshmem、s_tirTrainium 注册的nki都经由这条路径生效。设备目标探测器注册register_device_target_detector(device_type, detector)写入SUPPORTED_DEVICE表见 python/tvm/target/detect_target.py使detect_target_from_device(dev)能按运行时设备类型自动生成对应Target。编译流水线注册register_tir_pipeline(name, pipeline_factory)写入PIPELINE_MAP见 python/tvm/tirx/compilation_pipeline.py随后get_tir_pipeline(name)即可按名取用预置流水线——Trainium 的trn流水线正是如此注册的。目标标签注册tvm.target.register_tag将命名标签如nvidia/nvidia-h100绑定到完整的 target 配置字典上供用户在编译时按名引用。此外C 侧还通过tvm_runtime_extra、tvm_runtime_cuda等动态库的导入副作用注册设备辅助模块的 codegen如codegen_cuda.cc需要找到的设备 helper 模块这也是 CUDAregister_backend中import_module(f{__name__}.cpp)等调用的根本目的——导入即注册无新增 kernel API。六、后端 API 的典型使用与关联文档地图6.1 查询与手动加载import tvm.backend as backend backend.is_loaded(cuda) # 检查 CUDA 后端是否已加载 backend.load(cuda) # 显式加载幂等可重复调用正常情况下import tvm已自动加载内置后端手动load主要用于树外后端或延迟加载场景。6.2 关联文档导航docs/tirx/api/cuda.rstkernel 面向的Tx.cuda辅助函数、Tx.nvshmem命名空间、tvm.backend.cuda.lang可复用工具tile 调度器、MBarrier、Pipeline、SMEMPool/TMEMPool等、IKET 剖析与 CUDA 专属 transformsdocs/tirx/api/ptx.rst表驱动的 PTX 指令命名空间与合法修饰符/操作数形式docs/tirx/api/trainium.rstTx.nki编程面、tvm.backend.trn的 layout / pipeline / transform 辅助 APIdocs/tirx/arch/backends.rst后端加载与注册的内部机制、CUDA 与 Trainium 的模块所有权划分。6.3 集成点小结回顾文档收尾的定义tvm.backend.cuda.register_backend、script_namespace、script_namespaces与tvm.backend.trn对应三个函数是后端集成点backend integration points——它们不面向 kernel 编写者直接使用而是为后端包提供统一入口kernel 编写者应使用各目标命名空间Tx.cuda、Tx.ptx、Tx.nki及配套 API。理解这一分层既能帮助你排查命名空间未注册 / 目标未识别类问题也能为接入新硬件后端提供清晰的接入范式新建tvm.backend.name包 → 实现register_backend()→ 声明入口点内置或tvm.backends组→ 由tvm.backend.load完成注册与别名挂载。赞分享模型编译深度学习推理引擎【免费下载链接】tvmOpen Machine Learning Compiler Framework项目地址https://gitcode.com/gh_mirrors/tv/tvm点击查看免费下载相关推荐TIRx 后端内部机制解析tvm.backend 的加载注册、CUDA 与 Trainium 所有权划分TIRx 后端内部机制解析tvm.backend 的加载注册、CUDA 与 Trainium 所有权划分 TIRx 是 TVM 中以 tvm.tirx 为核心模型编译深度学习推理引擎TVM TIRx Tile Primitive Dispatch 全解TilePrimitiveCall 的选型、下降与扩展机制TVM TIRx Tile Primitive Dispatch 全解TilePrimitiveCall 的选型、下降与扩展机制 导读TIRx 是 TVM模型编译深度学习推理引擎Apache TVM TIRx Trainium 后端编写与支持 API 完全指南Tx.nki 命名空间、布局助手与编译流水线Apache TVM TIRx Trainium 后端编写与支持 API 完全指南Tx.nki 命名空间、布局助手与编译流水线 导读 本文以 docs/tir模型编译深度学习推理引擎创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表