TVM:源码编译安装

TVM:Linux源码编译安装

笔者环境:

OS:Ubuntu 18.04

CMake:3.10.2

gcc:7.5.0

cuda:11.1

编译安装过程总览

本文将简介 tvm 的编译安装过程,包含两个步骤:

  1. 通过C++代码构建共享库
  2. 设置相关的语言包(如Python包)

源码获取

官网教程提供了两种源码获取方式:

  1. 通过下载页面直接下载

  2. 通过 github 仓库来下载

    git clone --recursive https://github.com/apache/tvm tvm
    

    注意一定要有 --recursive 参数,保证子模块正常下载。

构建共享库

构建 tvm 共享库,在我们 Linux 系统上即 libtvm.solibtvmruntime.so 。也可以只构建运行时库 libtvmruntime.so ,在要被部署的远程边缘设备(如树莓派、移动手机等)上,我们通常只需要安装运行时库。这也会在后面介绍远程边缘部署时提到。总之现在,在我们的主机上,我们先完全安装 tvm。

准备工作

官方给出的安装 tvm 的最小要求如下:

  • 一个支持C++ 14 的编译器 (如g+±5 or higher)
  • CMake 3.5 or higher
  • 强烈建议安装 llvm
  • Python 3.7 / 3.8 (Python 3.9 暂不支持)
  • 如果要使用CUDA,CUDA toolkit version >= 8.0

安装最小依赖

安装上述最小要求的命令(ubuntu / debian):

sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev

检查一下CMake,如果没有的话,到该下载页面下载。

llvm

llvm 虽然不是强制要求,但我们通常都是需要的,强烈建议大家安装。过程也很简单,从这个下载页面选择适合我们设备和系统的 pre-built 版本(压缩文件 .xz)下载并解压即可:

wget http://releases.llvm.org/x.x.x/clang+llvm-x.x.x-x86_64-linux-gnu-ubuntu-xx.xx.tar.xztar -xf clang+llvm-x.x.x-x86_64-linux-gnu-ubuntu-xx.xx.tar.xz

解压完成后进入解压目录,找到 bin 目录下的 llvm-config 文件,记下其路径,一会儿要用。

开始编译构建

准备工作完成之后我们开始编译构建。

首先进入到我们刚才下载的 tvm 源码目录下,新建 build 目录,将 cmake 目录下的 config.cmake 拷贝的 build 目录下:

cd tvm
mkdir build
cp cmake/config.cmake build/

然后按需修改 config.cmake 文件:

  • 如果要时候用某些后端和库(如CUDA, OpenCL, RCOM, METAL, VULKAN,等)。这里以CUDA为例,将 set(USE_CUDA OFF) 修改为 set(USE_CUDA ON),其他库同理。

  • 为了帮助调试,需要启用嵌入式图形执行器和调试功能 set(USE_GRAPH_DEBUG ON)set(USE_PROFILER ON)

  • 如果要调试 IR,要启用 set(USE_RELAY_DEBUG ON) ,并设置环境变量:

    export TVM_LOG_DEBUG="ir/transform.cc=1;relay/ir/transform.cc=1"
    
  • 使用 LLVM,这里要使用到我们刚才记下的 LLVM 路径了,设置 set(USE_LLVM /path/to/your/llvm/bin/llvm-config)

config.cmake 修改完成后,我们开始构建 tvm 及相关库:

cd build
cmake ..
make -j4

Python 包

Python 会根据环境变量 PYTHONPATH 寻找库文件,在 ~/.bashrc中设置这个环境变量,其中 /path/to/tvm 是上文 tvm 目录的绝对路径。

export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

python 依赖安装

  • 必需依赖

    pip3 install --user numpy decorator attrs
    
  • 如果要使用 RPC 追踪器

    pip3 install --user tornado
    
  • 如果要使用 auto-tuning 模块

    pip3 install --user tornado psutil xgboost cloudpickle
    

测试

这里我们用 Google Test 来进行测试,首先先安装 GTest(不要和 tvm 装在一起,建议另找一个目录):

git clone https://github.com/google/googletest
cd googletest
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

安装完成后,在 tvm 安装目录下执行测试:

./tests/scripts/task_cpp_unittest.sh

顺利完成无报错的话,即告 tvm 安装完成。

Ref:

https://tvm.apache.org/docs/install/from_source.html#developers-get-source-from-github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第2章线性表的基本使用及其cpp示例(第二章汇总,线性表都在这里)

2.1线性表的定义和特点 【类型定义: *是n个元素的有限序列 *除了第一个元素没有直接前驱和最后一个没有直接后驱之外,其余的每个元素只有一个直接前驱和直接后驱; (a1,a2…an) 【特征: *有穷性&#xff1…

TVM:通过Python接口(AutoTVM)来编译和优化模型

TVM:通过Python接口(AutoTVM)来编译和优化模型 上次我们已经介绍了如何从源码编译安装 tvm,本文我们将介绍在本机中使用 tvm Python 接口来编译优化模型的一个demo。 TVM 是一个深度学习编译器框架,有许多不同的模块…

TVM:在树莓派上部署预训练的模型

TVM:在树莓派上部署预训练的模型 之前我们已经介绍如何通过Python接口(AutoTVM)来编译和优化模型。本文将介绍如何在远程(如本例中的树莓派)上部署预训练的模型。 在设备上构建 TVM Runtime 首先我们需要再远程设备…

2.2线性表的顺序表

2.2.1线性表的顺序表示和实现------顺序映像 【顺序存储】在【查找时】的时间复杂度为【O(1)】,因为它的地址是连续的,只要知道首元素的地址,根据下标可以很快找到指定位置的元素 【插入和删除】操作由于可能要在插入前或删除后对元素进行移…

TVM:交叉编译和RPC

TVM:交叉编译和RPC 之前我们介绍了 TVM 的安装、本机demo和树莓派远程demo。本文将介绍了在 TVM 中使用 RPC 进行交叉编译和远程设备执行。 通过交叉编译和 RPC,我们可以在本地机器上编译程序,然后在远程设备上运行它。 当远程设备资源有限…

2.3单链表的基本使用及其cpp示例

2.3线性表的链式表现与实现 2.3.1.1单链表 【特点: *用一组任意的存储单元存储线性表的数据元素 *利用指针实现用不同相邻的存储单元存放逻辑上相邻的元素 *每个元素ai,除存储本身信息外,还存储其直接后继的元素(后一个元素的地址…

TVM:简介

TVM:简介概述 Apache TVM 是一个用于 CPU、GPU 和机器学习加速器的开源机器学习编译器框架。它旨在使机器学习工程师能够在任何硬件后端上高效地优化和运行计算。本教程的目的是通过定义和演示关键概念,引导您了解 TVM 的所有主要功能。新用户应该能够从…

2.3.3单链表的双向链表

2.3.3双向链表 插入、删除 指在前驱和后驱方向都能游历(遍历)的线性链表 双向链表的每个结点有两个指针域 【结构】:prior data next 双链表通常采用带头结点的循环链表形式 可理解为首位相接的数据“圈”,每个结点都可以向前…

nvidia-smi 命令详解

nvidia-smi 命令详解 简介 nvidia-smi - NVIDIA System Management Interface program nvidia smi(也称为NVSMI)为来自 Fermi 和更高体系结构系列的 nvidia Tesla、Quadro、GRID 和 GeForce 设备提供监控和管理功能。GeForce Titan系列设备支持大多数…

2.4一元多项式的表示及相加,含cpp算法

2.4一元多项式的表示及相加 n阶多项式的表示: n阶多项式有n1项 指数按升幂排序 【 优点: 多项式的项数可以动态增长,不存在存储溢出的问题插入,删除方便,不移动元素 【表示: 有两个数据域,一…

TVM:使用Tensor Expression (TE)来处理算子

TVM:使用Tensor Expression (TE)来处理算子 在本教程中,我们将聚焦于在 TVM 中使用张量表达式(TE)来定义张量计算和实现循环优化。TE用纯函数语言描述张量计算(即每个表达式都没有副作用)。当在 TVM 的整体…

4-数据结构-串的学习

4.1串类型的定义 1.串:(或字符串) 串是由多个字符组成的有限序列,记作:S‘c1c2c3…cn’ (n>0) 其中S是串的名字,‘c1c2c3…cn’ 是串值 ci是串中字符 n是串的长度,表示字符的数目 空串&a…

Linux下rm误删恢复 extundelete

Linux下rm误删恢复 extundelete 误删之后要第一时间卸载(umount)该分区,或者以只读的方式来挂载(mount)该分区,否则覆写了谁也没办法恢复。如果误删除的是根分区,最好直接断电,进入…

5-数据结构-数组的学习

5.1数组的定义 定义: 由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数据元素(简称元素),每个元素受n(n>1)个线性关系的约束,每个元素在n个线性关系中的序号i1、…

timm 视觉库中的 create_model 函数详解

timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷,在他们开源的代码中,大部分都用到了这样一个库:timm。各位炼丹师应该已经想必已经对其无比熟悉了,本文将介绍其中最关键的函数之…

C--数据结构--树的学习

6.2.1二叉树的性质 1.二叉树 性质: 1.若二叉树的层次从1开始,则在二叉树的第i层最多有2^(i-1)个结点 2.深度为k的二叉树最多有2^k -1个结点 (k>1) 3.对任何一颗二叉树,如果其叶结点个数为n0,度为2的非叶结点个数…

TVM:使用 Schedule 模板和 AutoTVM 来优化算子

TVM:使用 Schedule 模板和 AutoTVM 来优化算子 在本文中,我们将介绍如何使用 TVM 张量表达式(Tensor Expression,TE)语言编写 Schedule 模板,AutoTVM 可以搜索通过这些模板找到最佳 Schedule。这个过程称为…

TVM:使用 Auto-scheduling 来优化算子

TVM:使用 Auto-scheduling 来优化算子 在本教程中,我们将展示 TVM 的 Auto-scheduling 功能如何在无需编写自定义模板的情况下找到最佳 schedule。 与基于模板的 AutoTVM 依赖手动模板定义搜索空间不同,auto-scheduler 不需要任何模板。 用…

C语言—sort函数比较大小的快捷使用--algorithm头文件下

sort函数 一般情况下要将一组数从的大到小排序或从小到大排序&#xff0c;要定义一个新的函数排序。 而我们也可以直接使用在函数下的sort函数&#xff0c;只需加上头文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

散列的使用

散列 散列简单来说&#xff1a;给N个正整数和M个负整数&#xff0c;问这M个数中的每个数是否在N中出现过。 比如&#xff1a;N&#xff1a;{1,2,3,4}&#xff0c;M{2,5,7}&#xff0c;其中M的2在N中出现过 对这个问题最直观的思路是&#xff1a;对M中每个欲查的值x&#xff0…