Deep Learning模型優化編譯器 TVM 踩坑記錄,強烈推薦!

2021-01-03 雷鋒網

(前排提醒,本文的人文內容部分稍稍帶有藝術加工,請保持一定的幽默感進行閱讀)

關注我最近想法的同學應該知道我最近都在把玩 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 的調優終端設備的用法


你可以有很多手機平板設備,安裝好 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 <endian.h>


+ #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 成果要好的多。

最後感謝
@ 陳天奇
大神為我們帶來了這麼方便的工具。

好了,今天就到這裡,我繼續修仙煉丹去了~

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 百度開源移動端深度學習框架mobile-deep-learning(MDL)
    2017 年 9 月 25 日,百度在 GitHub 開源了移動端深度學習框架 mobile-deep-learning(MDL)的全部代碼以及腳本,希望這個項目在社區的帶動下能夠更好地發展。寫在前面深度學習技術已經在網際網路的諸多方向產生影響,每天科技新聞中關於深度學習和神經網絡的討論越來越多。
  • 架構模型技巧全都有,大牛LeCun推薦
    圖靈獎得主、AI大牛Yann LeCun也強烈推薦,誇讚其為一份不錯的PyTorch和TensorFlow Jupyter筆記本推薦!這份資源的作者來頭也不小,他是威斯康星大學麥迪遜分校的助理教授Sebastian Raschka,此前還編寫過Python Machine Learning一書。話不多說現在進入乾貨時間,好東西太多篇幅較長,記得先碼後看!
  • 阿里將 TVM 融入 TensorFlow,在 GPU 上實現全面提速
    為了提高推理性能,我們已經進行了一些優化,包括圖級別的 op 融合、循環不變節點外提(loop invariant node motion)。我們觀察到一個特殊問題:batch 矩陣相乘是 Transformer 中的一個關鍵問題,目前它在 cuBLAS 中的實現並未得到很好的優化。
  • 如何利用 TVM 優化深度學習GPU op?教你用幾十行Python代碼實現2-3...
    據雷鋒網AI科技評論了解,大多數現有系統針對窄範圍的伺服器級 GPU 進行優化,且需要在包括手機、IOT 設備及專用加速器上部署大量工作。而 TVM 是一種將深度學習工作負載部署到硬體的端到端 IR(中間表示)堆棧。也就是說,這類解決方案能夠把深度學習模型分發到各種硬體設備上、實現端到端的調優。
  • ​大牛的《深度學習》筆記,Deep Learning速成教程
    五、Deep Learning的基本思想六、淺層學習(Shallow Learning)和深度學習(Deep Learning)七、Deep learning與Neural Network八、Deep learning訓練過程       8.1、傳統神經網絡的訓練方法       8.2、deep learning訓練過程九、Deep Learning的常用模型或者方法       9.1、AutoEncoder
  • 機器學習——深度學習(Deep Learning)之我見
    PCA和很多deep learning算法都屬於無監督學習。  2. 深度學習Deep Learning介紹  Depth 概念:depth: the length of the longest path from an input to an output.
  • 機器學習中踩過的坑,如何讓你變得更專業?
    踩過坑才知道哪些路是不可行的,有時候犯錯誤也能幫助我們變得更加專業。數據科學家 Archy de Berker 在本文中詳述了他和周圍同伴們在機器學習探索中踩過的坑,這也都是大家經常性遇到的問題。他希望通過這一篇文章,帶大家了解機器學習中一些有趣的錯誤——一些只有你深入了這個領域才能接觸到的錯誤。
  • Deep learning 預測藥物-藥物的相互作用
    介紹僅需Drug name和Drug structural information作為輸入,就可以做四類任務:1)預測引起ADEs(adverse drug events)的DDI;2)可選擇的藥物推薦
  • 吳恩達Deeplearning.ai課程學習全體驗:深度學習必備課程(已獲證書)
    吳恩達最近推出的 deeplearning.ai 課程就是這樣的存在。該課程一在 coursera 上發布,我立即註冊並花了四個晚上觀看其中的講座、參加考試、完成編程作業並通過了課程。深度學習從業者和機器學習工程師通常會把大量時間花費在 Keras 與 TensorFlow 這樣的抽象工作中。
  • AI | 機器學習中踩過的坑,如何讓你變得更專業?
    可列印版本附pdf下載連結踩過坑才知道哪些路不可行,有時候犯錯誤也能幫助我們變得更加專業。數據科學家Archy de Berker 在本文中詳述了他和周圍同伴在機器學習探索中踩過的坑,這也都是大家經常性遇到的問題。他希望通過這一篇文章,帶大家了解機器學習中一些有趣的錯誤——一些只有你深入了這個領域才能接觸到的錯誤。
  • CertiK:DeepSEA編譯器1.1版本 正式發布
    繼CertiK主網正式上線後,DeepSEA編譯器進行了兩項重大更新,目前DeepSEA編譯器的1.1版本已正式發布。此次發布中的重大更新內容:1. DeepSEA的WebAssembly後端現已完備支持所有的語言特性。2.
  • 攜程AI應用的推理性能優化
    影響這個關鍵變量的因素非常多,包括硬體配置,工程部署方式,算法和模型複雜度以及深度學習框架等。1.1 推理服務的性能評價指標深度學習推理服務根據應用需求和特徵不同,對性能需求也有所不同。比如計算機視覺和自然語言處理,機器翻譯等服務主要是計算密集型應用,對計算資源需求較高;搜索推薦類的應用的輸入數據特徵維度高,更偏向於I/O密集型。
  • Learning Deep Neural Networks for Hard Natural Language...
    報告題目:Learning Deep Neural Networks for Hard Natural Language Problems報告摘要:Deep learning has revolutionized the way that many tasks are tackled in
  • CertiK DeepSEA編譯器支持螞蟻鏈 加碼可信區塊鏈
    今年九月末,CertiK正式發布DeepSEA 1.0編譯器。此版本的編譯器相較於今年一月發布的pre-alpha版本DeepSEA,有兩個重大更新。目前,DeepSEA 1.0編譯器支持所有在手冊中定義的語言特性。詳細內容請點擊【CertiK正式發布DeepSEA 1.0編譯器】查看。不僅如此,基於螞蟻鏈與CertiK的合作關係。在DeepSEA的新版本中,CertiK加入專屬於螞蟻鏈的關鍵字,從而讓智能合約開發者可以使用和螞蟻鏈兼容的32位元組標識符。
  • Deep Learning模型最近若干年的重要進展
    CV 領域的特定任務出現了各種各樣的模型(Mask-RCNN 等),這裡不一一介紹。2017 年,Hinton 認為反省傳播和傳統神經網絡有缺陷,提出 Capsule Net。但是目前在 CIFAR 等數據集上效果一半,這個思路還需要繼續驗證和發展。Track.2 生成模型傳統的生成模型是要預測聯合概率分布 P(x,y)。
  • Github|吳恩達新書《Machine Learning Yearning》完整中文版開源
    博士筆記 | 周志華《機器學習》手推筆記思維導圖博士筆記 | 周志華《機器學習》手推筆記「模型評估與選擇」博士筆記 | 周志華《機器學習》手推筆記「線性模型」博士筆記 | 周志華《機器學習》手推筆記「決策樹」博士筆記 | 周志華《機器學習》手推筆記「神經網絡」為方便大家學習,轉發私信即可即可獲得書籍pdf下載連結
  • 最強通用編譯器優化工具!MIT打造,準確率是傳統方法5倍
    並且通用,它可以快速學習代碼在任何新的晶片架構的性能速度,無論是機器學習煉丹,還是加密技術上鏈、還是編譯器優化等等,都能hold住。研究人員分享了這樣的一個使用場景:如果你想在一個新的晶片架構上訓練一個模型,比如谷歌的TPU,你只需要從這個架構中收集數據,經過分析器運行後,去訓練Ithemal,你可以得到一個可以預測其性能的模型。」
  • Echarts在Taro微信小程序開發中的踩坑記錄
    本文轉載自【微信公眾號:前端人,ID:FrontendPeople】經微信公眾號授權轉載,如需轉載與原文作者聯繫背景近期筆者在使用Taro進行微信小程序開發,當引入Echarts圖表庫時,微信檢測單包超限2M的一系列優化措施的踩坑記錄,期望能指導讀者少走一些彎路。
  • 近13年來在 deep metric learning 領域的進展實際並不存在?
    Facebook AI 和 Cornell Tech 的研究人員近期發表研究論文預覽文稿,聲稱近十三年 (deep) metric learning 領域的研究進展(ArcFace, SoftTriple, CosFace 等十種算法) 和十三年前的基線方法(Contrastive, Triplet) 比較並無實質提高。真是這樣的嗎?
  • 深度學習之Google Deepmind的Alphago人工智慧算法技術演變歷程
    deep mind在此期間做了很多紮實的研究工作,本文將進行簡單的描述。本文接下去會按如下幾點內容進行敘述:Q-learningReinforcement learningDeep Q-NetworksAlphago二、Q-learning與Reinforcement learning 增強學習Reinforcement learning的場景大部分有一個共同的特點,那就是這些場景有序列決策或者控制的問題,對於當前的任何一個