TVM 从入门到精通

2023-10-27

本文首发自:公众号 HyperAI超神经

内容一览:TVM 共有三种安装方法:从源码安装、使用 Docker 镜像安装和 NNPACK Contrib 安装。本文讲解如何通过 Docker 镜像 和 NNPACK Contrib 安装。

关键词:TVM   Docker   基础教程   

欢迎回到 TVM 文档讲解 101,这个系列将继续 TVM 的日常教学。

上期 Part 1 我们已经介绍了如何通过源码安装 TVM,本期将继续进行学习 TVM 前的准备工作。讲解通过 Docker 镜像和 NNPACK Contrib 安装 TVM。

Part 1 传送门:从源码安装

 TVM 安装之 Docker 镜像安装

开发者可以利用 Docker 工具脚本,建立开发环境。这也有助于运行 TVM Demo 和教程。

需要用到 Docker

如果使用 CUDA 则需要 nvidia-docker

获取 TVM 源码发行版或克隆 GitHub 仓库,以获取辅助脚本:

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

使用以下命令来启动 Docker 镜像:

/path/to/tvm/docker/bash.sh <image-name>

完成本地构建后,这里的 image-name 可以是一个本地的 Docker 镜像名称,例如:tvm.ci_cpu 。

该辅助脚本可实现:

* 挂载当前目录到 /workspace

* 将用户切换为调用 bash.sh 的用户(这样您就可以读/写主机系统)

* 在 Linux 上使用宿主机的网络。由于无法支持主机网络驱动器,请在 macOS 上使用桥接网络并暴露 8888 端口,以使用 Jupyter Notebook。

输入以下内容启动 Jupyter Notebook:

jupyter notebook

如果你在 macOS 上启动 Jupyter Notebook 时看到报错 OSError: [Errno 99] Cannot assign requested address,可通过以下方式改变绑定的 IP 地址:

jupyter notebook --ip=0.0.0.0

注意,在 macOS 上,由于我们使用桥接网络,Jupyter Notebook 将被报告在一个类似于 http://{container_hostname}:8888/?token=... 的 URL 上运行。在浏览器中粘贴时,需把 container_hostname 替换为 localhost

 Docker 源代码 

查看 Docker 源代码: 构建自己的 Docker 镜像

运行以下命令来构建 Docker 镜像:

/path/to/tvm/docker/build.sh <image-name>

你也可以利用非官方的第三方预建镜像,注意:这些镜像是用来测试的,并不是 ASF 的版本。

 TVM 安装之 NNPACK Contrib 安装 

NNPACK 是用于神经网络计算的加速包,可以在 x86-64、ARMv7 或 ARM64 架构的 CPU 上运行。使用 NNPACK,像 MXNet 这样的高级库可以加快多核 CPU 计算机(包括笔记本电脑和移动设备)上的执行速度。

由于 TVM 已经有原生调整的调度,这里的 NNPACK 主要是为了参考和比较。对于常规使用,原生调整的 TVM 实现更佳。

TVM 支持 NNPACK 在卷积、最大池和全连接层中进行前向传播(仅限推理)。在本文档中,我们对如何将 NNPACK 与 TVM 一起使用进行了高级概述。

 条件 

NNPACK 的底层实现使用了多种加速方法,包括 fft 和 winograd。这些算法在某些特殊的批处理大小、内核大小和步幅设置上比其他算法效果更好,因此根据上下文,并非所有卷积、最大池或全连接层都可以由 NNPACK 提供支持。

NNPACK 仅支持 Linux 和 OS X 系统,目前不支持 Windows。

 构建/安装 NNPACK 

如果训练后的模型满足使用 NNPACK 的一些条件,则可以构建支持 NNPACK 的 TVM。

请按照以下简单步骤操作:使用以下命令构建 NNPACK 共享库。TVM 会动态链接 NNPACK。

注意:以下 NNPACK 安装指导已经在 Ubuntu 16.04 上进行了测试。

构建 Ninja 

NNPACK 需要最新版本的 Ninja。所以我们需要从源代码安装 ninja。

git clone git://github.com/ninja-build/ninja.git
cd ninja
./configure.py --bootstrap

设置环境变量 PATH 以告诉 bash 在哪里可以找到 ninja 可执行文件。例如,假设我们在主目录 ~ 上克隆了 ninja。然后我们可以在 ~/.bashrc 中添加以下行。

export PATH="${PATH}:~/ninja"

构建 NNPACK 

CMAKE 新版 NNPACK 单独下载 Peach 等依赖

注意:至少在 OS X 上,运行下面的 ninja install 会覆盖安装在 /usr/local/lib 中的 googletest 库。如果您再次构建 googletest 以替换 nnpack 副本,请务必将 -DBUILD_SHARED_LIBS=ON 传给 cmake。

git clone --recursive https://github.com/Maratyszcza/NNPACK.git
cd NNPACK


# 在 CFLAG 和 CXXFLAG 中添加 PIC 选项以构建 NNPACK 共享库
sed -i "s|gnu99|gnu99 -fPIC|g" CMakeLists.txt
sed -i "s|gnu++11|gnu++11 -fPIC|g" CMakeLists.txt
mkdir build
cd build


# 生成 ninja 构建规则并在配置中添加共享库
cmake -G Ninja -D BUILD_SHARED_LIBS=ON ..
ninja
sudo ninja install


# 在你的 ldconfig 中添加 NNPACK 的 lib 文件夹
echo "/usr/local/lib" > /etc/ld.so.conf.d/nnpack.conf
sudo ldconfig

构建支持 NNPACK 的 TVM

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

* 在 config.cmake 中设置 set(USE_NNPACK ON) 。

* 将 NNPACK_PATH 设置为 $(YOUR_NNPACK_INSTALL_PATH) 配置后使用 make 构建 TVM

make

点击链接查看原始文档,后续超神经将继续更新中文 TVM 教程,请持续关注~

—— 完 ——

更多精彩内容(关注 HyperAI超神经公众号阅读)

7d27ea5937e634457fc2c0667982057c.png

1251821025438251ad10fa47acd04ccd.png

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

TVM 从入门到精通 的相关文章

  • 如何从连接到外部网络的另一个组合访问容器?

    这是带有容器配置的撰写文件 我希望从外部容器连接到该容器 在另一个撰写文件中定义 version 3 5 services service to connect to build networks my external network n
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 在docker容器中运行Jenkins有什么优势

    我发现了很多关于如何运行你的博客Jenkins in Docker但没有人真正解释这样做的好处 这是我发现的唯一原因 使用 Docker 的理由 https twasink net 2016 08 01 setting up a jenki
  • Docker - SequelizeConnectionRefusedError:连接 ECONNREFUSED 127.0.0.1:3306

    我正在尝试使用 Docker 容器启动并运行我的 Nodejs 应用程序 我不知道可能出了什么问题 当我使用控制台调试凭据时 凭据似乎已正确传递 另外启动sequel pro并使用相同的用户名和密码直接连接似乎也可行 当节点在容器中启动时
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • 从多个开发机器管理远程 docker 机器

    可以从另一个工作站管理使用 docker machine 命令从一个开发人员工作站创建的 docker 机器吗 我不是在寻找涉及 docker swarm 的解决方案 而只是寻找涉及 docker machine 的解决方案 据我了解 当
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 如何判断我是否通过脚本登录到私有 Docker 注册表?

    如何判断我是否通过脚本登录到私有 Docker 注册表服务器 换句话说 有docker login some registry com已成功运行 并且仍然有效 注意 我问的是任意私有注册表 而不是docker io注册表 如果 docker
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 如何在 MacBook Pro 上的 Docker 容器内运行 tkinter?

    我正在尝试运行一个使用以下命令的 python GUI 应用程序tkinter我的 MacBook Pro 上的 docker 容器内的模块 所以我安装了XQuartz https www xquartz org 并跟随本教程 https
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 无法初始化 NVML:几个小时后 Docker 中出现未知错误

    我遇到有趣而奇怪的问题 当我使用 GPU 启动 docker 容器时 它工作正常 并且我看到 docker 中的所有 GPU 然而 几个小时或几天后 我无法在docker中使用GPU 当我做nvidia smi在泊坞窗机器中 我看到这条消息
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at

随机推荐

  • el-date-picker获取焦点方法

    小编为了实现日期控件在显示时候字段获得焦点的操作 研究了好一会儿 对比了其他的组件 最后终于实现了结果 和大家分享一下
  • 网页在线画图工具----方便简洁

    https www processon com diagrams
  • 面向对象的Qt编程

    0 面向对象的Qt编程 完全不适用任何面向对象技术 而只是利用Qt所提供的类创建对象 并调用对象的接口以满足用户的需求是可能的 但这样构建的应用程序其功能必然是十分有限的 首先 Qt类保护成员中的诸多实现无法在类的外部被复用 Qt试图通过多
  • OJDBC连接串配置

    格式一 使用ServiceName方式 jdbc oracle thin
  • vue下载Java返回的二进制文件流及文件名需要从headers[‘content-disposition‘]中获取

    如图 在request js响应拦截器中 获取到content disposition 并赋值给在上面声明过的filename 注意 如果获取不到headers content disposition 的话 需要后端对该接口配置一下Head
  • windows powershell快捷键

    复制ctrl c 鼠标右键 粘贴ctrl v 鼠标右键 删除整行命令esc 删除光标前一个单词ctrl backsapce 删除光标后一个单词ctrl delete 删除光标前一个字符backsapce 删除光标后一个字符delete 删除
  • c++,编写程序给出一个百分制的成绩,要求输出成绩等级‘A‘,‘B‘,‘C‘,‘D‘,‘E‘。

    分析 这个题目很简单 就是对你输入的成绩进行一个判定 如果是大于等于九十就运行输出 A 这个程序 以此类推 方法一 使用if语句 对了按照规范写法的话应该要有else 但再不会影响程序运行的请款下 本博主是不喜欢加上else的 includ
  • Spring Boot——MyBatis配置带下划线命名的字段自动转换驼峰命名解决方案

    问题描述 MyBatis无法查询出属性名和数据库字段名不完全相同的数据 即 属性名和数据库字段名分别为驼峰命名和下划线命名时查出的数据为NULL 问题分析 MyBatis默认是属性名和数据库字段名一一对应的 即 数据库表列 user nam
  • zepto(js库) align-items: center与 justify-content: center

    与jq用法大致相同 插件 fix js selector js touch js display flex align items center 弹性盒子flex 元素位于容器的中心 设置弹性盒子元素在垂直方向上 纵轴 的对齐方式 just
  • JavaScript 数组手册 – 通过示例和备忘单了解 JS 数组方法如何工作

    在编程中 数组是包含元素集合的数据结构 数组非常有用 因为您可以在单个数组中存储 访问和操作多个元素 在本手册中 您将学习如何在 JavaScript 中使用数组 我们将介绍创建数组时需要遵循的特定规则 以及如何使用数组方法根据需要操作和转
  • php递归实现无限级分类树(牛逼)

    转载路径 http www php cn php weizijiaocheng 353267 html 无限级树状图可以说是无限级栏目的一个显著特征 我们接下来就来看看两种不同的写法 一 数据库设计 1 2 3 4 5 6 7 8 9 10
  • C++ 哈希桶模拟实现(补充)

    目录 定义基本的存储结构 Insert 和Find Erase 如何控制哈希冲突 Insert 中添加扩容操作 其他问题的解决 UnorderedMap h和UnorderedSet h 迭代器实现与UnorderedMap h和Unord
  • 软件架构的5种视图

    方法如路标 软件架构的5中视图包括 逻辑架构 开发架构 运行架构 物理架构 数据架构 逻辑架构 关注功能 不仅包括用户可见的功能 也包括一些基础模块以及辅助模块 开发架构 关注程序包 不仅包括要编写的程序 还包括可以直接使用的第三方SDK或
  • 模块xxx.ocx已加载,但对DIIRegisterServer的调用失败解决方案

    问题 MFC项目时 装完TeeChart5 ocx后 注册时出现 模块TeeChart5 ocx已加载 但对DIIRegisterServer的调用失败 问题 第一步 在搜索框中输入 cmd 第二步 选择 以管理员身份运行 第三步 进入需要
  • 实现AI运算本地化的另一种可能:CoCoPIE的探索与抉择

    转载来自博客作者 51CTO 的原创作品 创始团队中有三位分别来自美国东北大学 北卡罗来纳州立大学及威廉玛丽学院的本领域知名教授 它聚焦于端侧AI的实现 致力于在不额外增加人工智能专用硬件的情况下 让现有处理器能实时地处理人工智能应用 它就
  • form表单的普通文本和文件上传

    一 文件的上传和下载原理 1 文件上传的原理分析 1 1文件上传的必要前提 a 提供form表单 method必须是post b form表单的enctype必须是multipart form data c 提供input type fil
  • python批量写入数据库_python实现数据库批量数据插入.

    需求 1 需要往数据库插入批量数据 且数据需要随机 带有日期格式的数据 2 查看目的接收表 存在唯一key 字段2是日期格式 其他数据可以一样 首先需要写一个链接数据库的函数 import MySQLdb class MySql def i
  • 关于torch.Tensor.item()函数

    torch Tensor item 函数 其实就是把张量转换为python标准数字返回 仅适用只有一个元素的张量 pytorch官方文档写的很清楚 请看 Tensor item number Returns the value of thi
  • 开开心心带你学习MySQL数据库之第六篇上

    只要路是对的 就不害怕遥远 窗台是风景 笔下有前途 低头是题海 抬头是未来 如果没有躺赢的命 那就要站起来奔跑 not null gt 要求元素非空 unique gt 要求元素唯一 default gt 指定默认值 primary gt
  • TVM 从入门到精通

    本文首发自 公众号 HyperAI超神经 内容一览 TVM 共有三种安装方法 从源码安装 使用 Docker 镜像安装和 NNPACK Contrib 安装 本文讲解如何通过 Docker 镜像 和 NNPACK Contrib 安装 关键