旷视MegEngine核心技术升级
曠視MegEngine核心技術(shù)升級
7 月 11 日,曠視研究院在 2020 WAIC · 開發(fā)者日「深度學(xué)習(xí)框架與技術(shù)生態(tài)論壇」上圍繞 6 月底發(fā)布的天元深度學(xué)習(xí)框架(MegEngine)Beta 版本核心技術(shù)升級與開源生態(tài)建設(shè)進行了首次深度解讀。
7 月 11 日,曠視研究院在 2020 WAIC · 開發(fā)者日「深度學(xué)習(xí)框架與技術(shù)生態(tài)論壇」上圍繞 6 月底發(fā)布的天元深度學(xué)習(xí)框架(MegEngine)Beta 版本核心技術(shù)升級與開源生態(tài)建設(shè)進行了首次深度解讀。
作為一款訓(xùn)練推理一體化、動靜合一、兼容并包、靈活高效的新型深度學(xué)習(xí)框架,天元能夠幫助企業(yè)與開發(fā)者的產(chǎn)品從實驗室原型到工業(yè)部署平均節(jié)省 90% 的流程,真正實現(xiàn)小時級的轉(zhuǎn)化能力。
曠視開源天元(MegEngine)這個在內(nèi)部全員使用、工程實踐超過 6 年的深度學(xué)習(xí)框架,為的是能夠?qū)⒆约旱慕?jīng)驗與成果同業(yè)界分享。通過開源社區(qū)的力量,幫助更多開發(fā)者把自己的精力集中在算法的研發(fā)和業(yè)務(wù)場景中,從煩瑣的流程,煩瑣的性能優(yōu)化和模型復(fù)現(xiàn)中解放出來,真正實現(xiàn) 「深度學(xué)習(xí)開發(fā),從未如此簡單」。
據(jù)曠視研究院AI系統(tǒng)高級技術(shù)總監(jiān)許欣然介紹,從 3 月份開源到 6 月底 Beta 版發(fā)布,天元共經(jīng)歷了 5 個版本的迭代,得到了曠視內(nèi)部與外部開發(fā)者們的寶貴建議與支持。天元 Beta 版核心技術(shù)升級包括三大特性:
- 完善量化訓(xùn)練和量化推理功能。
天元Beta版本提供了靈活的量化訓(xùn)練和高效的量化推理的能力,讓開發(fā)者可以快速的完成高精度的量化訓(xùn)練并直接部署到推理側(cè),以最小的精度代價獲得最高的推理性能。 - 添加對ARM CPU的支持。
天元添加了對ARM CPU的支持,在ARM、CUDA、X86三個主流計算平臺上都提供了經(jīng)過深度優(yōu)化的 kernel 實現(xiàn),結(jié)合天元優(yōu)異的計算圖優(yōu)化技術(shù),在量化、浮點模型上均提供了業(yè)界領(lǐng)先的計算性能和內(nèi)存顯存占用。 - 優(yōu)化推理功能。
天元對推理功能做了一系列的功能優(yōu)化,提供 Profile工具、上手指南、性能優(yōu)化教程等內(nèi)容,幫助開發(fā)者快速上手,獲得更高的推理性能,讓開發(fā)者在推理的時候可以使用更方便,開發(fā)更高效。
另外,天元 Beta 版新增 10 余個 SOTA 模型,并正式提供中文版 API 文檔,還新增了 Objects 365 Dataset 的 API 和多機訓(xùn)練參數(shù)打包等功能。
除了功能和性能上的改進之外,天元框架還與小米 MACE、OPEN AI LAB(開放智能) Tengine 等推理框架進行了深度集成。
天元的 Github 項目 MegEngine:
https://github.com/MegEngine/MegEngine
并參與貢獻者計劃:
https://github.com/MegEngine/Resource/blob/master/Contributor_Program.md
以下是具體技術(shù)細節(jié)與性能對比。
模型量化——訓(xùn)練與推理
背景:
在當(dāng)前,提高神經(jīng)網(wǎng)絡(luò)推理性能的主流方法是在 GPU 和各類嵌入式設(shè)備上,對深度學(xué)習(xí)模型的推理過程進行量化,即使用 int8 乃至更低精度進行推理。然而該方案的問題在于,若使用量化后的模型進行推理則可能會面臨因量化帶來的精度損失。另外,由于模型量化領(lǐng)域發(fā)展迅速,投入大規(guī)模使用僅兩三年,大量開發(fā)者當(dāng)前所使用的量化工具性能參差不齊,模型量化后精度損失較多;又加上種種量化細節(jié)不對齊,使得模型轉(zhuǎn)換的步驟進一步加劇了精度上的問題。在這樣的條件下,開發(fā)者不得不通過更大的量化模型來達成業(yè)務(wù)目標(biāo),使得量化帶來的性能提升被抵消,難以充分發(fā)揮出設(shè)備的全部計算性能。
解決方案: 基于天元訓(xùn)練推理一體化架構(gòu),同時站在訓(xùn)練和推理的全局視角上優(yōu)化模型量化的體驗和效果,讓開發(fā)者可以在保持模型精度的同時,獲得更大的性能提升。
天元希望開發(fā)者能夠用上經(jīng)曠視內(nèi)部長期工業(yè)驗證的量化訓(xùn)練功能,并能夠根據(jù)模型情況靈活配置不同量化模式,最大限度降低量化所帶來的精度損失;另外,天元提供高效的原生 int8 推理能力。用戶可以一站式完成量化訓(xùn)練加推理過程,免除框架間的轉(zhuǎn)換,保持模型精度。
由此,開發(fā)者便可以在保持模型精度的同時,獲得更大的性能提升。
量化訓(xùn)練方式的選擇
背景: 關(guān)于神經(jīng)網(wǎng)絡(luò)模型量化,最關(guān)鍵問題是如何選取量化表示時的縮放系數(shù)(也被稱之為 scale)。針對這一點有兩種方案:后量化統(tǒng)計方法(Post Quantization)、量化感知訓(xùn)練(Quantization Aware Training)。
所謂后量化統(tǒng)計方法,即在模型正常訓(xùn)練結(jié)束后進行數(shù)值統(tǒng)計并量化。這種方法因流程簡單而在當(dāng)前應(yīng)用廣泛。其缺點在于,當(dāng)模型較小的時候則精度偏低;同時該方法由于訓(xùn)練階段與量化步驟分離,導(dǎo)致訓(xùn)練與推理階段精度不一致,只有在完整訓(xùn)練之后才能知曉量化的具體精度下降程度。量化感知訓(xùn)練則指的是在訓(xùn)練階段就模擬量化推理過程,讓模型對量化過程進行適配。此方法能讓模型保持更高精度,且在訓(xùn)練階段就能掌握推理的精度,其缺點在于流程較為復(fù)雜。
解決方案: 基于曠視內(nèi)部學(xué)術(shù)研究與工程實踐積累的大量經(jīng)驗,天元實現(xiàn)了方便快捷量化感知訓(xùn)練功能,讓開發(fā)者可以只增加少量流程,就能利用量化感知訓(xùn)練的能力。這使得曠視的研究人員與工程師在給定算力下,能夠獲得更高的推理精度,進而充分發(fā)揮算法優(yōu)勢。另外,在訓(xùn)練階段即可知曉最終推理精度,加快了模型迭代速度,讓模型的開發(fā)過程更為高效、可控。
量化接口使用流程。 具體而言,整個量化接口的使用分為五步。如上圖,在正常模型訓(xùn)練的搭建網(wǎng)絡(luò)、訓(xùn)練網(wǎng)絡(luò)、生成序列化模型三步上,額外增加了量化參數(shù)配置、量化感知訓(xùn)練兩個步驟。
一般來說,在默認的量化配置下,開發(fā)者就可以獲得比較優(yōu)良的精度,這對應(yīng)于上圖右側(cè)黃色高亮的三條語句,操作簡單、方便。
量化接口設(shè)計。 量化接口的具體設(shè)計,分為浮點模塊、偽量化(FQ) 模塊和量化模塊。三者分別執(zhí)行浮點、模擬量化和真實量化工作。
具體而言,開發(fā)者首先在普通模塊上進行正常的模型訓(xùn)練工作;然后,可以轉(zhuǎn)換至偽量化(FQ) 模塊,通過配置不同的 Observer 來配置不同的量化參數(shù) scale 獲取方式,從而進行不同的量化感知訓(xùn)練或進行后量化統(tǒng)計。
在完成量化參數(shù) scale 的統(tǒng)計后,開發(fā)者便可以再轉(zhuǎn)換至量化模塊,直接進行推理或者序列化存儲生成模型。天元的這套量化接口設(shè)計借鑒了 PyTorch 的方案,并在其基礎(chǔ)上進行了一系列改進和優(yōu)化,方便擴展。
訓(xùn)練:靈活多樣的量化配置
天元 Beta 版提供的量化接口讓開發(fā)者能夠使用不同的 Scale 獲取方法,多種基于統(tǒng)計或基于學(xué)習(xí)的方式,以及靈活配置量化策略、位寬。此外,由于量化方法在整體上仍處于發(fā)展當(dāng)中,因此天元量化接口的設(shè)計宗旨是便于擴展。通過支持用戶自行注冊量化實現(xiàn),便于兼容各類特殊硬件和新的量化方法。
訓(xùn)練:量化參考模型與操作文檔
值得一提的是,天元 Beta 版除了提供量化功能外,還在模型倉庫中提供了完整的模型復(fù)現(xiàn)。如上圖所示,三個模型在全 int8 量化下準(zhǔn)確率僅下降約 1%。此外,Beta 版本還提供了詳盡的量化操作文檔,幫助開發(fā)者們快速上手。
推理:多平臺直接部署
模型量化的推理方面,在天元 Beta 版中,量化模型的推理方法與浮點模型完全一致,開發(fā)者僅需直接讀取序列化模型執(zhí)行,在各個平臺上都可以直接載入并進行高效推理。
在訓(xùn)練階段,開發(fā)者可以非常靈活地控制網(wǎng)絡(luò)量化模塊,混合使用各種量化策略;在推理部署階段,系統(tǒng)會使用與訓(xùn)練相同的設(shè)置,無需額外配置,便能保證一致。
各個框架對 int8 量化的定義在細節(jié)上有諸多不同,對天元來說,訓(xùn)練后直接可用于推理,一份模型,全平臺可推理,開發(fā)者不用對每個平臺都學(xué)習(xí)不同的部署流程。這免除了模型轉(zhuǎn)換可能帶來的各類誤差問題,也不用擔(dān)心轉(zhuǎn)換時算子不支持,轉(zhuǎn)換后精度不對齊等問題。
推理:高效原生 int8 實現(xiàn)
作為框架的設(shè)計者同樣也是使用者,天元團隊深知對于開發(fā)人員而言,性能往往是在推理階段最關(guān)注的指標(biāo),為了性能,即便麻煩也需要將模型轉(zhuǎn)換到更快的推理框架上。
為此,天元在各主流計算平臺上提供的高效 int8 實現(xiàn),讓開發(fā)者不再需要面對上述痛苦,保證開發(fā)者用天元框架訓(xùn)練后能夠直接進行推理部署。
上圖展示了 ARM 上的推理性能對比。可以發(fā)現(xiàn),通過轉(zhuǎn)換至 int8,天元使得常用網(wǎng)絡(luò)獲得了至多 3 倍的提速。此外,針對手機上常用的小模型,天元提供了更好的優(yōu)化效果,加速效果更加明顯。
此外,天元在 CUDA 和 x86 上也提供相對于 float32 顯著的提速效果。與 Arm 類似,int8 推理的耗時僅有 float 模型的 30%~50%。在 CUDA 上,天元可以充分發(fā)揮出 Tensor Core 的計算能力,榨干顯卡的計算能力;而在 X86 上,由于 X86 指令集的原因,天元可以在支持 AVX512-VNNI 指令集的最新一代處理器上得到比較明顯的 int8 提速。綜上,原生的 int8 高效推理性能,可以讓開發(fā)者方便地進行模型推理部署,同時充分發(fā)揮出硬件的計算能力。
推理功能優(yōu)化
業(yè)界領(lǐng)先的原生 ARM 推理性能
除優(yōu)秀的模型量化功能外,天元 Beta 版本還提供性能領(lǐng)先的 ARM 算子實現(xiàn)。天元引入 NCHW44 layout,通過將張量的內(nèi)存排布進行調(diào)整,進一步優(yōu)化訪存,并降低各種邊界情況的判斷,提升計算性能;同時軟硬件結(jié)合,在支持的設(shè)備上,使用最新的 ARM dotprod 指令,編寫高質(zhì)量的各類卷積算法實現(xiàn),最終獲得了業(yè)界領(lǐng)先的推理性能。
在 int8 推理時,天元依靠深度優(yōu)化 im2col、winograd 和 direct conv 等算子,在各類網(wǎng)絡(luò)上都達到了業(yè)界領(lǐng)先的性能指標(biāo)。上圖分別展示的是不啟用 dot 指令和啟用 dot 指令的性能對比,可以發(fā)現(xiàn),天元均提供了優(yōu)異的性能表現(xiàn)。
另外,借助 ARM 的 dot 指令,天元 ARM 上的 int8 推理在 ResNet 上從 64ms 降低到了 30ms 以內(nèi),在一系列常用網(wǎng)絡(luò)上都可以獲得兩倍以上的大幅度加速。因此如果手上有支持 dotprod 指令的設(shè)備,開發(fā)人員可以在天元的支持下獲得巨大的性能提升。值得一提的是,在一些不支持 dot 指令的設(shè)備上,通過使用 winograd 可以降低乘法指令個數(shù),從而在 ResNet、VGG 這類網(wǎng)絡(luò)上獲得比較顯著的加速。為了追求加速比,業(yè)界常見的做法是對 weight 進行限制,將表示精度限制在 6bit 內(nèi),從而避免累加結(jié)果溢出。
然而這存在的問題在于,需要在模型訓(xùn)練時就進行特殊處理,導(dǎo)致一個模型難以在全平臺部署;同時,這也降低了量化網(wǎng)絡(luò)的推理精度,限制了使用場景。天元作為一個訓(xùn)推一體的框架,追求訓(xùn)練與推理側(cè)功能的精確對齊,針對上述問題,創(chuàng)新性的使用 float 作為中間計算格式,實現(xiàn)了 winograd 算法。這種方法的優(yōu)點在于,對 weight 沒有特殊要求,能夠與訓(xùn)練時的設(shè)置精確對齊,確保精度沒有損失;同時,這種算法還更充分地利用計算單元,提高計算性能,確保開發(fā)者可以隨時啟用獲得性能提速,無需擔(dān)憂精度問題。
除了 int8 推理之外,考慮到仍有大量開發(fā)者在使用 float 模型進行推理工作。為了讓這些開發(fā)者也可以得到最優(yōu)的性能,天元在 float 算子上也進行了大量優(yōu)化,使得各類常見的模型獲得了業(yè)界領(lǐng)先的性能,開發(fā)者可以在不改動原有工作流程的情況下,獲得性能上的提升。
ARM int8 內(nèi)存占用
在深度學(xué)習(xí)的應(yīng)用中,運行時內(nèi)存占用也是一個重要的指標(biāo)。天元對訓(xùn)練側(cè)的自動內(nèi)存優(yōu)化策略進行了充分打磨,實現(xiàn)了內(nèi)存占用和推理性能之間的良好平衡。上圖展示了天元在內(nèi)存占用上的優(yōu)勢。
天元僅依靠通用優(yōu)化策略,便實現(xiàn)了對任意模型結(jié)構(gòu)優(yōu)良的優(yōu)化表現(xiàn),使得框架無需針對網(wǎng)絡(luò)結(jié)構(gòu)進行特殊優(yōu)化。各領(lǐng)域開發(fā)者在使用自己的模型結(jié)構(gòu)時也能有較低的內(nèi)存占用,從而提高競爭力。
至此,天元獲得了在各主流計算平臺的高效推理能力。在 X86 / CUDA / ARM 的各種子架構(gòu)上,均提供性能經(jīng)過深度優(yōu)化的算子,保證了推理時的高性能,讓開發(fā)者可以實現(xiàn)訓(xùn)練 - 推理一體,真正免于模型轉(zhuǎn)換。
推理工具與教程
配合本次 ARM 能力的放出,天元在官網(wǎng)上提供了完整的部署流程教程,幫助大家快速上手端側(cè)推理的開發(fā)步驟。
另外,天元也進一步優(yōu)化了推理方面的使用體驗,提供性能分析工具和優(yōu)化手冊,方便開發(fā)者找到性能瓶頸,提高模型推理性能。
最后天元針對跨平臺編譯進行優(yōu)化,開發(fā)者可以利用天元在 Linux / Windows /macOS / iOS / Android 上進行推理。
各平臺內(nèi)置常用圖像處理算子
除了 NN 算子之外,在深度學(xué)習(xí)模型應(yīng)用的場景中,各類 CV(也就是圖像處理)算子往往也作為模型的預(yù)處理步驟存在,這些步驟的性能和精度會高度影響一個深度學(xué)習(xí)模型的落地效果。天元內(nèi)置了常用的 CV 算子,并進行了高度優(yōu)化,它們可以作為模型的一部分存在,實現(xiàn)框架的統(tǒng)一優(yōu)化。在推理時,解碼后的結(jié)果可以直接輸入框架,通過一次調(diào)用完成全部 CV 操作和 NN 算子,簡單方便。
在深度學(xué)習(xí)模型的落地中,一個重要的步驟稱為 “對分”,它能確保模型訓(xùn)練與最終推理的行為完全一致。天元提供的 CV 算子在各平臺間對齊精度,盡全力避免訓(xùn)練與推理的差異,降低其中的誤差,從而顯著降低對分的成本,助力模型快速落地。
新增復(fù)現(xiàn)模型與訓(xùn)練功能增強
除本次核心技術(shù)升級外,天元也一直在更新更多模型復(fù)現(xiàn),助力開發(fā)者利用天元完成更多工作。
包括前文提到的量化模型 ResNet、ShuffleNet v1、MobileNet v2,至此天元的分類模型提供了主流 ResNet 系列、ShuffleNet 系列、MobileNet 系列的量化、非量化版本,并提供基于 ImageNet 的預(yù)訓(xùn)練權(quán)重。
檢測模型的訓(xùn)練邏輯比較復(fù)雜,天元本次復(fù)現(xiàn)了 Faster R-CNN,并提供了 RetinaNet 的量化版本。
另外,本次還更新了兩個生成對抗網(wǎng)絡(luò)。在 CIFAR10 數(shù)據(jù)集上復(fù)現(xiàn)了 DCGAN 和 WGAN 兩篇論文的工作,各項評估指標(biāo)都達到復(fù)現(xiàn)的 SOTA 水平。
此外,天元本次提供了兩個人體骨骼點復(fù)現(xiàn)模型,分別是經(jīng)典的 Simple Baseline 和 MSPN 網(wǎng)絡(luò),MSPN 是曠視在 CVPR 2019 上提出的高效人體姿態(tài)估計網(wǎng)絡(luò)。這兩個模型都提供了基于 COCO 數(shù)據(jù)集的預(yù)訓(xùn)練權(quán)重,便于大家進行更多實驗。
天元從 Beta 版本開始,正式提供中文版 API 文檔,讓更多開發(fā)者可以利用上天元的能力,加入深度學(xué)習(xí)的時代。此外,還新增了若干算子、Objects 365 Dataset 的 API 和多級訓(xùn)練時參數(shù)打包的功能。
天元發(fā)展規(guī)劃
目前,天元團隊正在為 9 月的正式版本進行開發(fā),屆時希望能夠提供更完善的動態(tài)計算能力,讓訓(xùn)練側(cè)可以更加自由的表達計算形式。另外,天元會進一步優(yōu)化訓(xùn)練和推理的全流程使用體驗,讓深度學(xué)習(xí)從算法到落地更加高效。
非常歡迎大家加入天元(MegEngine )的開發(fā)工作,加入開源框架社區(qū),持續(xù)推動 AI 底層建筑的發(fā)展。
再次歡迎大家關(guān)注天元的 Github 項目 MegEngine,并參與貢獻者計劃。
Github 項目 MegEngine:
https://github.com/MegEngine/MegEngine
并參與貢獻者計劃:
https://github.com/MegEngine/Resource/blob/master/Contributor_Program.md
總結(jié)
以上是生活随笔為你收集整理的旷视MegEngine核心技术升级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MegEngine亚线性显存优化
- 下一篇: MegEngine 框架设计