TVM——C代码和python代码结构

本文探讨了TVM如何利用Python的前端解析神经网络,并通过C编译生成高性能固件以解决部署到边缘侧和端侧时的性能问题。TVM的C代码编译为动态库,通过_ffi_api模块与Python交互,加载libtvm_runtime.so和libtvm.so。文章重点介绍了CMakeLists.txt中COMPILER_SRCS、RUNTIME_SRCS和LIBINFO_FILE的作用,以及它们在TVM编译和运行过程中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

伴随着python的崛起以及神经网络的广泛运用,python被越来越多人所使用。特别是现在“算法工程师”大部分都是用的是python来训练网络,但是python在边缘侧和端侧的性能不足会是一个部署所面临的严峻问题。因此TVM通过python的前端来解析网络,将网络通过编译生成高性能的模型固件,从而能够基本达到部署的条件。这篇文章主要学习python和C之间配合,来进行前后端的配合。此篇文章以linux环境为例。

打开与调用逻辑——_ffi_api模块

在TVM中,会把C有关的代码,编译成动态库。然后通过python代码CDLL来打开,并调用其中的函数。
所有TVM中C和python的交互都是通过模块_ffi模块来进行的。

  1. 在python启动,import tvm开始就会自动开始load所需的库。如下图所示,主要通过python\tvm_ffi\base.py中的_load_lib。通过定义相关环境变量,可以设置load library所查找的路径。最后通过ctypes.CDLL来打开动态库,可以来使用动态库中的函数。
    在这里插入图片描述
  2. 通过初始化函数_init_api来对打开的动态库中所需使用的函数放入到module中。如下图所示,首先会通过list_global_func_name函数调用_LIB的TVMFuncListGlobalNames,获取在_LIB所注册的函数。再通过注册函数的name来查找函数指针,通过setattr来把构造的函数handle放入到module中。
    在这里插入图片描述
    通过上述两个步骤,可以把C动态库中约定注册的函数拿出来进行使用。如在python\tvm\ir中所需要初始化的api:
tvm._ffi._init_api("ir", __name__
### 安装TVM 0.9版本于Ubuntu #### 准备工作 为了确保顺利安装TVM,在开始之前需确认已更新系统的包列表并安装必要的依赖项。这可以通过运行`sudo apt-get update && sudo apt-get upgrade`来完成,随后安装构建工具其他必需软件包[^1]。 ```bash sudo apt-get install -y build-essential cmake git libjpeg-dev libpng-dev \ python3-dev python3-setuptools python3-pip ninja-build ``` #### 获取源码 通过Git克隆指定版本的仓库可以获取到特定版本(如v0.9.dev)的TVM代码。此操作允许访问确切的历史提交记录以及相关联的功能分支[^2]。 ```bash git clone --recursive https://github.com/apache/tvm.git tvm_v0.9 -b v0.9.dev cd tvm_v0.9 ``` #### 编译配置 利用CMake进行编译前设置,创建一个名为build的新目录用于存放生成文件,并进入该目录执行cmake命令以初始化项目结构。对于大多数情况,默认选项已经足够;但是如果有特殊需求,则可以在调用时传递额外参数给cmake[^3]。 ```bash mkdir build cd build cmake .. ``` #### 构建过程 一旦完成了上述准备工作之后就可以正式开始了!使用ninja作为后台引擎来进行实际编译流程,期间可能会花费一些时间取决于机器性能等因素影响。完成后将会得到所需的库文件可执行程序[^4]。 ```bash ninja ``` #### Python绑定安装 为了让Python能够识别新安装好的TVM模块,还需要单独处理其对应的接口部分——即python-package子目录下的内容。这里推荐采用pip的方式快速部署环境变量指向正确路径下.so动态链接库的位置[^5]。 ```bash cd ../python python3 setup.py develop ``` 验证安装成功的方法之一就是尝试导入tvm模块而不报错: ```python import tvm print(tvm.__version__) ``` 如果一切正常的话应该会显示所期望看到的那个版本号字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值