linux(ubuntu20.04)安装tvm-0.9.0+llvm+cuda/cudnn(一步到胃版)

2023-05-16

我是在双系统中linux上安装的,不是Ubuntu虚拟机,虽然两者过程基本一样,但是在双系统上会更方便。

文章目录

    • 零:究极大招版
    • 一:环境准备
      • 1.1.安装gcc、cmake等必要的依赖
      • 1.2.python环境
    • 二:安装编译工具:llvm+cuda
      • 2.1 安装LLVM
      • 2.2 安装cuda+cudnn(可选)
    • 三:下载并编译tvm
      • 3.1 下载tvm
      • 3.2 编译tvm
        • 3.2.1 build文件夹
        • 3.2.2 配置build/config.cmake文件
        • 3.2.3 编译tvm
        • 3.2.4 tvm依赖报错处理(可选)
      • 3.3 将编译成功的tvm放入环境变量
    • 四:将tvm导入python
    • 五:测试tvm
      • 5.1 终端命令行测试
      • 5.2 pycharm测试

零:究极大招版

直接选择以下安装:

pip install apache-tvm
或者
conda activate xxxxx		
conda install apache-tvm

如果有人能够安装成功,那你就是天选之子!后面的步骤都与你无关,我建议你立刻去买张彩票,中了奖记得打赏我点(doge)。

不过绝大部分人应该是安装不成功的,那就按下面的步骤一步一步安装。

一:环境准备

1.1.安装gcc、cmake等必要的依赖

sudo apt install -y gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev

1.2.python环境

可以有以下几种:

1)单独的python环境
2)anaconda等创建的虚拟环境(这个环境可以是anaconda中普通的python环境,也可以是安装的pytorch、tensorflow等框架)

我们下面会把tvm安装到以上这些现有的python环境中,没必要重新为tvm创建一个新的python环境。

二:安装编译工具:llvm+cuda

2.1 安装LLVM

我使用的13.0.0,官网链接,找到自己所需的版本:在这里插入图片描述

注意:这个是编译好的,不是源代码,不需要自己编译。如果下载的是名字中带src的压缩包,还需要自己编译生成LLVM。

下载之后解压,并将文件名改为llvm,将其放入到/usr/local路径下
(/usr/lib路径也可以,只要自己记住就行)
在这里插入图片描述

然后将其放入环境变量(不放也可以,但最好放):

命令行输入:

sudo vim ~/.bashrc

将以下两行添加进去(注意里面的路径

export PATH=$PATH:/usr/local/llvm/bin
export LD_LIBRARY_PATH=/usr/local/llvm/lib

保存退出,然后命令行更新一下源文件:

source ~/.bashrc

2.2 安装cuda+cudnn(可选)

只安装llvm就可以用了,但是因为很多代码需要用到cuda+cudnn。如果你不想用cuda+cudnn,那你可以跳过这一步。

在这里不再展示如何安装cuda+cudnn,你可以到网上去搜索。

注意: 如果你是用命令行直接安装的cuda,那cuda的bin、include、lib64路径下是空的,不利于设置环境变量。所以我建议从官网下载cuda+cudnn,中间可能需要更换gcc的版本。
CUDA官网CUDNN官网
安装cuda+cudnn步骤可参考:博客1,博客2
降级 GCC / G++ 步骤可参考:博客1

配置环境变量:

如果你成功安装了cuda+cudnn,那么就把cuda放到环境变量里去:

sudo vim ~/.bashrc

并输入:

#cuda
export PATH=$PATH:/usr/local/cuda-11.6/bin
export CPATH=/usr/local/cuda-11.6/targets/x86_64-linux/include:$CPATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.6/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda-11.6/lib64

注意注意注意:一定要添加第二行的CPATH,否则编译时会报找不到相关的头文件

保存退出,然后命令行更新一下源文件:

source ~/.bashrc

三:下载并编译tvm

3.1 下载tvm

可以通过git下载,如果没有git就先下载git(sudo apt-get install git)
(双系统可能需要处理一下git,我用git下载tvm一直下载不成功):

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

也可以在官网下载:https://github.com/apache/tvm/releases
在这里插入图片描述
我选择的是0.9.0版本的。
下载解压到 ** /home/用户名 ** 的路径下,并将文件名称改为tvm。

3.2 编译tvm

3.2.1 build文件夹

进入tvm文件夹中,新建一个build文件夹,并将cmake文件夹下的config.cmake文件复制到build文件夹中。
在这里插入图片描述

3.2.2 配置build/config.cmake文件

修改文件夹build中的config.cmake文件
可以用ubuntu自带的编辑器打开,也可以用vim在终端打开。

修改以下内容:

SET(USE_LLVM OFF)
改为:
SET(USE_LLVM ON) 或者 SET(USE_LLVM /usr/local/llvm/bin/llvm-config)

SET(USE_CUDA OFF)
改为:
SET(USE_CUDA ON) 或者 SET(USE_CUDA /cuda的路径)

SET(USE_CUDNN OFF)
改为:
SET(USE_CUDNN ON)

此外:
如果要对IR进行debug:set(USE_RELAY_DEBUG ON)并在环境变量中加入TVM_LOG_DEBUG的路径
如果要对编译过程进行debug:set(USE_GRAPH_EXECUTOR ON) 和(USE_PROFILER ON)

保存退出。

这一步是为了用LLVM/cuda编译tvm。

3.2.3 编译tvm

在build文件夹下右键选择“在终端中打开”,执行下面两行:

# (确保终端中的路径为/tvm/build)

cmake ..
make -j16	(数字代表编译的进程数,根据自己的电脑选择)

系统编译完tvm后会还会自动搜索tvm的依赖。

3.2.4 tvm依赖报错处理(可选)

注:make -j16 编译完最后自动搜索tvm的依赖可能会报下面这种错误:
(如果没有报错就跳过3.2.4直接看3.3)

usr/bin/ld: 找不到 -lz: 没有那个文件或目录
/usr/bin/ld: 找不到 -ltinfo: 没有那个文件或目录
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/tvm.dir/build.make:1370:libtvm.so] 错误 1
make[2]: 离开目录“/home/用户名/tvm/build”
make[1]: *** [CMakeFiles/Makefile2:144:CMakeFiles/tvm.dir/all] 错误 2
make[1]: 离开目录“/home/用户名/tvm/build”
make: *** [Makefile:130:all] 错误 2

注意:找不到的"-lz"和"-ltinfo"的格式都是"-lxxx",第一个字母l并不是其名称,所以两个问题是找不到"z"和"tinfo",我们安装时需要在名字前面加"lib",尾部加"-dev",即接下来我们安装的是"libz-dev"和"libtinfo-dev"。

(其实在第一步环境准备时这玩意已经被安装过了,但是这里报错,是因为版本不兼容?不满足依赖?为什么有时候报错有时候不报错!)

1)用apt尝试安装

sudo apt-get install libz-dev
sudo apt-get install libtinfo-dev

试一下看能否安装。

如果安装成功,看这一步:3)重新搜索tvm的依赖
若不能安装,有如下报错的话看下面一步:2)用aptitude安装

在这里插入图片描述
2)用aptitude安装

安装aptitude:

aptitude会自动识别要安装的包之间的依赖关系

sudo apt-get install aptitude

安装缺失的包:

sudo aptitude install libz-dev
sudo aptitude install libtinfo-dev

每个包安装时都会提醒你是否接受他给出的解决方案,按照它给出的方案选着“y”或者“n”。
在这里插入图片描述

3)重新搜索tvm的依赖

再次输入:

make -j16

因为tvm已经编译成功了,这次不会再次编译,只会搜索tvm的依赖:

在这里插入图片描述

3.3 将编译成功的tvm放入环境变量

和上面的将LLVM放入环境变量过程一样:

命令行输入:

sudo vim ~/.bashrc

将下面两行加进去:

export TVM_HOME=/tvm的路径    (如果你是按照上面的步骤来做的,tvm的路径应该是:/home/用户名/tvm)
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

保存退出后更新一下:

source ~/.bashrc

四:将tvm导入python

先安装一些必要的包:

pip install numpy decorator attrs tornado psutil xgboost cloudpickle tensorboard
或者:
conda activate 环境名 
conda install numpy decorator attrs tornado psutil xgboost cloudpickle tensorboard

再进入/tvm/python路径下(里面有setup.py文件,用于将tvm导入python):

cd ..				("/tvm/build"退出到"/tvm")
cd python					(进入"/tvm/python"路径)
python setup.py install		(将tvm导入python)

五:测试tvm

下面以anaconda中的环境为例。

5.1 终端命令行测试

命令行输入:

conda activate 环境名
python

逐行输入:

import tvm
tvm.__version__
tvm.cuda().exist	(如果按照上述步骤安装了cuda)

如果输出’0.9.0 +true’证明安装成功。
在这里插入图片描述

5.2 pycharm测试

打开pycharm新建一个项目,并将python解释器设置为刚刚导入tvm的python。

输入:

import tvm
print(tvm.__version__)
print(tvm.cuda().exist)

如果输出0.9.0+true说明安装成功。

如下图:说明我的cuda、tvm都可以用了。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux(ubuntu20.04)安装tvm-0.9.0+llvm+cuda/cudnn(一步到胃版) 的相关文章

  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 在 vimrc 中切换匹配

    我的 vimrc 文件中有以下几行 hi ExtraWhitespace cterm NONE ctermbg green ctermfg green guibg green guifg green match ExtraWhitespac
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 如何使用 PyAudio 选择特定的输入设备

    通过 PyAudio 录制音频时 如何指定要使用的确切输入设备 我的电脑有两个麦克风 一个内置 一个通过 USB 我想使用 USB 麦克风进行录音 这流类 https people csail mit edu hubert pyaudio
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • 使用 terminfo 的终端颜色?

    我正在编写一个 C 类 允许在终端中使用颜色 我希望它适用于每个终端 在支持真彩色 24 位 的终端上打印 在支持它的终端上具有 256 色 6x6x6 其他都是基本的 16 种颜色 我曾经使用 termcap 编写过一次 C 函数 并且我
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • C# - OPC-UA 服务器应用程序尚未在 Linux 计算机中创建 PKI 证书

    当我跑步时OPC UA serverWindows 机器中的 C 应用程序 然后 OPC UA 服务器已创建证书路径C ProgramData OPC Foundation pki own 并在此路径中生成一些证书 但是当我在中安装 OPC
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从

随机推荐