TensorRT如何加速人臉識別?

爲了提高人臉識別的實時性,我們團隊將傳統的利用神經網絡框架推理升級至統一的 TensorRT 加速推理。經實驗對比,經 TensorRT FP16 模式推理加速後的人臉識別不僅幾乎無損精度,甚至於在部分場景精度有提升,識別速度提升爲原來的 2.3 倍。統一加速推理的人臉識別不僅能爲客戶提供優質高響應的服務,同時也能提升 AI 服務器資源利用率,降低服務成本,也有利於各模型推理的整合統一。

1. 目的及背景

首先,量化推理的出現爲提升人臉識別服務的響應速度,給客戶提供更優質的服務體驗提供了更多的選擇。

其次,由於不同業務需求的神經網絡模型可能是在不同的神經網絡框架下訓練生成的,比如說人臉檢測利用的是 TensorFlow,人臉識別利用的是 MxNet,而肖像生成利用的是 PyTorch。如果線上服務都用深度學習框架進行推理,則需要在服務器上部署多種框架,相對於統一的推理引擎,多種框架不利於結構的優化以及數據之間的通信,且會增加升級和維護的成本。

最後,面對日益增長的 AI 服務需求,爲了保證響應的服務質量,企業需要採購更多的服務器資源,特別是 GPU 服務器。如何提升服務器資源的利用率,降低相應的服務成本也成爲迫切的需求。通過模型量化推理減少計算和存儲資源的佔用,而推理加速也可以減少服務器資源佔用。

基於以上背景,我們團隊對現有的量化推理和深度學習推理服務進行了調研和實驗。

2. 相關技術

TensorRT

什麼是 TensorRT?TensorRT 是 Nvidia 開發的用於高性能深度學習推理的 SDK。其包括一個高性能的神經網絡 Inference Optimizer 和一個 Runtime Engine 用於生產部署。利用 TensorRT,可以優化所有主要深度學習框架中訓練的神經網絡模型,以高準確性來校準低精度,最終部署到超大規模的數據中心、嵌入式設備或汽車產品平臺。如圖 1 所示:

TensorRT 通過融合層和優化內核來優化網絡,從而提高延遲、吞吐量、功率效率和內存消耗。如果應用程序指定,它還將優化網絡以降低運行精度,進一步提高性能並減少內存需求。如圖 2 所示:

TensorRT 爲深度學習推理應用的生產部署提供 INT8 和 FP16 優化,如視頻流、語音識別、推薦和自然語言處理。減少精度推理可以顯著降低應用程序延遲,降低延遲是許多實時服務、自動駕駛和嵌入式應用程序的需求。

Low Precision Inference

MxNet、TensorFlow、PyTorch 等現有的深度學習框架,在訓練模型的時候,一般都會使用 Float 32(簡稱 FP32)的精度來表示權值、偏置、激活值等. 而當網絡的層數逐漸加深,其參數的計算量是極其多的,比如像 ResNet、VGG 這種網絡。如此大的計算量,如果在推理過程中都用 FP32 的精度來計算,會比較耗費時間和資源。如果是在對計算資源有限制的移動設備或者是嵌入式設備,如此大的計算量簡直無法想法,甚至於根本運行不起來。

在部署推理的時候使用低精度的數據,比如 INT8、FP16 等就是解決大計算量以及提升推理速度的一種方法。當然解決大計算量問題的方法,還有模型壓縮這類方法。但本文的方法專注於模型推理階段的優化。

那麼問題就來了,使用更低精度的數值表示會不會降低原來的模型準確性。畢竟如表格 1 所示,不同精度的動態範圍相差還是很大。

對這個精度損失的問題,已經有不少學者在經驗層面對其進行了相應的分析。比如 Why are Eight Bits Enough for Deep Neural Networks? [1]以及 Low Precision Inference with TensorRT [2] 這兩篇博文的提出即便是推理時使用低精度的數據,在提升推理速度的同時,並不會對精度造成太大的影響。博文作者認爲神經網絡學習到數據樣本的模式可分性,同時由於數據中存在的噪聲,使得網絡具有較強的魯棒性,也就是說在輸入樣本中做輕微的變動並不會過多的影響結果性能。甚至有研究發現,在某些場景下,低精度推理能提升結果的準確性。此外 Improving the Speed of Neural Networks on CPUs [3]和 Training Deep Neural Networks with Low Precision Multiplications [4] 這兩篇文章則在理論上其進行了分析論證。

由於 INT8 的低存儲佔用以及高通過率,但是由於其表示範圍與 FP32 相差還是太大,實際上將 FP32 精度降爲 INT8 精度,即用 8bit 來表示原來用 32bit 表示的 tensor,這其實相當於信息再編碼過程,而且不能有明顯的精度損失,還是具有相當大的挑戰。該轉換過程需要將每一層輸入張量 (Tensor) 和網絡學習的參數都從原來的 FP32 表示轉爲 INT8 表示。因此需要最小化該轉換過程的信息損失,而且轉換方式得要是簡單而且計算效率高的。

TensorRT 採用是簡單有效的線性量化的轉換方式。即式(1):

FP32 Tensor(T) = FP32 scale factor * 8-bit Tensor(t) + FP32_bias(b)(1)

其中 Nvidia 的研究者經過證明可以將其中的偏置項去掉,即式(2):

FP32 Tensor(T) = FP32 scale factor * 8-bit Tensor(t)(2)

那麼在轉換過程中最重要的就是確定這個 scale factor,最簡單的方法就是如圖 3 左邊所示的直接將 FP32 tensor 值中的 –|max| 和 |max| 映射爲 INT8 對應的 -127 和 127,中間的值按照線性的關係進行映射,該方法也被稱爲不飽和(No saturation)映射。但是經過實驗表明,該種方式有明顯的精度損失。因此 TensorRT 的開發者採用被稱爲飽和 (saturate) 映射的方式,如圖 3 右邊所示:

相對於非飽和映射,不再是直接將兩端的 ±|max|值映射到±127,而是選取一個閾值|T|, 將 ±|T| 映射爲±127,其中 |T| < |max|。在 [ -|T|, |T| ] 區間外的值直接映射爲 ±127,比如圖 3 中的三個紅色 x 點就直接映射爲 -127, 而在 [ -|T|, |T| ] 區間內的按照線性映射的方式。

TensorRT 開發者分別對網絡推理過程中涉及的權重 ( weights ) 和激活值 ( activation ) 做了實驗,得出對權重做飽和映射相對於不飽和方式並沒有精度的提高,而對激活值做飽和映射有明顯的精度提升。因此在 TensorRT 中對權重採用的是不飽和映射的方式,對激活值採用的是飽和映射的方式。

那麼爲什麼非飽和映射的方式相對飽和映射有精度的提升?此外非飽和映射中的 T 要如何選取呢?首先來看下圖右邊所示,該圖是 resnet-152 網絡模型中間層的激活值統計,橫座標是激活值,縱座標是統計數量的歸一化表示。

可以看到圖 4 中白線左邊的激活值分佈比較的集中重合,而白線(該線對應的就是閾值 T 線)右邊,即紅色框內的激活值就比較的分散,而且在紅色框內的激活值在整個層中所佔的比例比較少,因此這部分可以不考慮到映射關係中,如圖右邊所示。研究發現大部分的網絡都具有這種大部分激活值集中,少量激活值分散的特點。

T 值需要滿足 FP32 模式到 INT8 模式轉換的信息損失最小化,而信息損失可以用 KL 散度(也叫做相對熵)來衡量,即如式(3)所示:

KL_divergence(P, Q) := SUM( P[i] * log( P[i] / Q[i] ), i) (3)

其中 P,Q 分別表示 FP32 和 INT8 模式下的分佈,每一層 tensor 對應的 T 值都是不同的,而確定 T 值的過程被稱爲校準(Calibration), 如圖 5 所示校準的原理圖。

首先需要在校準數據集(Calibration Dataset)做 FP32 推理,然後獲取每一層激活值的直方圖,並用不同的量化閾值生成相應的量化分佈。其中量化閾值就如上面的激活值直方圖中,等間隔的虛線所對應的激活值就是量化閾值,我們需要的 T 值就是這些虛線中能夠使得 KL 散度最小化的激活值。這個校準是需要一些時間的,所以每次進行量化的時候,會將校準得到的 T 值都保存在相應的文件中,待下次進行 FP32 到 INT8 推理模式轉換的時候,直接讀取保存了每層 T 值的文件,這樣可以節省整個流程的時間。

顯而易見的是校準數據集(Calibration Dataset)會直接的影響到激活值的分佈,進而影響到 T 值的選擇。校準數據集要具有代表性、多樣性,比如在圖像分類應用中,校準數據集的要能夠代表所有的分類目標。驗證集 (validation dataset) 的子集是比較理想的校準集,當然有人或許會問,把全部的數據用於校準不就可以最好的體現原始數據分佈麼?但是這樣的話也會增加整個流程的時間,而經過研究和實驗表明校準集只需要 1000 個樣本即可。

TensorRT INT8 量化的性能和精度,圖 6 和圖 7 來自 Nvidia 官方的 PPT。

從上面圖 6 和圖 7 中可以看到經過校準的 INT8 推理相對於 FP32 的推理,準確率(Accuracy)有略微的損失,也可見在部分情況下(圖 6 表格中綠色所示)INT8 推理相比 FP32 推理準確率有略微提升。另外可以看見一個趨勢,隨着 Calibration dataset 中圖片數量的增加,INT8 相對於 FP32 的精度損失是在逐漸減小。從 Performance 這張圖中可見在不同的推理 Batch Size(注意實際推理的 Batch Size 和 Calibration 過程中的 Batch Size 並不需要保持一致)設定下,INT8 推理相比於 FP32 推理的加速比。圖中可見 Batch Size 越大,加速效果越好,在 Batch Size 爲 128 的時候,加速比大約在 3.5 倍左右,當然實際的加速比和硬件平臺,還有神經網絡本身也有關係。除了速度上面的提升以外,低精度推理在存儲消耗上相對於 FP32 也有相應的優化,如圖 8 所示:

圖 8 中,INT8 on P40 即表示在 P40 顯卡上進行 INT8 推理,可以看出相比 FP32 推理模式內存佔用減少了 3 倍多,而速度提升了 3 倍多。而 FP16 模式也減少了 30% 的內存佔用,速度提升了近兩倍。

當然,上述的實驗對比測試均來自 Nvidia 官方,具體到我們實際的深度學習場景,還需要經過實驗進行對比精度的損失以及速度的提升,在第三章中,將會概述我們團隊利用 TensorRT 加速人臉識別的實驗流程以及效果,還有在實施中遇到的一些問題和解決方法。

神經網絡優化

TensorRT 除了通過支持 FP16 和 INT8 這兩種低精度模式的推理來提升速度以外,其在底層會根據 GPU 特性對神經網絡進行相應的重構和優化。首先是其會刪除一些並沒有使用輸出的層,以避免不必要的計算。然後會對神經網絡中一些可以合併的運算進行合併,例如在圖 9 所示的原始網絡,TensorRT 會將其中的 conv、bias、relu 這三個層融合在一個層中,即圖 10 所示的 CBR 層,這個合併操作也被成爲垂直層融合。進一步的還有水平層融合,即如圖 10 到圖 11 的過程,將處於同一水平層級的 1x1CBR 融合到一起。

Inference Server

Inference Server 是一類爲機器學習模型提供一站式管理、推理服務、集成等功能的高性能模型服務系統。以下簡要介紹幾種常見的 Inference Server。

i.TensorFlow Serving

TensorFlow Serving 是由 Google 的 TensorFlow 團隊開發的一種靈活的、高性能的機器學習模型服務系統,專爲生產環境設計。在機器學習推理方面,其可以對訓練後的模型進行生命週期管理,通過高性能、引用計數的查找表爲客戶端提供版本化訪問。其提供了與 TensorFlow 模型開箱即用的集成,也能拓展到其他模型。如果模型由 TensorFlow 訓練生成的,用 TensorFlow Serving 最爲方便。詳細介紹參見:
https://github.com/tensorflow/serving

ii. MMS( Multi Model Server )

Multi Model Server(MMS)是一個靈活和易於使用的工具,爲使用任何 ML/DL 框架訓練的深度學習模型提供推理服務。這個是由 Amazon 的 AWSlab 開發的模型推理工具,原來叫 MxNet Model Server。由於 Amazon 主力支持的是 MxNet,因此 MMS 對 MxNet 有更好的優化,對 MxNet 的特性支持也更加積極。詳見 https://github.com/awslabs/multi-model-server

iii. TensorRT Inference Server

前面介紹的 TensorFlow Serving 和 MMS 都是由深度學習框架的廠商推出的,相應的對其各自的深度學習框架支持也會更好。

TensorRT Inference Server (最新版叫 Nvidia Triton Inference Server)是由顯卡廠商 Nvidia 開發的深度學習模型推理 Server。其針對 Nvidia GPU 有更深層次的優化,該 Server 可以通過 HTTP 或者 GRPC 端點提供推理服務。其最大的特點是多框架的支持,其不僅支持 TensorRT 本身生成的模型,而且支持 TensorFlow、Caffe2、ONNX 和 PyTorch 的模型。還支持混合模型的推理,以及不同框架模型同時推理。這很好的契合業務上推理服務與神經網絡框架脫離的需求。詳見 https://github.com/NVIDIA/triton-inference-server。

這裏簡單介紹常見的 Inference Server,當然還有其他廠商的 Inference Server,如 TorchServe,見 https://github.com/pytorch/serve。

3. TensorRT加速人臉識別

TensorRT的典型INT8工作流程:

首先我們需要在 FP32 模式下訓練得到的模型文件及校準數據集。接下來:

① TensorRT 將會在校準集上作 FP32 的推理。
② 得到每個網絡層相應的激活值統計。
③ 實施校準算法即獲取每層對應的最佳閾值 T,獲取最優的量化因子。
④ 量化 FP32 的權重爲 INT8 模式。
⑤ 生成相應的校準表 ( CalibrationTable ) 和 INT8 執行引擎。

TensorRT加速需要注意的問題:

深度學習框架與TensorRT的整合度不同

如上所述實施 TensorRT 推理加速,首先是需要一個 FP32 模式下訓練得到的神經網絡模型。如果要進行 INT8 推理,還需要校準數據集 (Calibration Dataset),一般是選取驗證集的子集。由於各深度學習框架和 TensorRT 的整合度和支持度不同,除了 TensorFlow 和 MATLAB 已經集成了 TensorRT 外,大部分的深度學習框架生成的模型都要通過 ONNX 格式導入 TensorRT 中。如圖 12 所示:

由於 TensorFlow 內實現了和 TensorRT 進行整合的 API,即可以從 TensorFlow 代碼中指定 TensorRT 作爲 Inference 的 backend,TensorRT 中也實現了一個 TensorFlow Parser 用於解析 TensorFlow 生成的模型文件。PyTorch、MXNET 則需要在訓練的時候將模型文件保存爲 ONNX 格式,或者是將原先的模型文件導入框架再保存爲 ONNX 格式。當然這些深度學習框架也在跟進對 TensorRT 的支持和整合,比如新的 1.60 版本 MXNET 中已經實現了調用 TensorRT 加速推理,但是當前版本只支持 FP16 的推理,還不支持 INT8 推理。當然使用框架內提供的 TensorRT 接口進行加速有其好處,當然也會帶來相應的問題,好處是框架內提供的比較方便,減少轉換等中間過程,但還是不能脫離框架本身,這與統一用推理引擎,脫離深度學習框架本身的出發點相背道。

TensorRT對神經網絡中的算子和層的支持

由於我們當前業務中人臉識別是在 mxnet 框架上實現的,爲了實現並對比其在 TensorRT FP32、FP16、INT8 三種模式下的精度損失情況和加速效果。我們首先將原始的 mxnet 格式(.params + .json)模型文件導入到 mxnet 中,然後利用 mxnet 內部的 onnx 接口將模型文件轉換爲 onnx 格式。這裏需要注意一個問題是 Mxnet 模型導出爲 onnx 格式,需要安裝 1.3.0 以上版本的 mxnet,以及對應的組件 onnx 也需要 1.2.1 版本,不過我們測試過 1.3.0 版本的 onnx 也可以。具體可參見 MxNet 的官方教程:Exporting to ONNX format [5]。onnx-1.2.1 版本生成的是 onnx 文件默認 V7 版本的 onnx operator,而 1.3.0 版本 onnx 生成的 onnx 文件支持的是 V8 版本的 onnx operator。不同版本的 onnx operator 對算子的支持是不同的,而且即便是同樣的算子,不同的版本其內部實現方式也可能會不同。不同版本的 TensorRT 對 onnx 的算子支持也不同,mxnet 對 onnx 算子支持可參見: ONNX Operator Coverage[6]。TensorRT 對 onnx 算子支持可參見:Supported ONNX Operators[7] 和 TensorRT-Support-Matrix-Guide[8]。

我們團隊在利用 TensorRT 轉換人臉識別 onnx 模型到 TensorRT 對應的模型文件(.trt)的過程就曾遇到過算子支持的問題。由 mxnet 生成的 onnx 模型文件導入到 TensorRT 之後,一直無法正常的導出 TRT 文件。後來通過調研發現是 TensorRT 對 Prelu 這個算子的支持模式問題。通過 Netron(神經網絡可視化工具)可以清楚的看到這兩種 Prelu 的模式區別。如圖 13 所示:

其中綠色粗線左邊的 PRelu 是 mxnet 中支持運行的模式,這是 mxnet 導出 onnx 的默認 PRelu 模式。綠色粗線右邊帶有 Reshape 的 PRelu 則是 TensorRT 中支持的模式。爲此我們通過手動修改 mxnet 的對應 onnx 轉換的源碼,將導出的 onnx 文件的 Prelu 修改爲圖右邊的模式。除此外,團隊裏有其他深度學習的任務在轉 onnx 格式時還碰到過如 softmaxactivation、upsampling、crop 等算子的支持問題。除了修改 mxnet 的源碼的解決方式以外,還可以通過修改原始的神經網絡結構爲支持 TensorRT 的,然後重新進行模型的訓練,但重新調參訓練模型在部分業務場景下所消耗的時間和精力成本比較大。也可以通過 TensorRT 提供的 plugin 功能來自行實現有些尚未支持的算子和網絡層的解析。

不同的顯卡對計算模式的支持度不同

由於架構和功能上的差異,不同的顯卡對 FP16、INT8、INT4 的支持,以及相對於 FP32 實際獲得加速效果是不同的,詳見圖 14 的表格所示:

圖 14 中,N/A 表示不支持,2x、4x、8x 分別表示在該模式下相對於 FP32 模式下的加速比爲 2 倍、4 倍、8 倍。比如從表中可以看到,Tesla P100 支持 FP32 和 FP16,但是不支持 INT8 和 INT4 加速。而 Tesla P40 則支持 INT8,但是不支持 FP16。在 nvidia 新的圖靈架構 (表中 chip 爲 tu102 和 tu104) 卡已經完整的支持 FP16、INT8、INT4。

爲保證 TensorRT 加速人臉識別的公平性,我們團隊統一在 Tesla T4 上進行 FP32、FP16、INT8 的實驗。另外有一點需要提到的是在不同的型號顯卡上生成的 TensorRT 推理引擎文件 (TRT) 是不能通用的,比如說在 Tesla P40 上面生成的 TRT 文件並不能在 Tesla P100 上運行,反之同理。

人臉識別在經過TensorRT的加速後效果

測試集:由客流雲系統前端攝像頭採集的 506 張員工照片;
校準集:LFW,INT8 模式需要校準,FP16 模式無需校準;
測試平臺: Nvidia Tesla T4;
相關設置: 校準 batch size 設置爲 64;推理的 batch size 設置爲 1,這個與我們實際業務場景一樣,要求來一張處理一張,保證實時返回處理結果。

上面圖 15 所展示的爲我們團隊利用 TensorRT 加速人臉識別的推理效果,其中 MX 表示利用 MXNET 框架進行推理,TR 表示利用 TensorRT 進行推理,FP32、FP16、INT8 分別表示對應的推理模式。首先來看藍色柱形部分,以 MX FP32 爲基準,在 TensorRT 上以 FP32 的精度來進行推理,其推理速度是 MX FP32 模式下的 1.557 倍,該提速主要是得益於 TensorRT 對神經網絡中的層和算子進行相應的融合及優化。利用 TensorRT 分別在 FP16 和 INT8 模式下獲得的提速分別是 2.296 倍和 3.185 倍。再看橙色的柱形,TR FP16 和 TR INT8 相對於 TR FP32 的 1.475 倍的加速主要是得益於 FP16 和 INT8 相對於 FP32 計算獲得更加高效的計算以及更高的通過率。INT8 加速的效果是非常喜人的,不僅是速度的提升,以及還有內存上佔比的減少,帶來的效果不光是服務的提升,同時也能減少相應的資源成本。

我們的目的是在儘量保持原有精度的情況下獲得提速,經過後續的精度對比實驗,其中 FP16 模式幾乎無精度損失,甚至於部分情況下精度有略微提升,而 INT8 模式的精度損失稍微大了些。爲此團隊在綜合考慮之後,擬線上部署 TensorRT FP16 模式加速推理,FP16 模式精度幾乎無損、加速效果可以、使用也比較方便(無需校準),另外 FP16 模式也是 NVIDIA 何琨老師比較推薦的。

4. 總結

爲了提升客流雲的服務速度以及降低相應的服務成本,我們團隊在調研和實驗相關的量化推理加速方案後,利用 TensorRT 在無損精度的情況下將人臉識別服務的推理速度提升爲原來的 2.3 倍。統一推理後臺爲 TensorRT,同時也爲後續融合多種不同神經網絡框架模型帶來可能,也相應的減少了業務部署上的成本和麻煩。主要需要注意的問題是,神經網絡框架、ONNX、TensorRT 對算子的支持,此外一定要結合自身的業務場景實驗量化推理,保證無損精度的情況下獲得相應的加速,這也爲我們後續加速其他的 AI 服務提供了寶貴經驗。

參考文獻:

[1]   Low Precision Inference with TensorRT
[2]   TensorRT(5)-INT8校準原理
[3]   TensorRT Developer Guide
[4]   8-bit Inference with TensorRT
[5]   Deploying Deep Neural Networks with NVIDIA TensorRT
[6]   Hardware for Deep Learning. Part 3: GPU
[7]   Kullback–Leibler divergence

團隊介紹:

WakeData算法團隊主攻人臉識別、趨勢預測、個性化推薦、feed流推薦等AI應用場景。基於人臉質量模型的性別預測準確率達98.3%;遊戲中心個性化推薦分發量較人工編輯提高近4倍,收益提高30%;Feed流推薦核心指標效果達130%以上。團隊負責人李翔博士,主要工作和研究方向爲機器學習、深度學習、城市計算等領域,曾就職於中興通訊、中國工商銀行、魅族科技。團隊聚焦線下數據領域算法的應用,有意加入者可聯繫李翔博士,[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章