TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

2023-11-04

本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载。

(前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读)

关注我最近想法的同学应该知道我最近都在把玩 TVM,今天终于使用 TVM 得到了非常满意的结果,而专栏也很长时间没更新了,于是来安利 (水) 一篇。

本来可能用不到 TVM,项目其实进展的很顺利,我们初始的 tensorflow 模型在 android 端得到了满意的 latency,我也可以照常一边修炼我的仙, 继续和有奶大定律, 自由单子, Kan-Extension 等邪魔外道搏斗... 一边稳稳的推进项目进度。

无奈 scientist 一意孤行要上 Pytorch, 于是我们换了一个 Pytorch 模型...

先不说同样的 SSD 魔改模型,Pytorch 在 android 端比 tensorflow 整整慢了 5 倍,光是把 Pytorch 模型移植到 Android 上都让开发团队整整褪层皮 (Pytorch 对 Android 的支持简直为 0,tensorflow 的工程支持相对 pytorch 简直无敌)。而这时候已经花了好多时间,项目眼看要 delay....

头都炸了的我在打算手撸 OpenCL 调优之前,去问了下我们组的 CV 大神该怎么办,大神微微一笑,转身随风而去,只听云端传来 3 个字:「T~V~M~~~~~"

于是我就开始 TVM 的研究 (踩坑) 之路, 到今天为止终于把所有的路都踩平了之后,成功把我们的 Pytorch 模型用 Auto-TVM 调优成功且部署在了我们的 android 系统上,性能整整提高了 8 倍,比我们之前的 tensorflow 模型还要快。更重要的是,通过 TVM,我们的调优完全不 couple 与硬件和模型 Framework,就算以后换模型,换终端,或者哪天 scientist 想不开要换回 tensorflow 或是使用 MXNet 都无所谓,用 auto-TVM 自动调调就行了(只可惜了我的 Cuda C 编程调优都白学了)。

简单介绍下 Auto-TVM 的调优终端设备的用法

TB18VGGL9zqK1RjSZFjXXblCFXa.jpg

你可以有很多手机平板设备,安装好 TVM RPC 这个 App 之后,可以在 App 里输入 Tracker 的 IP 和端口,进行设备注册 (另外输入一个设备 ID 来让 Auto-TVM tuning 程序找到)。

Tracker 是一个 Python 的程序,git clone TVM 之后,按教程编译好,就可以按这个教程启动 Tracker。

Auto-TVM tuning 程序也是一个 python 程序,它会连接 Tracker(也可以和 Tracker 是一台机器) 找到相应的设备 ID 的 IP,然后和设备直接用 RPC 通信,Auto-TVM 程序会根据程序预设的 target(比如是不是 arm cpu,要不要用 OpenCL...) 来把你想要优化的 Deep Learning 模型直接编译为设备的 machine code, 通过 TVM RPC 把 code 部署在终端,终端的 TVM RPC App 会测试这个模型的 inference performance,然后回报给 Auto-TVM tuning 程序,然后 Auto-TVM tuning 程序会根据反馈,重新计算该如何优化编译,重新生成新的模型的 machine code 再次部署... 如此循环... 直到达到预设的实验次数 (比如 2000), 或太多次实验都没有提高提前结束 (比如第一次就找到了最优优化结果)。最后 TVM 会根据调优时得到的最佳「编译参数」来最终编译你的 deep learning 模型为终端模型的 machine code,最终完成优化编译过程。

以上只是简单介绍,具体请看 TVM 的论文,和去 TVM 官网看 tutorial,写得非常详细切提供了很多很好理解的范例代码。我的最终的 tuning 程序,就是魔改其中一个范例程序而来。

TVM 踩坑记录

TVM 目前还只是 0.6 版本,很多东西还不稳定,由于开发环境各异,有时候需要工程师自己解决一些开发团队在开发时没有碰到的问题,但是这些问题相对与 TVM 提供的巨大优势相比,都是小问题啦(工程能力越强,魔改力越强,你就可以越早体验新技术带来的好处呀。)。(我遇到的最坑的问题其实是公司网络各种 IP 禁止访问,封端口,使得 android 机和开发服务器一直连不上, 最终还是在自己的电脑上装了虚拟机,自建了一个小 LAN 才解决的这个问题)

1.编译 tvm4j-core 出错: cannot find symbol [ERROR] symbol: class SharedSecrets

JDK11 会遇到这个问题,因为 JDK11 已经把 sun.misc.SharedSecrets 换到别的地方了,建议不要尝试修改 TVM 源代码来 fix 这个问题,因为你会遇到其他更多问题,请下载 JDK8,把 JAVA_HOME 设为 JDK8 的,一切就会很顺利

2.Android TVM RPC 编译出错: #error "Unable to determine endianness of your machine; use CMake to compile"

Android RPC server fails to build

按上边 link 里的修改 endian.h 文件即可,参见我下边的修改

diff --git a/include/dmlc/endian.h b/include/dmlc/endian.h

index 5bf53fb..9422fce 100644

--- a/include/dmlc/endian.h

+++ b/include/dmlc/endian.h

@@ -23,7 +23,9 @@

 #elif defined(__EMSCRIPTEN__)

 

#define DMLC_LITTLE_ENDIAN 1

 

#else

- #error "Unable to determine endianness of your machine; use CMake to compile"

+ #include

+ #define DMLC_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN)

+ /*!#error "Unable to determine endianness of your machine; use CMake to compile" */

 

#endif

 

#endif

3.Auto-TVM 运行时出错"Do not know how to handle return type code 113"

Auto-TVM failed on Android Device, with error msg of "Do not know how to handle return type code 113"

可以根据我上边在 TVM Discussion 里的自问自答来解决。

4.找不到 TVM_NDK_CC

[SOLVED] Android_rpc_test.py failed

按照 dayanandasiet 的回复设定 TVM_NDK_CC 即可

Follow the below steps to generate toolchian and try to generate application with below export

comand

Tool chain generate with below instruction

 ./make-standalone-toolchain.sh --platform=android-24 --use-llvm --arch=arm64

--install-dir=/home/user/software/android-toolchain-arm64/

 

Download Java and SDK, set proper path

export TVM_NDK_CC=/home/user/software/android-toolchain-arm64/bin/aarch64-

linux-android-g++

 

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

 

export ANDROID_HOME=/home/user/software/android-sdk-linux

 

build mxnet model with nnvm with below config/parameter and use same library,

param and graph on your android application

 

target =‘llvm -target=arm64-linux-android’

 

target_host = None

 

reference mobile_darknet_save.py 2

Compile application android deploy 1 using this config.mk 2 configuration for CPU flavor

5.LLVM only Large Small are allowd on AArch64

https://github.com/dmlc/tvm/issues/2005 可解。

6.Auto-TVM 自动优化时出错:Cannot find config for target=cuda

 这个不是什么大问题,某 operator 不能调,对我来说其他的可以调就行了。。。。

7.Auto-TVM 自动优化 OpenCL 时出错: No OpenCL platform matched given existing options

No OpenCL platform matched given existing options

也是自己问最终自己解决的,很反直觉,编译 TVM 的时候,选择 OpenCL=OFF,就没有这个问题,选择 OpenCL=ON,为终端 Cross Compile OpenCL 就不 work 了... 应该是 bug.

8.Auto-TVM 自动优化 OpenCL 时出错: CL_INVALID_WORK_GROUP_SIZE

CL_INVALID_WORK_GROUP_SIZE error after auto-tuning for OpenCL on Android Device

应该是我 trial number 设的太小了,以至于 TVM 找不到一个 valid 的 kernel,顺着这个问题,发现了 CL_INVALID_WORK_GROUP_SIZE 的一个 undocumented 的错误源,即 OpenCL kernel 使用过多的 register file 也会造成 CL_INVALID_WORK_GROUP_SIZE 错误,这一点在查 OpenCL 文档的时候是查不到的, 有点 tricky。

9.Auto-TVM 自动优化时 Android TVM RPC Crush,一切白调。。。

目前 TVM 还不支持 checkpoint,不过我们可以很简单的魔改 measure_methods.py 这个文件,把 190 行 set_task(): 这个函数里的 check remote 失败直接 raise RuntimeError 退出程序,改成循环多次 check 即可,这样使得 Auto-TVM 一方持续等待 Android 程序上线,比一点网络问题,或者终端问题,就废掉之前 n 多个小时的 auto-tuning 成果要好的多。

最后感谢

@ 陈天奇

大神为我们带来了这么方便的工具。

好了,今天就到这里,我继续修仙炼丹去了~

TB1oPiyL3DqK1RjSZSyXXaxEVXa.gif

雷锋网版权文章,未经授权禁止转载。详情见转载须知。

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

TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录) 的相关文章

随机推荐

  • 【mac 安全渗透测试】之SQL注入Demo

    一 关于sqlmap的介绍 1 SQLmap工具简介 SQLmap是一款开源的SQL注入漏洞检测 利用工具 可以检测动态页面中get post参数 cookie http头 它由Python语言开发而成 运行需要安装python环境 在ka
  • arm64架构的linux中断分析(零)

    文章目录 1 中断的概念和作用 2 Linux中断处理机制 2 1 中断请求 2 2 中断处理 2 3 中断完成 2 4 中断触发和处理步骤详解 2 4 1 异常向量表的解读 3 GICv3中断控制器 3 1 GICv3中断控制器设备树 3
  • 触摸屏tslib库交叉编译并移植ARM校准测试

    本文介绍 触摸屏tslib库交叉编译并移植ARM 校准及测试 下载tslib Tags libts tslib GitHub 在tslib的官方github上选择一个版本下载即可 本实验版本为 tslib 1 12 tar gz 1 配置
  • Chisel教程——04.Chisel中的控制流

    控制流 动机 本系列到目前为止 Chisel中的软硬件之间都有很强的对应关系 但引入控制流之后就不一样了 对软硬件的看法就应该有很大的分歧了 本节会在生成器软件和硬件中都引入控制流 如果重新连接到一个Chisel连线会怎么样呢 如何让一个多
  • normalize.css公共样式(vue)

    目录 一 npm安装 二 main ts或者main js引入 三 代码 1 main ts 2 main js 一 npm安装 npm i normalize css 二 main ts或者main js引入 import normali
  • Java在配置环境变量中的 . 是什么意思

    在CLASSPATH中 点号 表示当前目录 举例 CLASSPATH D JAVA LIB C DOC JavaT 这个路径就是包含多个可供选择的查询路径 它们之间用分号 分隔开 更具体的内容可以查阅 Java编程思想 第四版 P112 P
  • 【满分】【华为OD机试真题2023 JS】异常的打卡记录

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 异常的打卡记录 知识点数组字符串哈希表循环 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据 也是计算职工工资的
  • 树的遍历(一题直接理解中序、后序、层序遍历,以及树的存储)

    题目如下 一个二叉树 树中每个节点的权值互不相同 现在给出它的后序遍历和中序遍历 请你输出它的层序遍历 输入格式 第一行包含整数 N 表示二叉树的节点数 第二行包含 N 个整数 表示二叉树的后序遍历 第三行包含 N 个整数 表示二叉树的中序
  • idea 编译突然报, java: 需要‘;‘

    这个和文件没关系 就是编码编译的时候不对了 需要idea设置下就完美解决了
  • mingw编译出C++正则表达式失效

    代码 include
  • GC 垃圾回收机制

    这里写自定义目录标题 描述一下 GC 的原理和回收策略 Java 中有四种引用类型 GC 如何判断对象的存活 引用计数算法 可达性分析 新生代 新时代又分3个部分 8 1 1 老年代 回收算法 标记 清除 标记 整理 复制 堆内存分配策略
  • 两个ESP8266相互通信

    ESP8266共有3种模式 STA AP STA AP STA ESP8266设备作客户端 AP ESP8266设备作服务器 STA AP 混合模式 服务器端ESP8266配置流程 1 配置AP模式 查询指令 AT CWMODE 功能 查询
  • java模块设计与实现_Java两个通用安全模块的设计与实现(SQL)

    3 系统方案设计 3 1 功能模块流程图 为了方便系统方案的设计与功能的开发 在方案设计前 根据前面的需求分析 将系统的功能划分为口令部分功能模块和文件安全传输部分功能模块 这两个模块又各自细分为各个小模块 各小模块的功能流程图如下 一 口
  • Nightingale滴滴夜莺监控系统入门(四)--聊聊夜莺的后端储存

    Nightingale滴滴夜莺监控系统入门 四 聊聊夜莺的后端储存 1 默认版本 默认是使用夜莺的两个组件来实现 TSDB INDEX TSDB实际上使用的是老牌的图形数据库rrdtool 记录ts和value 有很多老牌的监控使用比如Ca
  • STM32的捕获

    基础配置 void TIM2 Capture Init u16 arr u16 psc GPIO InitTypeDef GPIO InitStructure TIM TimeBaseInitTypeDef TIM TimeBaseStru
  • 创建&删除Anaconda虚拟环境

    一 创建Anaconda虚拟环境 参考博主之前的blog https blog csdn net m0 51339444 article details 123715285 二 删除Anaconda虚拟环境 删除Anaconda虚拟环境不建
  • 解决Mybatis报错并分析原因:Invalid bound statement (not found): com.xxx.mapper.xxx

    前言 今天同事在Mapper xml自定义写了一个SQL 但是调用mapper的时候缺报错 我大概还原下场景 org apache ibatis binding BindingException Invalid bound statemen
  • windows跨服务器复制文件夹,windows server 2012 DFS 复制服务已停止已复制文件夹DATA上的复制。...

    我账户发不了图片 事件id 14554 系统日志 DFS 命名空间服务已成功初始化承载命名空间根目录的共享文件夹 共享文件夹为 SHOW 事件Id 7036 系统日志 WinHTTP Web Proxy Auto Discovery Ser
  • springboot之整合jackson

    springboot默认配置json转换工具就是jackson 本文介绍自定义各种配置的方法 废话不多说 直接上代码 配置文件 jackson 日期格式化 spring jackson date format yyyy MM dd HH m
  • TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯 原载于知乎 雷锋网 公众号 雷锋网 获得授权转载 前排提醒 本文的人文内容部分稍稍带有艺术加工 请保持一定的幽默感进行阅读 关注我最近想法的同学应该知道我最近都在把玩 TVM 今天终于使用 TVM 得到了非常满意的结果