鵝廠又放大招:深度學習推理框架 TNN 再升級

深度學習的從業者們有福了。

經過 4 個多個月的迭代完善,騰訊開源的新一代跨平臺深度學習推理框架 TNN 最近推出了 v0.3 版本,將跨平臺支持的優勢進一步放大,是業界首個同時支持移動端、桌面端、服務端的深度學習推理框架。

深度學習推理框架是什麼?我們以大家都很熟悉的圖像識別爲例,先來看下深度學習的過程。

如果我們想要讓機器能夠識別照片上的物體,比如說一隻貓,我們通常需要將大量關於貓的照片轉換成數據,輸入到神經網絡中,通過激活神經網絡的方法,來讓機器學習帶有貓的照片的特徵,比如顏色、毛髮、形狀等等。

然後我們會得到一個具備識別貓的能力的算法模型,接下來,我們如何在現實的情況中也能讓計算機識別出貓呢,這就需要深度學習推理框架,來將訓練好的模型應用到現實中,最終,開發出專門識別貓的軟件或者將其直接部署到手機等硬件中。

深度學習框架就好像一個連接器,一邊是算法模型,一邊是硬件,它主要解決兩個問題👇

其一,是深度學習模型越來越大並且直接在硬件上部署難度較大,所以需要將訓練出的模型通過推理框架來進行部署。

其二,是深度學習模型對算力需求巨大,在性能受限條件下進行業務部署同樣面臨巨大挑戰。

這次隆重介紹的 TNN,是騰訊深度學習與加速 Oteam 雲帆的開源協同成果,由騰訊優圖實驗室主導,騰訊光影研究室、騰訊雲架構平臺部、騰訊數據平臺部等多團隊協同開發。

我們來看 TNN 的更多應用。

其實,我們常見的圖像識別、語音識別、推薦引擎等深度學習應用,都離不開深度學習推理框架。比如,使用了 TNN 的機器文字識別和閱讀理解算法:

上面的示例展示的是騰訊的一個 OCR 文字識別技術和機器閱讀理解技術。

此前,騰訊光影和騰訊光流團隊的支持下,頭髮染色和人體姿態兩個 TNN 示例在 TNN 中間

迭代的小版本中已經發布,並展現出不錯的算法效果。

本次新發布的 TNN0.3 版本,有三個特點,即在通用性、易用性、性能方面也進一步提升,變得更加強大。

以下內容是專業讀者特供,請享用。

一、 通用性

在保證模型統一、接口統一的前提下,依託於硬件廠商提供的加速框架基礎算子支持,以及手寫 kernel 優化的方式,對移動端、桌面端和服務端提供了多種不同加速選擇,實現了對常用 CV、NLP 模型的優化適配。

1.1 硬件平臺支持

TNN 通過集成 OpenVINO 和 TensorRT 的方式新增了對服務端 X86 和 NVIDIA 硬件的支持,既能快速獲取硬件廠商的最新優化成果,又能基於業務模型結構特點添加自定義實現達到性能極致。同時考慮到桌面端應用對安裝包大小的限制,TNN 通過 JIT 和手工優化的方式實現了輕量級的 X86 後端,整體庫大小僅爲 5MB 左右。

1.2 模型算子支持

TNN 新版本在 CV 類模型的支持上擴展了對 3D-CNN、LSTM、BERT 等模型結構的支持,總算子數從 88 個增加到 107 個,新增算子包括 LSTM、GridSample、Histogram、OneHot、BitShift、Gather、ScatterND、LayerNorm、GroupNorm、GELU、SoftSign、Erf 等。

****二、易用性 ****

2.1 動態維度和預處理支持

TNN 之前版本主要支持 CV 類模型,網絡輸入基本都是 NCHW4 個維度且每個維度上的值基本不變。而 NLP 場景下同一個網絡會有 0 維到 6 維的情況,且每個維度上的值根據輸入而變化。爲此 TNN 新增了輸入維度配置接口,在模型算子、硬件、系統支持等層面做了大量補充和完善。

API 接口對 Mat 相關接口做了一定擴充,包括拷貝填充功能 (CopyMakeBorder),方便 SDK 開發者進行網絡預處理後處理加速。目前 TNN 已支持裁剪(Crop)、縮放(Resize)、顏色空間轉換(CvtColor)、仿射變換(WarpAffine) 和拷貝填充 (CopyMakeBorder) 等常見的預處理後處理操作。

2.2 運行時常量摺疊

onnx 模型導出模型時會產生很多粘合劑類的算子用於計算常量和數據 Shape 的信息,TNN 實現了 ConstFolder 常量摺疊功能來簡化模型結構提升模型運行性能。相比開源社區工具 onnx-simplifier,ConstFolder 增加了對以 ATen 形式輸出的算子的支持,同時支持運行時常量摺疊以支持模型變維的需求。TNN 運行時將變維計算部分的算子單獨抽取出來用 NAIVE(純 C++)執行,以減輕各個硬件 device(ARM、Metal、OpenCL)的算子實現壓力。

三、性能優化

3.1 移動端性能優化

Arm 性能優化:

(1)armv8.2 優化:fp16 向量指令優化,相比於 fp32 預期性能翻倍,除了和大多數開源框架一樣支持 arm64 之外,針對 arm32 架構也實現了 fp16 指令優化,讓 64 位和 32 位 APP

都能發揮硬件 fp16 向量加速的能力。

(2)int8 優化:針對常用的算子 block 組合採取了更激進一些的融合策略,如 conv+add+activation,能有效的減少量化反量化的開銷以及內存讀寫,並且經內部業務驗證,在提高性能的同時並不會造成精度的下降。

OpenCL 性能優化:

(1)核心卷積優化:a. 訪存性能優化: Channel Blocking 優化、以及局部內存 (localmemory) 優化提升訪存性能,實現工作組內的數據共享。b. 計算性能優化: winograd 算法優化 3x3 卷積,尋址計算優化,相鄰計算網格偏移量共用向量寄存器,降低 fp32 計算單元壓力。

(2)工作組尺寸優化: 優化計算策略,並通過 Auto-Tuning 挑選最優工作組尺寸。

(3)預處理 / 後處理優化: 使用 buffer 做參數緩存,降低 GPU 拷貝開銷。

3.2 桌面端 / 服務端性能優化

TNN 服務端通過集成 OpenVINO 和 TensorRT 的方式新增了對服務端 X86 和 NVIDIA 硬件的支持,既能快速獲取硬件廠商的最新優化成果,又能基於業務模型結構特點添加自定義實現達到性能極致。與業界服務端統一框架 onnxruntime 性能最好版本相比,TNN 當前在 CV 類模型有一定優勢,而 onnxruntime 在 NLP 類模型有一定優勢。TNN 剛開始支持 NLP 模型,後續會在這塊持續優化。

TNN 桌面端爲了兼顧高性能和硬件兼容性,同時考慮應用 App 對安裝包大小的限制,通過 JIT 和手工優化的方式實現了輕量級的 X86 後端,支持 SSE41、SSE42、AVX、AVX2、FMA 等指令集。相比 onnxruntime 服務端庫 80MB,TNN 桌面端整體庫大小僅爲 5MB 左右,而性能差距在 20% 以內。

TNN 的目標是做一個全平臺支持的 AI 推理框架,在與合作伙伴的協同下會持續輸出對各硬件平臺 (ARM、X86、NVIDIA 等) 的適配與優化。

讓我們一起期待!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/wwnTmi7-r-zWNUNCwGvt6g