新用户注册入口 老用户登录入口

[转载]tvm在linux环境下的安装与编译及vscode如何配置tvm的远程连接调试环境

文章作者:转载 更新时间:2023-12-12 20:04:26 阅读数量:86
文章标签:TVM安装编译Linux环境
本文摘要:本文旨在指导用户在Linux环境下安装Apache TVM,首先从GitHub下载TVM源码并通过conda创建虚拟环境(tvmenv)并安装相关依赖库。接着,在该环境中配置、编译TVM源码以生成libtvm.so和libtvm_runtime.so动态链接库,并设置了特定的环境变量如TVM_LOG_DEBUG。通过Python接口验证TVM安装成功后,演示了如何将PyTorch模型转换至TVM框架下进行预测。虽然文章未详细展开,但还涵盖了如何配置VSCode远程连接调试环境以及FFI Navigator插件的安装步骤,以提升开发与调试TVM项目的体验。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_42730750/article/details/126723224。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

文章目录

    • 前言
    • 1. 安装TVM
      • 1.1 下载源码
      • 1.2 创建虚拟环境及安装依赖库
      • 1.3 编译TVM源码
      • 1.4 验证安装是否成功
    • 2. 配置vscode
    • 3. 安装FFI Navigator
    • 结束语

前言

  本篇文章介绍一下 tvmlinux环境下的安装与编译,以及如何使用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源码

  如果linux上没有安装C/C++的编译环境,需要进行安装:

# 更新软件
apt-get update
# 安装
apt-get install build-essential 
# 安装cmake
apt-get install cmake

  在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(建议先 OFF)# 在末尾添加一个cmake的编译宏,确保编译出来的是debug版本
set(CMAKE_BUILD_TYPE Debug)

在这里插入图片描述

在这里插入图片描述
  编译tvm,这里开启了16个线程:

cd build
cmake ..
make -j 16
# 建议开多个线程,否则编译速度很慢哦

在这里插入图片描述

在这里插入图片描述

  大约5分钟,即可生成我们需要的两个共享链接库:libtvm.solibtvm_runtime.so

在这里插入图片描述

1.4 验证安装是否成功

  tvm版本验证:

import tvmprint(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 transformsmy_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_executordtype = "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 PyTorchtop1_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

  然后右键选择在当前窗口进行连接:

在这里插入图片描述

  除此之外,还可以设置免费登录,具体可参考这篇文章。

  当然,也可以使用windows本地的WSL2,vscode连接WSL还需要安装WSLDev Containers这两个插件。

  在服务器端执行code .会自动安装vscode server,安装位置在用户的根目录下:

在这里插入图片描述

3. 安装FFI Navigator

  由于TVM是由PythonC++混合开发,且大多数的IDE仅支持在同一种语言中查找函数定义,因此对于跨语言的FFI 调用,即Python跳转到C++或者C++跳转到Pythonvscode是做不到的。虽然解决这个问题在技术上可能非常具有挑战性,但我们可以通过构建一个与FFI注册码模式匹配并恢复必要信息的项目特定分析器来解决这个问题,FFI Navigator就这样诞生了,作者仍然是陈天奇博士。

  安装方式如下:

# 建议使用源码安装
git clone https://github.com/tqchen/ffi-navigator.git# 安装python依赖
cd ffi-navigator/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++相关的配置,这里不再详细的介绍了,感兴趣的小伙伴们可以了解下。

本篇文章为转载内容。原文链接:https://blog.csdn.net/qq_42730750/article/details/126723224。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
Apache TVMApache TVM是一个开源深度学习编译器框架,它提供了一种统一的方式来优化和部署深度学习模型到各种硬件平台,包括CPU、GPU、ASIC和FPGA等。在本文中,作者详细介绍了如何在Linux环境下从源码安装、编译以及验证TVM的正确性,并演示了如何将PyTorch模型转换为可在TVM上运行的形式。
Conda虚拟环境Conda是一种开源包管理器和环境管理系统,用于在同一个系统上创建和管理多个独立的Python环境。在本文语境中,用户通过Conda创建了一个名为tvmenv的虚拟环境,在其中安装特定版本的Python和其他依赖库,以便于在隔离的环境中编译和使用TVM。
CMake构建系统CMake是一种跨平台的开源自动化构建系统,用于管理软件项目构建过程中的配置、编译和安装步骤。在本文中,用户在TVM目录下创建build文件夹并使用CMake来配置和编译TVM源代码,生成适用于目标平台(如CPU)的动态链接库libtvm.so和libtvm_runtime.so。
PyTorch模型转换在深度学习领域,PyTorch模型转换是指将训练或预训练好的PyTorch模型转化为另一种框架或中间表示形式的过程。在本文中,展示了如何利用TVM前端接口将PyTorch模型转换成TVM可识别和执行的Relay IR(中间表示),从而实现在TVM上运行和优化该模型的功能。
Relay IRRelay IR是Apache TVM中的一个关键组件,它是TVM采用的一种高级中间表达格式,用于表示深度学习模型。通过将不同深度学习框架(例如PyTorch)导出的模型转换为Relay IR,TVM能够进一步对模型进行优化并在不同后端硬件上高效执行。在文章中,用户通过from_pytorch函数将PyTorch模型转化为Relay IR以供后续编译和执行。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在成功安装并编译Apache TVM后,开发者可以进一步探索如何利用这一高性能深度学习编译器优化模型,并将其部署至不同硬件平台。近期,TVM社区动态频繁,例如,发布了最新的稳定版1.0,对API进行了大量优化,增强了与更多深度学习框架如TensorFlow、PyTorch以及MXNet的兼容性,并且支持更多的硬件后端,包括GPU、CPU、ASIC和FPGA等。
此外,随着AI技术在边缘计算领域的快速发展,TVM在边缘设备上的应用也越来越受到关注。一项最新研究显示,通过TVM进行模型压缩和量化,能够在保持模型精度的同时,显著减少推理时延,有效提升了诸如自动驾驶、无人机监控等场景中边缘设备的实时处理能力。
对于希望深入了解TVM内部工作原理和技术细节的读者,推荐查阅其官方文档和论文《TVM: An Automated End-to-End Optimizing Compiler for Deep Learning》。该论文详细阐述了TVM的设计理念和关键技术,为开发者提供了理论基础和实践指导。同时,积极参与TVM社区的讨论和贡献,也是提升自己在深度学习编译器领域技能的重要途径。不少开发人员分享了他们在使用TVM过程中优化模型性能、解决实际问题的经验心得,这些内容均可在GitHub项目页面及相关的技术论坛中找到,值得深入研读和参考。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
df -h - 查看磁盘空间使用情况(含挂载点与剩余空间)。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
响应式抖音课程培训学院类企业前端模板下载 01-21 jQuery点击显示隐藏更多文字内容插件 01-15 黑色设计师简历响应式网页模板下载 01-14 [转载]Tomcat启动时卡在“ Deploying web application directory ”很久的解决方法 12-19 Saiku LDAP集成登录失效问题:排查配置错误、身份验证及解决方案实操 12-01 Spring Cloud微服务架构中注册中心的必要性与服务间通信实践:服务发现、API契约与高可用性考量 11-23 MahoutIllegalArgumentException在Apache Mahout中的应用场景:矩阵维度不匹配与向量索引异常解析及参数有效性的API调用实践 10-16 [转载]Docker 相关配置文件路径 09-08 蓝色精品美容整形机构网站模板 08-29 本次刷新还10个文章未展示,点击 更多查看。
Gradle在持续集成中的关键作用:自动化构建、依赖管理与多项目构建实践及CI服务器集成 07-06 化妆品购物商城通用网站模板下载 06-27 响应式建筑装饰设计类企业前端CMS模板下载 04-14 微服务架构下用户认证鉴权:网关层统一处理与服务内部处理的比较及选择考量 04-09 响应式会议活动主题着陆页网站模板 03-24 Tomcat内存泄漏问题在Web应用程序中的解决方案:Servlet上下文管理、全局变量引用与弱引用实践及监控工具应用 03-15 Kafka消费者消费偏移量设置:auto.offset.reset策略与手动控制方法详解 02-10 [转载]JavaScript中的时间与日期、正则表达式和Function类型 01-24 大气简洁手机电子产品展示柜台前端模板 01-22 项目案例展示设计公司企业网站模板 01-18 Bootstrap博客后台管理系统网站模板 01-08
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"