部署模型并与 TVM 集成

本篇文章译自英文文档 Deploy Models and Integrate TVM tvm 0.14.dev0 documentation
更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站

本节介绍如何将 TVM 部署到各种平台,以及如何将其与项目集成。

在这里插入图片描述

构建 TVM runtime 库

不同于传统的深度学习框架,TVM 堆栈分为两个主要组件:

  • TVM compiler:负责模型的编译和优化。
  • TVM runtime:在目标设备上运行。

集成编译后的模块并不需要在目标设备上构建整个 TVM,只需在你的电脑上构建 TVM 编译器堆栈,然后用来交叉编译要部署到目标设备上的模块。

这里只需利用可集成到各种平台的轻量级 runtime API 即可。

例如,可在基于 Linux 的嵌入式系统(如树莓派)上,运行以下命令来构建 runtime API:

git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make runtime

注意:make runtime 仅构建 runtime 库。

也可以交叉编译 runtime 库,但不要和嵌入式设备的交叉编译模型混淆。

若要包含其他 runtime(例如 OpenCL),可以修改 config.cmake 来启用这些选项。获取 TVM runtime 库后,就可以链接编译好的库了。

在这里插入图片描述

TVM 可针对不同架构(例如 x64_64 主机上的 aarch64)交叉编译模型(无论是否被 TVM 优化)。一旦模型被交叉编译,runtime 必须与目标架构兼容,才能运行交叉编译的模型。

为其他架构交叉编译 TVM runtime​

在 上面 的示例中,runtime 库是在树莓派上编译的,与树莓派等目标设备相比,在拥有高性能芯片和充足资源的主机(如笔记本电脑、工作站)上生成 runtime 库的速度要快得多。为了交叉编译 runtime,必须安装目标设备的工具链。安装正确的工具链后,与原生编译相比,主要区别在于向 cmake 传递了一些额外的命令行参数来指定要使用的工具链。例如,在现代笔记本电脑(使用 8 个线程)上为 aarch64 构建 TVM runtime 库需要大约 20 秒,而在树莓派 4 上构建 runtime 需要约 10 分钟。

aarch64 的交叉编译​

sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
cmake .. \-DCMAKE_SYSTEM_NAME=Linux \-DCMAKE_SYSTEM_VERSION=1 \-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc \-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++ \-DCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu \-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \-DMACHINE_NAME=aarch64-linux-gnumake -j$(nproc) runtime

对于 ARM 裸机,用以下工具链(而不是 gcc-aarch64-linux-*)来安装非常方便:

sudo apt-get install gcc-multilib-arm-linux-gnueabihf g++-multilib-arm-linux-gnueabihf

RISC-V 的交叉编译​

sudo apt-get update
sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
······
cmake .. \-DCMAKE_SYSTEM_NAME=Linux \-DCMAKE_SYSTEM_VERSION=1 \-DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc \-DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ \-DCMAKE_FIND_ROOT_PATH=/usr/riscv64-linux-gnu \-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \-DMACHINE_NAME=riscv64-linux-gnumake -j$(nproc) runtime

file 命令可用于查询生成的 runtime 的架构。

file libtvm_runtime.so
libtvm_runtime.so: ELF 64-bit LSB shared object, UCB RISC-V, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=e9ak845b3d7f2c126dab53632aea8e012d89477e, not stripped

针对目标设备优化和调优模型​

在嵌入式设备上对 TVM 内核进行测试、调优和基准测试,最简单且推荐的方法是通过 TVM 的 RPC API。下面是相关教程的链接:

  • 交叉编译和 RPC
  • 在树莓派上部署预训练模型

在目标设备上部署优化模型​

完成调优和基准测试后,要在目标设备上以不依赖 RPC 的方式来部署模型。具体操作参考以下教程:

使用 C++ API 部署 TVM 模块
部署到 Android
将 TVM 集成到项目中
HLS 后端示例
Relay Arm® 计算库集成
Relay TensorRT 集成
Vitis AI 集成
Relay BNNS 集成

其他部署方法​

前面已经有许多针对特定设备的操作指南,其中包含 Python 代码的示例(可用 Jupyter Notebook 查看),这些操作指南描述了如何准备模型,并将其部署到支持的后端。

部署深度学习模型

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

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

相关文章

现代C++中的从头开始深度学习:【5/8】卷积

一、说明 在上一个故事中,我们介绍了机器学习的一些最相关的编码方面,例如 functional 规划、矢量化和线性代数规划。 现在,让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…

【阻止IE强制跳转到Edge浏览器】

由于微软开始限制用户使用Internet Explorer浏览网站,IE浏览器打开一些网页时会自动跳转到新版Edge浏览器,那应该怎么禁止跳转呢? 1、点击电脑左下角的“搜索框”或者按一下windows键。 2、输入“internet”,点击【Internet选项…

springboot工程使用阿里云OSS传输文件

在application.yml文件中引入对应的配置,一个是对应的节点,两个是密钥和账号,还有一个是对应文件的名称; 采用这样方式进行解耦,便于后期修改。 然后需要设置一个properties类,去读对应的配置信息 用到了…

【前端】Vue生命周期函数(详细讲解+中文图解)

目录 一、何为生命周期1、含义2、理解 二、生命周期定义(官网)1、vue22、vue3 三、生命周期图解1、vue2生命周期图解2、vue3生命周期图解 四、Vue的生命周期五、Vue2生命周期和Vue3生命周期的区别六、Vue生命周期的主要阶段以及8个周期函数1、options AP…

使用MyEclipse如何部署Descriptor (XML)编辑器?

Descriptor (XML) Editor编辑器包含了高级的XML编辑功能,在本文中您将了解到这些编辑功能、Web XML编辑等,此功能包含在MyEclipse中可用。 MyEclipse v2023.1.2离线版下载 1. Web XML 编辑器 MyEclipse Web XML编辑器包括高级XML编辑功能,…

OpenLayers入门,OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连接成多边形

专栏目录: OpenLayers入门教程汇总目录 前言 本章再次讲解OpenLayers绘制图形功能,上一章中《OpenLayers图形绘制,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要讲解自由涂鸦手绘绘制线条,圆形和任意形状。 二、依赖和使用 &q…

C#在自动化领域的应用前景与潜力

人机界面(HMI)开发:使用C#开发人机界面软件,实现与自动化设备的交互和监控。C#的图形界面设计能力和丰富的控件库使得开发人员能够创建直观、易用的界面。 数据采集与处理:C#可以与各种传感器、设备进行数据通信和采集…

xml布局不显示的编写代码方法

新建项目在新项目用dp编写布局复制粘贴去掉所有dp在复制dimen/dp_

【数据结构与算法——TypeScript】哈希表

【数据结构与算法——TypeScript】 哈希表(HashTable) 哈希表介绍和特性 哈希表是一种非常重要的数据结构,但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中,我门就一点点来实现一个自己的哈希表。通过实现来理解哈希表背后的原理…

抖音的竞争对手?Meta计划人工智能聊天机器人增加社交媒体数量

在来自抖音的竞争中,Meta着眼于用户参与的下一个前沿。 报道,Meta正在开发一系列具有不同个性的人工智能聊天机器人,此举旨在增加用户在脸书和Instagram等社交平台上的参与度金融时报和边缘。这些聊天机器人被Meta staff称为“personas ”,将…

snowboy+sherpa-onnx+Rasa+Coqui实现语音音箱【语音助手】

背景 本系列主要目标初步完成一款智能音箱的基础功能,包括语音唤醒、语音识别(语音转文字)、处理用户请求(比如查天气等,主要通过rasa自己定义意图实现)、语音合成(文字转语音)功能。 coqui主要在项目中完成接收rasa响应的内容&…

苹果照片删除了如何恢复回来?4种方法教你快速恢复!

相信大家平时都有使用苹果手机来记录生活的习惯吧?但有时候可能会不小心将一些重要的照片误删,或者因为手机内存不足而清理了大量照片,最后才发现照片有用却被你删掉了。那么苹果照片删除了如何恢复回来呢?别着急,接下…