TensorRT如何加速人臉識別
為了提高人臉識別的實時性,我們團隊將傳統(tǒng)的利用神經(jīng)網(wǎng)絡(luò)框架推理升級至統(tǒng)一的 TensorRT 加速推理。經(jīng)實驗對比,經(jīng) TensorRT FP16 模式推理加速后的人臉識別不僅幾乎無損精度,甚至于在部分場景精度有提升,識別速度提升為原來的 2.3 倍。統(tǒng)一加速推理的人臉識別不僅能為客戶提供優(yōu)質(zhì)高響應(yīng)的服務(wù),同時也能提升 AI 服務(wù)器資源利用率,降低服務(wù)成本,也有利于各模型推理的整合統(tǒng)一。
一、目的及背景
首先,量化推理的出現(xiàn)為提升人臉識別服務(wù)的響應(yīng)速度,給客戶提供更優(yōu)質(zhì)的服務(wù)體驗提供了更多的選擇。
其次,由于不同業(yè)務(wù)需求的神經(jīng)網(wǎng)絡(luò)模型可能是在不同的神經(jīng)網(wǎng)絡(luò)框架下訓(xùn)練生成的,比如說人臉檢測利用的是 TensorFlow,人臉識別利用的是 MxNet,而肖像生成利用的是 PyTorch。如果線上服務(wù)都用深度學(xué)習(xí)框架進行推理,則需要在服務(wù)器上部署多種框架,相對于統(tǒng)一的推理引擎,多種框架不利于結(jié)構(gòu)的優(yōu)化以及數(shù)據(jù)之間的通信,且會增加升級和維護的成本。
最后,面對日益增長的 AI 服務(wù)需求,為了保證響應(yīng)的服務(wù)質(zhì)量,企業(yè)需要采購更多的服務(wù)器資源,特別是 GPU 服務(wù)器。如何提升服務(wù)器資源的利用率,降低相應(yīng)的服務(wù)成本也成為迫切的需求。通過模型量化推理減少計算和存儲資源的占用,而推理加速也可以減少服務(wù)器資源占用。
基于以上背景,我們團隊對現(xiàn)有的量化推理和深度學(xué)習(xí)推理服務(wù)進行了調(diào)研和實驗。
二、相關(guān)技術(shù)
1、TensorRT
什么是 TensorRT?TensorRT 是 Nvidia 開發(fā)的用于高性能深度學(xué)習(xí)推理的 SDK。其包括一個高性能的神經(jīng)網(wǎng)絡(luò) Inference Optimizer 和一個 Runtime Engine 用于生產(chǎn)部署。利用 TensorRT,可以優(yōu)化所有主要深度學(xué)習(xí)框架中訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型,以高準(zhǔn)確性來校準(zhǔn)低精度,最終部署到超大規(guī)模的數(shù)據(jù)中心、嵌入式設(shè)備或汽車產(chǎn)品平臺。如圖 1 所示:
TensorRT 通過融合層和優(yōu)化內(nèi)核來優(yōu)化網(wǎng)絡(luò),從而提高延遲、吞吐量、功率效率和內(nèi)存消耗。如果應(yīng)用程序指定,它還將優(yōu)化網(wǎng)絡(luò)以降低運行精度,進一步提高性能并減少內(nèi)存需求。如圖 2 所示:
TensorRT 為深度學(xué)習(xí)推理應(yīng)用的生產(chǎn)部署提供 INT8 和 FP16 優(yōu)化,如視頻流、語音識別、推薦和自然語言處理。減少精度推理可以顯著降低應(yīng)用程序延遲,降低延遲是許多實時服務(wù)、自動駕駛和嵌入式應(yīng)用程序的需求。
① Low Precision Inference
MxNet、TensorFlow、PyTorch 等現(xiàn)有的深度學(xué)習(xí)框架,在訓(xùn)練模型的時候,一般都會使用 Float 32(簡稱 FP32)的精度來表示權(quán)值、偏置、激活值等. 而當(dāng)網(wǎng)絡(luò)的層數(shù)逐漸加深,其參數(shù)的計算量是極其多的,比如像 ResNet、VGG 這種網(wǎng)絡(luò)。如此大的計算量,如果在推理過程中都用 FP32 的精度來計算,會比較耗費時間和資源。如果是在對計算資源有限制的移動設(shè)備或者是嵌入式設(shè)備,如此大的計算量簡直無法想法,甚至于根本運行不起來。
在部署推理的時候使用低精度的數(shù)據(jù),比如 INT8、FP16 等就是解決大計算量以及提升推理速度的一種方法。當(dāng)然解決大計算量問題的方法,還有模型壓縮這類方法。但本文的方法專注于模型推理階段的優(yōu)化。
那么問題就來了,使用更低精度的數(shù)值表示會不會降低原來的模型準(zhǔn)確性。畢竟如表格 1 所示,不同精度的動態(tài)范圍相差還是很大。
對這個精度損失的問題,已經(jīng)有不少學(xué)者在經(jīng)驗層面對其進行了相應(yīng)的分析。比如 Why are Eight Bits Enough for Deep Neural Networks? [1]以及 Low Precision Inference with TensorRT [2] 這兩篇博文的提出即便是推理時使用低精度的數(shù)據(jù),在提升推理速度的同時,并不會對精度造成太大的影響。博文作者認為神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到數(shù)據(jù)樣本的模式可分性,同時由于數(shù)據(jù)中存在的噪聲,使得網(wǎng)絡(luò)具有較強的魯棒性,也就是說在輸入樣本中做輕微的變動并不會過多的影響結(jié)果性能。甚至有研究發(fā)現(xiàn),在某些場景下,低精度推理能提升結(jié)果的準(zhǔn)確性。此外 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,這其實相當(dāng)于信息再編碼過程,而且不能有明顯的精度損失,還是具有相當(dāng)大的挑戰(zhàn)。該轉(zhuǎn)換過程需要將每一層輸入張量 (Tensor) 和網(wǎng)絡(luò)學(xué)習(xí)的參數(shù)都從原來的 FP32 表示轉(zhuǎn)為 INT8 表示。因此需要最小化該轉(zhuǎn)換過程的信息損失,而且轉(zhuǎn)換方式得要是簡單而且計算效率高的。TensorRT 采用是簡單有效的線性量化的轉(zhuǎn)換方式。即式(1):
FP32 Tensor(T) = FP32 scale factor * 8-bit Tensor(t) + FP32_bias(b)(1)
其中 Nvidia 的研究者經(jīng)過證明可以將其中的偏置項去掉,即式(2):
FP32 Tensor(T) = FP32 scale factor * 8-bit Tensor(t)(2)
那么在轉(zhuǎn)換過程中最重要的就是確定這個 scale factor,最簡單的方法就是如圖 3 左邊所示的直接將 FP32 tensor 值中的 –|max| 和 |max| 映射為 INT8 對應(yīng)的 -127 和 127,中間的值按照線性的關(guān)系進行映射,該方法也被稱為不飽和(No saturation)映射。但是經(jīng)過實驗表明,該種方式有明顯的精度損失。因此 TensorRT 的開發(fā)者采用被稱為飽和 (saturate) 映射的方式,如圖 3 右邊所示:
相對于非飽和映射,不再是直接將兩端的 ±|max|值映射到±127,而是選取一個閾值|T|, 將 ±|T| 映射為±127,其中 |T| < |max|。在 [ -|T|, |T| ] 區(qū)間外的值直接映射為 ±127,比如圖 3 中的三個紅色 x 點就直接映射為 -127, 而在 [ -|T|, |T| ] 區(qū)間內(nèi)的按照線性映射的方式。
TensorRT 開發(fā)者分別對網(wǎng)絡(luò)推理過程中涉及的權(quán)重 ( weights ) 和激活值 ( activation ) 做了實驗,得出對權(quán)重做飽和映射相對于不飽和方式并沒有精度的提高,而對激活值做飽和映射有明顯的精度提升。因此在 TensorRT 中對權(quán)重采用的是不飽和映射的方式,對激活值采用的是飽和映射的方式。
那么為什么非飽和映射的方式相對飽和映射有精度的提升?此外非飽和映射中的 T 要如何選取呢?首先來看下圖右邊所示,該圖是 resnet-152 網(wǎng)絡(luò)模型中間層的激活值統(tǒng)計,橫坐標(biāo)是激活值,縱坐標(biāo)是統(tǒng)計數(shù)量的歸一化表示。
可以看到圖 4 中白線左邊的激活值分布比較的集中重合,而白線(該線對應(yīng)的就是閾值 T 線)右邊,即紅色框內(nèi)的激活值就比較的分散,而且在紅色框內(nèi)的激活值在整個層中所占的比例比較少,因此這部分可以不考慮到映射關(guān)系中,如圖右邊所示。研究發(fā)現(xiàn)大部分的網(wǎng)絡(luò)都具有這種大部分激活值集中,少量激活值分散的特點。
T 值需要滿足 FP32 模式到 INT8 模式轉(zhuǎn)換的信息損失最小化,而信息損失可以用 KL 散度(也叫做相對熵)來衡量,即如式(3)所示:
KL_divergence(P, Q) := SUM( P[i] * log( P[i] / Q[i] ), i) (3)
其中 P,Q 分別表示 FP32 和 INT8 模式下的分布,每一層 tensor 對應(yīng)的 T 值都是不同的,而確定 T 值的過程被稱為校準(zhǔn)(Calibration), 如圖 5 所示校準(zhǔn)的原理圖。
首先需要在校準(zhǔn)數(shù)據(jù)集(Calibration Dataset)做 FP32 推理,然后獲取每一層激活值的直方圖,并用不同的量化閾值生成相應(yīng)的量化分布。其中量化閾值就如上面的激活值直方圖中,等間隔的虛線所對應(yīng)的激活值就是量化閾值,我們需要的 T 值就是這些虛線中能夠使得 KL 散度最小化的激活值。這個校準(zhǔn)是需要一些時間的,所以每次進行量化的時候,會將校準(zhǔn)得到的 T 值都保存在相應(yīng)的文件中,待下次進行 FP32 到 INT8 推理模式轉(zhuǎn)換的時候,直接讀取保存了每層 T 值的文件,這樣可以節(jié)省整個流程的時間。
顯而易見的是校準(zhǔn)數(shù)據(jù)集(Calibration Dataset)會直接的影響到激活值的分布,進而影響到 T 值的選擇。校準(zhǔn)數(shù)據(jù)集要具有代表性、多樣性,比如在圖像分類應(yīng)用中,校準(zhǔn)數(shù)據(jù)集的要能夠代表所有的分類目標(biāo)。驗證集 (validation dataset) 的子集是比較理想的校準(zhǔn)集,當(dāng)然有人或許會問,把全部的數(shù)據(jù)用于校準(zhǔn)不就可以最好的體現(xiàn)原始數(shù)據(jù)分布么?但是這樣的話也會增加整個流程的時間,而經(jīng)過研究和實驗表明校準(zhǔn)集只需要 1000 個樣本即可。
TensorRT INT8 量化的性能和精度,圖 6 和圖 7 來自 Nvidia 官方的 PPT。
從上面圖 6 和圖 7 中可以看到經(jīng)過校準(zhǔn)的 INT8 推理相對于 FP32 的推理,準(zhǔn)確率(Accuracy)有略微的損失,也可見在部分情況下(圖 6 表格中綠色所示)INT8 推理相比 FP32 推理準(zhǔn)確率有略微提升。另外可以看見一個趨勢,隨著 Calibration dataset 中圖片數(shù)量的增加,INT8 相對于 FP32 的精度損失是在逐漸減小。從 Performance 這張圖中可見在不同的推理 Batch Size(注意實際推理的 Batch Size 和 Calibration 過程中的 Batch Size 并不需要保持一致)設(shè)定下,INT8 推理相比于 FP32 推理的加速比。圖中可見 Batch Size 越大,加速效果越好,在 Batch Size 為 128 的時候,加速比大約在 3.5 倍左右,當(dāng)然實際的加速比和硬件平臺,還有神經(jīng)網(wǎng)絡(luò)本身也有關(guān)系。除了速度上面的提升以外,低精度推理在存儲消耗上相對于 FP32 也有相應(yīng)的優(yōu)化,如圖 8 所示:
圖 8 中,INT8 on P40 即表示在 P40 顯卡上進行 INT8 推理,可以看出相比 FP32 推理模式內(nèi)存占用減少了 3 倍多,而速度提升了 3 倍多。而 FP16 模式也減少了 30% 的內(nèi)存占用,速度提升了近兩倍。
當(dāng)然,上述的實驗對比測試均來自 Nvidia 官方,具體到我們實際的深度學(xué)習(xí)場景,還需要經(jīng)過實驗進行對比精度的損失以及速度的提升,在第三章中,將會概述我們團隊利用 TensorRT 加速人臉識別的實驗流程以及效果,還有在實施中遇到的一些問題和解決方法。
② 神經(jīng)網(wǎng)絡(luò)優(yōu)化
TensorRT 除了通過支持 FP16 和 INT8 這兩種低精度模式的推理來提升速度以外,其在底層會根據(jù) GPU 特性對神經(jīng)網(wǎng)絡(luò)進行相應(yīng)的重構(gòu)和優(yōu)化。首先是其會刪除一些并沒有使用輸出的層,以避免不必要的計算。然后會對神經(jīng)網(wǎng)絡(luò)中一些可以合并的運算進行合并,例如在圖 9 所示的原始網(wǎng)絡(luò),TensorRT 會將其中的 conv、bias、relu 這三個層融合在一個層中,即圖 10 所示的 CBR 層,這個合并操作也被成為垂直層融合。進一步的還有水平層融合,即如圖 10 到圖 11 的過程,將處于同一水平層級的 1x1CBR 融合到一起。
2、Inference Server
Inference Server 是一類為機器學(xué)習(xí)模型提供一站式管理、推理服務(wù)、集成等功能的高性能模型服務(wù)系統(tǒng)。以下簡要介紹幾種常見的 Inference Server。
① TensorFlow Serving
TensorFlow Serving 是由 Google 的 TensorFlow 團隊開發(fā)的一種靈活的、高性能的機器學(xué)習(xí)模型服務(wù)系統(tǒng),專為生產(chǎn)環(huán)境設(shè)計。在機器學(xué)習(xí)推理方面,其可以對訓(xùn)練后的模型進行生命周期管理,通過高性能、引用計數(shù)的查找表為客戶端提供版本化訪問。其提供了與 TensorFlow 模型開箱即用的集成,也能拓展到其他模型。如果模型由 TensorFlow 訓(xùn)練生成的,用 TensorFlow Serving 最為方便。詳細介紹參見 https://github.com/tensorflow/serving 。
② MMS( Multi Model Server )
Multi Model Server(MMS)是一個靈活和易于使用的工具,為使用任何 ML/DL 框架訓(xùn)練的深度學(xué)習(xí)模型提供推理服務(wù)。這個是由 Amazon 的 AWSlab 開發(fā)的模型推理工具,原來叫 MxNet Model Server。由于 Amazon 主力支持的是 MxNet,因此 MMS 對 MxNet 有更好的優(yōu)化,對 MxNet 的特性支持也更加積極。詳見 https://github.com/awslabs/multi-model-server 。
③ TensorRT Inference Server
前面介紹的 TensorFlow Serving 和 MMS 都是由深度學(xué)習(xí)框架的廠商推出的,相應(yīng)的對其各自的深度學(xué)習(xí)框架支持也會更好。
TensorRT Inference Server (最新版叫 Nvidia Triton Inference Server)是由顯卡廠商 Nvidia 開發(fā)的深度學(xué)習(xí)模型推理 Server。其針對 Nvidia GPU 有更深層次的優(yōu)化,該 Server 可以通過 HTTP 或者 GRPC 端點提供推理服務(wù)。其最大的特點是多框架的支持,其不僅支持 TensorRT 本身生成的模型,而且支持 TensorFlow、Caffe2、ONNX 和 PyTorch 的模型。還支持混合模型的推理,以及不同框架模型同時推理。這很好的契合業(yè)務(wù)上推理服務(wù)與神經(jīng)網(wǎng)絡(luò)框架脫離的需求。詳見 https://github.com/NVIDIA/triton-inference-server。
這里簡單介紹常見的 Inference Server,當(dāng)然還有其他廠商的 Inference Server,如 TorchServe,見 https://github.com/pytorch/serve。
三、TensorRT 加速人臉識別
1、TensorRT 的典型 INT8 工作流程:
首先我們需要在 FP32 模式下訓(xùn)練得到的模型文件及校準(zhǔn)數(shù)據(jù)集。接下來:
① TensorRT 將會在校準(zhǔn)集上作 FP32 的推理。
② 得到每個網(wǎng)絡(luò)層相應(yīng)的激活值統(tǒng)計。
③ 實施校準(zhǔn)算法即獲取每層對應(yīng)的最佳閾值 T,獲取最優(yōu)的量化因子。
④ 量化 FP32 的權(quán)重為 INT8 模式。
⑤ 生成相應(yīng)的校準(zhǔn)表 ( CalibrationTable ) 和 INT8 執(zhí)行引擎。
2、TensorRT 加速需要注意的問題:
① 深度學(xué)習(xí)框架與 TensorRT 的整合度不同
如上所述實施 TensorRT 推理加速,首先是需要一個 FP32 模式下訓(xùn)練得到的神經(jīng)網(wǎng)絡(luò)模型。如果要進行 INT8 推理,還需要校準(zhǔn)數(shù)據(jù)集 (Calibration Dataset),一般是選取驗證集的子集。由于各深度學(xué)習(xí)框架和 TensorRT 的整合度和支持度不同,除了 TensorFlow 和 MATLAB 已經(jīng)集成了 TensorRT 外,大部分的深度學(xué)習(xí)框架生成的模型都要通過 ONNX 格式導(dǎo)入 TensorRT 中。如圖 12 所示:
由于 TensorFlow 內(nèi)實現(xiàn)了和 TensorRT 進行整合的 API,即可以從 TensorFlow 代碼中指定 TensorRT 作為 Inference 的 backend,TensorRT 中也實現(xiàn)了一個 TensorFlow Parser 用于解析 TensorFlow 生成的模型文件。PyTorch、MXNET 則需要在訓(xùn)練的時候?qū)⒛P臀募4鏋?ONNX 格式,或者是將原先的模型文件導(dǎo)入框架再保存為 ONNX 格式。當(dāng)然這些深度學(xué)習(xí)框架也在跟進對 TensorRT 的支持和整合,比如新的 1.60 版本 MXNET 中已經(jīng)實現(xiàn)了調(diào)用 TensorRT 加速推理,但是當(dāng)前版本只支持 FP16 的推理,還不支持 INT8 推理。當(dāng)然使用框架內(nèi)提供的 TensorRT 接口進行加速有其好處,當(dāng)然也會帶來相應(yīng)的問題,好處是框架內(nèi)提供的比較方便,減少轉(zhuǎn)換等中間過程,但還是不能脫離框架本身,這與統(tǒng)一用推理引擎,脫離深度學(xué)習(xí)框架本身的出發(fā)點相背道。
② TensorRT 對神經(jīng)網(wǎng)絡(luò)中的算子和層的支持
由于我們當(dāng)前業(yè)務(wù)中人臉識別是在 mxnet 框架上實現(xiàn)的,為了實現(xiàn)并對比其在 TensorRT FP32、FP16、INT8 三種模式下的精度損失情況和加速效果。我們首先將原始的 mxnet 格式(.params + .json)模型文件導(dǎo)入到 mxnet 中,然后利用 mxnet 內(nèi)部的 onnx 接口將模型文件轉(zhuǎn)換為 onnx 格式。這里需要注意一個問題是 Mxnet 模型導(dǎo)出為 onnx 格式,需要安裝 1.3.0 以上版本的 mxnet,以及對應(yīng)的組件 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 對算子的支持是不同的,而且即便是同樣的算子,不同的版本其內(nèi)部實現(xiàn)方式也可能會不同。不同版本的 TensorRT 對 onnx 的算子支持也不同,mxnet 對 onnx 算子支持可參見: ONNX Operator Coverage[6]。TensorRT 對 onnx 算子支持可參見:Supported ONNX Operators[7] 和 TensorRT-Support-Matrix-Guide[8]。
我們團隊在利用 TensorRT 轉(zhuǎn)換人臉識別 onnx 模型到 TensorRT 對應(yīng)的模型文件(.trt)的過程就曾遇到過算子支持的問題。由 mxnet 生成的 onnx 模型文件導(dǎo)入到 TensorRT 之后,一直無法正常的導(dǎo)出 TRT 文件。后來通過調(diào)研發(fā)現(xiàn)是 TensorRT 對 Prelu 這個算子的支持模式問題。通過 Netron(神經(jīng)網(wǎng)絡(luò)可視化工具)可以清楚的看到這兩種 Prelu 的模式區(qū)別。如圖 13 所示:
其中綠色粗線左邊的 PRelu 是 mxnet 中支持運行的模式,這是 mxnet 導(dǎo)出 onnx 的默認 PRelu 模式。綠色粗線右邊帶有 Reshape 的 PRelu 則是 TensorRT 中支持的模式。為此我們通過手動修改 mxnet 的對應(yīng) onnx 轉(zhuǎn)換的源碼,將導(dǎo)出的 onnx 文件的 Prelu 修改為圖右邊的模式。除此外,團隊里有其他深度學(xué)習(xí)的任務(wù)在轉(zhuǎn) onnx 格式時還碰到過如 softmaxactivation、upsampling、crop 等算子的支持問題。除了修改 mxnet 的源碼的解決方式以外,還可以通過修改原始的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)為支持 TensorRT 的,然后重新進行模型的訓(xùn)練,但重新調(diào)參訓(xùn)練模型在部分業(yè)務(wù)場景下所消耗的時間和精力成本比較大。也可以通過 TensorRT 提供的 plugin 功能來自行實現(xiàn)有些尚未支持的算子和網(wǎng)絡(luò)層的解析。
③ 不同的顯卡對計算模式的支持度不同
由于架構(gòu)和功能上的差異,不同的顯卡對 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 新的圖靈架構(gòu) (表中 chip 為 tu102 和 tu104) 卡已經(jīng)完整的支持 FP16、INT8、INT4。
為保證 TensorRT 加速人臉識別的公平性,我們團隊統(tǒng)一在 Tesla T4 上進行 FP32、FP16、INT8 的實驗。另外有一點需要提到的是在不同的型號顯卡上生成的 TensorRT 推理引擎文件 (TRT) 是不能通用的,比如說在 Tesla P40 上面生成的 TRT 文件并不能在 Tesla P100 上運行,反之同理。
3、人臉識別在經(jīng)過 TensorRT 的加速后效果
測試集:由客流云系統(tǒng)前端攝像頭采集的 506 張員工照片;
校準(zhǔn)集:LFW,INT8 模式需要校準(zhǔn),F(xiàn)P16 模式無需校準(zhǔn);
測試平臺: Nvidia Tesla T4;
相關(guān)設(shè)置: 校準(zhǔn) batch size 設(shè)置為 64;推理的 batch size 設(shè)置為 1,這個與我們實際業(yè)務(wù)場景一樣,要求來一張?zhí)幚硪粡?,保證實時返回處理結(jié)果。
上面圖 15 所展示的為我們團隊利用 TensorRT 加速人臉識別的推理效果,其中 MX 表示利用 MXNET 框架進行推理,TR 表示利用 TensorRT 進行推理,F(xiàn)P32、FP16、INT8 分別表示對應(yīng)的推理模式。首先來看藍色柱形部分,以 MX FP32 為基準(zhǔn),在 TensorRT 上以 FP32 的精度來進行推理,其推理速度是 MX FP32 模式下的 1.557 倍,該提速主要是得益于 TensorRT 對神經(jīng)網(wǎng)絡(luò)中的層和算子進行相應(yīng)的融合及優(yōu)化。利用 TensorRT 分別在 FP16 和 INT8 模式下獲得的提速分別是 2.296 倍和 3.185 倍。再看橙色的柱形,TR FP16 和 TR INT8 相對于 TR FP32 的 1.475 倍的加速主要是得益于 FP16 和 INT8 相對于 FP32 計算獲得更加高效的計算以及更高的通過率。INT8 加速的效果是非常喜人的,不僅是速度的提升,以及還有內(nèi)存上占比的減少,帶來的效果不光是服務(wù)的提升,同時也能減少相應(yīng)的資源成本。
我們的目的是在盡量保持原有精度的情況下獲得提速,經(jīng)過后續(xù)的精度對比實驗,其中 FP16 模式幾乎無精度損失,甚至于部分情況下精度有略微提升,而 INT8 模式的精度損失稍微大了些。為此團隊在綜合考慮之后,擬線上部署 TensorRT FP16 模式加速推理,F(xiàn)P16 模式精度幾乎無損、加速效果可以、使用也比較方便(無需校準(zhǔn)),另外 FP16 模式也是 NVIDIA 何琨老師比較推薦的。
四、總結(jié)
為了提升客流云的服務(wù)速度以及降低相應(yīng)的服務(wù)成本,我們團隊在調(diào)研和實驗相關(guān)的量化推理加速方案后,利用 TensorRT 在無損精度的情況下將人臉識別服務(wù)的推理速度提升為原來的 2.3 倍。統(tǒng)一推理后臺為 TensorRT,同時也為后續(xù)融合多種不同神經(jīng)網(wǎng)絡(luò)框架模型帶來可能,也相應(yīng)的減少了業(yè)務(wù)部署上的成本和麻煩。主要需要注意的問題是,神經(jīng)網(wǎng)絡(luò)框架、ONNX、TensorRT 對算子的支持,此外一定要結(jié)合自身的業(yè)務(wù)場景實驗量化推理,保證無損精度的情況下獲得相應(yīng)的加速,這也為我們后續(xù)加速其他的 AI 服務(wù)提供了寶貴經(jīng)驗。































 
 
 










 
 
 
 