关键词:
文章目录
前言
本篇文章介绍一下 tvm
在linux
环境下的安装与编译,以及如何使用vscode
来配置tvm
的远程连接调试环境。
所需软硬件环境:
环境 | 版本 |
---|---|
local system | windows 10 |
service system | ubuntu 18.04 |
tvm | latest(0.9.dev0) |
python(conda) | python 3.8.13 |
local IDE | vscode |
1. 安装TVM
1.1 下载源码
# 从github上拉取源码
git clone --recursive https://github.com/apache/tvm tvm
# --recursive指令:由于tvm依赖了很多第三方的开源库(子模块)
# 加入该参数之后也将相应的子模块一起进行clone
# 或者直接下载源码
https://tvm.apache.org/download
1.2 创建虚拟环境及安装依赖库
使用conda
创建tvm
的虚拟python
环境,python
版本为3.8
,虚拟环境名为tvmenv
:
conda create -n tvmenv python=3.8
编辑tvm
目录下的conda/build-environment.yaml
文件:
# conda/build-environment.yaml
# Build environment that can be used to build tvm.
name: tvmenv
# The conda channels to lookup the dependencies
channels:
- anaconda
- conda-forge
# 将name的值改为刚刚创建的虚拟环境名tvmenv
执行下面的指令,将构建tvm
所需的环境依赖更新到当前虚拟环境中:
conda env update -f conda/build-environment.yaml
# conda env update -n tvmenv -f conda/build-environment.yaml
# 设置完之后需要重新deactivate/activate对环境进行激活
如果上述命令执行较慢,可以将
conda
换成国内源(建议使用北京外国语大学的开源镜像站):参考连接
然后修改conda/build-environment.yaml
文件:
channels:
- defaults
# - anaconda
# - conda-forge
安装python
依赖库:
pip install decorator tornado psutil 'xgboost<1.6.0' cloudpickle -i https://pypi.tuna.tsinghua.edu.cn/simple
# 如果使用onnx或者pytorch作为原始模型,则还需要安装相应的依赖库
pip install onnx onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
在当前虚拟环境中添加用于tvm debug
的环境变量:
conda env config vars set TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1"
# conda env config vars set TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1" -n tvmenv
# 设置完之后需要重新deactivate/activate对环境进行激活是环境变量生效
使用这种方式设置环境变量的好处是:只有当前环境被激活(conda activate)
时,自定义设置的环境变量才起作用,当conda deactivate
后自定义的环境变量会自动清除。
当然,也可以更简单粗暴一些:
export TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1"
在当前虚拟环境中添加用于tvm python
的环境变量:
export TVM_HOME=your tvm path
export PYTHONPATH=$TVM_HOME/python:$PYTHONPATH
1.3 编译TVM源码
在tvm
目录下创建build
文件夹,并将cmake/config.cmake
文件复制到此文件夹中:
mkdir build
cp cmake/config.cmake build/
编辑build/config.cmake
进行相关配置:
# 本次是在cpu上进行测试,因此没有配置cuda
set(USE_LLVM ON) # line 136
set(USE_RELAY_DEBUG ON) # line 285
# 在末尾添加一个cmake的编译宏,确保编译出来的是debug版本
set(CMAKE_BUILD_TYPE Debug)
编译tvm
,这里开启了16
个线程:
cd build
cmake ..
make -j 16
# 建议开多个线程,否则编译速度很慢哦
大约5
分钟,即可生成我们需要的两个共享链接库:libtvm.so
和 libtvm_runtime.so
1.4 验证安装是否成功
tvm
版本验证:
import tvm
print(tvm.__version__)
pytorch
模型验证:
# from_pytorch.py
# https://tvm.apache.org/docs/how_to/compile_models/from_pytorch.html
# ps: TVM supports PyTorch 1.7 and 1.4. Other versions may be unstable.
import tvm
from tvm import relay
from tvm.contrib.download import download_testdata
import numpy as np
# PyTorch imports
import torch
import torchvision
######################################################################
# Load a pretrained PyTorch model
# -------------------------------
model_name = "resnet18"
model = getattr(torchvision.models, model_name)(pretrained=True)
# or
# model = torchvision.models.resnet18(pretrained=True)
# or
# pth_file = 'resnet18-f37072fd.pth'
# model = torchvision.models.resnet18()
# ckpt = torch.load(pth_file)
# model.load_state_dict(ckpt)
model = model.eval()
# We grab the TorchScripted model via tracing
input_shape = [1, 3, 224, 224]
input_data = torch.randn(input_shape)
scripted_model = torch.jit.trace(model, input_data).eval()
######################################################################
# Load a test image
# -----------------
# Classic cat example!
from PIL import Image
# img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"
# img_path = download_testdata(img_url, "cat.png", module="data")
img_path = 'cat.png'
img = Image.open(img_path).resize((224, 224))
# Preprocess the image and convert to tensor
from torchvision import transforms
my_preprocess = transforms.Compose(
[
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
]
)
img = my_preprocess(img)
img = np.expand_dims(img, 0)
######################################################################
# Import the graph to Relay
# -------------------------
# Convert PyTorch graph to Relay graph. The input name can be arbitrary.
input_name = "input0"
shape_list = [(input_name, img.shape)]
mod, params = relay.frontend.from_pytorch(scripted_model, shape_list)
######################################################################
# Relay Build
# -----------
# Compile the graph to llvm target with given input specification.
target = tvm.target.Target("llvm", host="llvm")
dev = tvm.cpu(0)
with tvm.transform.PassContext(opt_level=3):
lib = relay.build(mod, target=target, params=params)
######################################################################
# Execute the portable graph on TVM
# ---------------------------------
# Now we can try deploying the compiled model on target.
from tvm.contrib import graph_executor
dtype = "float32"
m = graph_executor.GraphModule(lib["default"](dev))
# Set inputs
m.set_input(input_name, tvm.nd.array(img.astype(dtype)))
# Execute
m.run()
# Get outputs
tvm_output = m.get_output(0)
#####################################################################
# Look up synset name
# -------------------
# Look up prediction top 1 index in 1000 class synset.
# synset_url = "".join(
# [
# "https://raw.githubusercontent.com/Cadene/",
# "pretrained-models.pytorch/master/data/",
# "imagenet_synsets.txt",
# ]
# )
# synset_name = "imagenet_synsets.txt"
# synset_path = download_testdata(synset_url, synset_name, module="data")
# https://raw.githubusercontent.com/Cadene/pretrained-models.pytorch/master/data/imagenet_synsets.txt
synset_path = 'imagenet_synsets.txt'
with open(synset_path) as f:
synsets = f.readlines()
synsets = [x.strip() for x in synsets]
splits = [line.split(" ") for line in synsets]
key_to_classname = spl[0]: " ".join(spl[1:]) for spl in splits
# class_url = "".join(
# [
# "https://raw.githubusercontent.com/Cadene/",
# "pretrained-models.pytorch/master/data/",
# "imagenet_classes.txt",
# ]
# )
# class_name = "imagenet_classes.txt"
# class_path = download_testdata(class_url, class_name, module="data")
# https://raw.githubusercontent.com/Cadene/pretrained-models.pytorch/master/data/imagenet_classes.txt
class_path = 'imagenet_classes.txt'
with open(class_path) as f:
class_id_to_key = f.readlines()
class_id_to_key = [x.strip() for x in class_id_to_key]
# Get top-1 result for TVM
top1_tvm = np.argmax(tvm_output.numpy()[0])
tvm_class_key = class_id_to_key[top1_tvm]
# Convert input to PyTorch variable and get PyTorch result for comparison
with torch.no_grad():
torch_img = torch.from_numpy(img)
output = model(torch_img)
# Get top-1 result for PyTorch
top1_torch = np.argmax(output.numpy())
torch_class_key = class_id_to_key[top1_torch]
print("Relay top-1 id: , class name: ".format(top1_tvm, key_to_classname[tvm_class_key]))
print("Torch top-1 id: , class name: ".format(top1_torch, key_to_classname[torch_class_key]))
2. 配置vscode
安装两个vscode
远程连接所需的两个插件,具体如下图所示:
安装完成之后,在左侧工具栏会出现一个图标,点击图标进行ssh
配置:
ssh yourname@yourip -A
然后右键选择在当前窗口进行连接:
除此之外,还可以设置免费登录,具体可参考这篇文章。
3. 安装FFI Navigator
由于TVM
是由Python
和C++
混合开发,且大多数的IDE
仅支持在同一种语言中查找函数定义,因此对于跨语言的FFI
调用,即Python
跳转到C++
或者C++
跳转到Python
,vscode
是做不到的。虽然解决这个问题在技术上可能非常具有挑战性,但我们可以通过构建一个与FFI
注册码模式匹配并恢复必要信息的项目特定分析器来解决这个问题,FFI Navigator
就这样诞生了,作者仍然是陈天奇博士。
安装方式如下:
# 建议使用源码安装
git clone https://github.com/tqchen/ffi-navigator.git
# 安装python依赖
cd python
python setyp.py install
vscode
需要安装FFI Navigator
插件,直接搜索安装即可(安装到服务器端)。
最后需要在.vscode/setting.json
进行配置,内容如下:
"python.analysis.extraPaths": [
"$workspaceFolder/python"
], // 添加额外导入路径, 告诉pylance自定义的python库在哪里
"ffi_navigator.pythonpath": "/home/liyanpeng/anaconda3/envs/tvmenv/bin/python", // 配置FFI Navigator
"python.defaultInterpreterPath": "/home/liyanpeng/anaconda3/envs/tvmenv/bin/python",
"files.associations":
"type_traits": "cpp",
"fstream": "cpp",
"thread": "cpp",
"*.tcc": "cpp"
更详细内容可以参考项目链接。
结束语
对于vscode
的使用技巧及C/C++
相关的配置,这里不再详细的介绍了,感兴趣的小伙伴们可以了解下。
ubuntu(linux)安装vscode并配置c++编译及cmake多文件编译(代码片段)
目录标题VScode配置c++编译环境1.Linux系统安装2.在Ubuntu中安装VScode2.1.首先下载对应系统的VScode安装包2.2.安装VScode3.在ubuntu系统下的vscode中配置g++/gcc编译、运行环境3.1.打开VSCode,快捷键(Ctrl+Shift+X)打开扩... 查看详情
caffecaffe在linux环境下的安装与编译
网上的caffe的安装教程繁杂而散乱,对初学者很不友好,尤其对该框架理解不深的童鞋。总的来说,caffe的安装不外乎几个固定的步骤,对每一步有了一定的理解,安装只是time-consuming的问题!关键是自己要理解每一步是做什... 查看详情
在x86的docker中构建tvm的arm环境(代码片段)
...像2.安装acl库3.编译arm运行时4.编译在x86运行在arm4.1在x86的环境中构建arm的编译环境4.2测试x86-ubuntu与arm-ubuntu能否ping通4.3调用RPC4.4ACL的使用5.arm版的tvm编译和运行时环境5.1构建arm版的tvm编译和运行时环境5.2关于ubuntu18.04升级glibc掉入... 查看详情
动态库与静态库的区别在windows及linux环境下的制作及用法(代码片段)
文章目录在linux环境下:在windows环境下:dll和lib简介Windows下使用静态库在VS2013中创建Win32项目,创建后编译器弹出选项框,选择静态库项目分别编写.h文件和.cpp文件右键项目->生成创建控制台应用程序,并编... 查看详情
用xshell编译linux环境下的插件怎么确定编译通过
参考技术A在Linux主机上安装上传下载工具包rz及sz,apt-getinstall-ylrzsz上传文件使用rz命令输入rz回车,弹出资源管理器,选择我们要上传的文件 查看详情
vscode--搭建自动编译sass环境
一,安装插件及使用步骤1、vscode安装LiveSassCompiler,由于该插件依赖LiveServer,所以会自动安装LiveServer2、点击vscode底部的WatchmySass3、按F1键,在输入栏中输入LiveSass:WatchSass来监听Sass文件( LiveSass:StopWatchingSass停止监听文件)4... 查看详情
在x86的docker中构建tvm的arm环境(代码片段)
...像2.安装acl库3.编译arm运行时4.编译在x86运行在arm4.1在x86的环境中构建arm的编译环境4.2测试x86-ubuntu与arm-ubuntu能否ping通4.3调用RPC4.4ACL的使用5.arm版的tvm编译和运行时环境5.1构建arm版的tvm编译和运行时环境5.2关于ubuntu18.04升级glibc掉入... 查看详情
vscode安装与配置(使用msys2环境与mingw-w64编译环境)(代码片段)
...电脑系统是Windows10 x64,所以选择 2,配置Msys2环境在开始菜单启动MSYS2输入命令:pacman-Syu更新MSYS2软件库然后出现提示,此时关闭窗口再打开输入pacman-Syu当提示没有更新时即是最新再安装常用开发环境与工具pacman- 查看详情
python❀软件安装与环境部署(代码片段)
...2、Python下的第一个程序2.1在不同操作系统下的Python编译环境2.1.1在Linux系统中安装Python2.1.2在Windows系统中安装Python2.2在不同操作系统下调用Python程序2.2.1在Linux系统中调用2.2.2在Windows系统中调用当前的编程环境下,主要有两种... 查看详情
python❀软件安装与环境部署(代码片段)
...2、Python下的第一个程序2.1在不同操作系统下的Python编译环境2.1.1在Linux系统中安装Python2.1.2在Windows系统中安装Python2.2在不同操作系统下调用Python程序2.2.1在Linux系统中调用2.2.2在Windows系统中调用当前的编程环境下,主要有两种... 查看详情
ndk在windows下的开发环境搭建及开发过程
...释。.so本是linux下的文件类型,所以编译.so必需要在linux环境下,那么怎样在win下进行编译呢?随便在网上搜下,教程也是五花八门,不清不楚,没有一定功底,即便看着教程到最后预计 查看详情
tvm安装(二):pycharm远程调试
参考技术Apycharm远程调试环境网上已经有很多答案,这里不重复,但在远程调试TVM时会有一个坑:pycharm不能读取远程机器的环境变量,从而导致cuda出错或各种错误,比如:Checkfailed:(bf!=nullptr)isfalse:target.build.cudaisnotenabled因此需要... 查看详情
golang开发环境搭建(代码片段)
阅读目录Windows下搭建Go开发环境-安装和配置SDK检查GOPROXY非常重要Go开发编辑器VSCode介绍下载与安装安装go扩展第一个Go程序编译Windows下VSCode切换cmd.exe作为默认终端gorungoinstallWindows编译Linux可执行文件Linux编译Windows可执行文件Window... 查看详情
rust单链表的实现
0.比较Windows和Ubuntu下开发Rust的区别##Rust环境安装>Widnows下,在按照官方网站安装rust后;安装时要选windows下的工具链;需要c++的tool-chains来编译rust程序,所以要安装VC++2010以上的开发环境,。>Ubuntu下,在按照官方网站安装rust后(cu... 查看详情
vscode配制perl环境
...要的扩展(我用的是Perl和PerlDebug) 创建项目,配置环境1.创建项目新建一个文件test.pl2.配置Perl编译环境点击左侧Debug,选择addconfigurations,弹出launch.json文件,修改配置如下://UseIntelliSensetolearnaboutpossibleattributes.//Hovertoviewdesc... 查看详情
编译器vscode配置go语言开发环境(代码片段)
...Go是否安装成功1.3配置包管理器GoMOD镜像2配置VSCode下的Go环境2.1从扩展管理中安装Go插件2.2安装插件依赖的工具2.3使用Go命令编译Go程序3参考资料1下载并安装Go1.1安装Go编译器因为国内网络的原因可以选择到Go中文网下载,选择... 查看详情
esp32开发:搭建linux开发环境--vscode操作(代码片段)
目录一、概述二、安装VSCode2.1安装依赖环境2.2获取ESP-IDF2.3安装EspressifIDF插件2.3.1查看python版本2.3.2安装pip2.3.3安装python3.82.3.5卸载python2.3.6更换为ubuntu22.04三、创建工程四、编译下载程序1.设备连接到虚拟机2.设置目标板3.添加用户... 查看详情
win7下的tomcat编译的java项目可不可以直接放在linux下的tomcat下运行
现在开发用的是win7的开发环境,tomcat是window类型的,现在编译完成的项目可不可以直接放在contos6下的tomcat直接运行,有没什么注意点!希望的到你的高见!可以的,但是前提是你的代码要符合规范,在代码里面没有引用特殊的w... 查看详情