02 Jul 2019 · 趙鵬, 陳新宇, 秦臻南, 葉軍 翻譯: 包怡欣 (INTEL MLT TEAM)
1. 引言
在深度學習中,推理是指將一個預先訓練好的神經網絡模型部署到實際業務場景中,如圖像分類、物體檢測、在線翻譯等。由於推理直接面向用戶,因此推理性能至關重要,尤其對於企業級產品而言更是如此。
衡量推理性能的重要指標包括延遲(latency)和吞吐量(throughput)。延遲是指完成一次預測所需的時間,吞吐量是指單位時間內處理數據的數量。低延遲和高吞吐量能夠保證良好的用戶體驗和工業生產要求。
許多雲服務商和硬件供應商提供了一系列針對推理優化的基礎設施,例如亞馬遜的 SageMaker、Deep Learning AMIs,英特爾 ® 的 Deep Learning Boost、矢量神經網絡指令集 (VNNI) 等。
除了硬件層面的優化,在算法層面,模型量化是加速神經網絡推理的有效手段之一。Apache MXNet * 社區提供了豐富的量化工具,用戶無需重新訓練模型,只需通過量化工具就可以對訓練好的模型進行量化。量化后的模型可以通過像 VNNI 這樣的低精度(INT8)指令進行加速,有助於節省存儲帶寬,提高緩存命中率,減少能耗。
通過 MXNet * 進行模型量化后,ResNet50 V1 可在 AWS* EC2 CPU 實例中達到 6.42 倍的性能加速(其中運算符融合獲得了 1.75 倍的加速,VNNI 的 INT8 指令則帶來了 3.66 倍的加速),同時精度損失僅為 0.38%,可以說達到了速度和精度的完美平衡。
本文先描述模型量化的原理以及在 MXNet * 上的實現,然后講述如何從用戶角度使用量化工具,最后介紹在英特爾 ® 至強 ® 處理器上 VNNI 帶來的性能提升。
2. 模型量化
MXNet * 支持從單精度(FP32)到有符號的 8 比特整型(s8)以及無符號的 8 比特整型(u8)的模型量化。u8 可以用於 CNN 網絡的推理。對於大多數 CNN 網絡而言,Relu 是常用的激活函數,其輸出是非負的。因此,在 CNN 網絡的推理中使用 u8 的優勢顯而易見——我們可以多使用 1 比特來表示數據從而達到更高的精度。s8 則適用於通用的模型量化。
在使用 MXNet * 進行模型量化時,用戶無需重新訓練模型,只需通過量化校准工具就可以對訓練好的 FP32 模型進行量化加速,因此部署過程非常方便快捷。
模型的量化推理包含兩個階段:
圖 1. MXNet* INT8 推理流程示意圖
- 量化校准過程(預處理階段),我們使用驗證集中的一小部分圖片(通常為整個數據集的 1-5%)來收集數據分布的信息,包括最小值 / 最大值、基於熵理論的最佳閾值、基於對稱量化的量化因子等。最終,這些量化參數會被記錄在新生成的量化模型中。
- INT8 推理(運行階段), 量化模型可以像原始模型一樣被加載並用於推理。
3. 模型優化
在深度學習領域,MXNet * 是最早提供完整量化方案的深度學習框架之一,其內置了很多高級的性能優化工具,如支持 INT8 的數據加載器、離線校准、圖優化等。通過圖優化實現的運算符融合,是對一些常見的操作進行功能合並,如 Conv+Relu, Conv+BN, Conv+Sum 等。運算符融合能夠減少在量化過程中反復的數據類型轉化,從而使得量化后的網絡相比於原始模型更加簡潔高效。下圖中的 ResNet50 V1 顯示了網絡在運算符融合和量化前后的變化。
圖 2. ResNet50 V1 網絡結構(左圖:FP32,右圖:INT8)
另外值得一提的是,當用戶在不同的硬件上部署量化模型時, 無論是否支持 VNNI 指令,MXNet * 的量化方案都是可用的。例如從 C5.18x.large (英特爾 ® 第一代可擴展處理器,不支持 VNNI 指令) 切換到 C5.24x.large (英特爾 ® 第二代可擴展處理器,支持 VNNI 指令),用戶無需修改代碼,同時又能獲得大幅度的性能提升。
圖 3. 英特爾 ® Deep Learning Boost
4. 模型部署
用戶可以使用 MXNet * 的量化校准工具和 API 輕松地將他們的 FP32 模型量化成 INT8 模型。MXNet * 官方也提供了圖像分類和物體檢測 (SSD-VGG16) 的量化示例。用戶還可以參考量化 API 來將這些工具集成到實際的推理任務中。
下面,以 SSD-VGG16 為例介紹 MXNet * 的模型量化過程。
4.1 准備階段
使用以下命令安裝 MXNet*,包含英特爾 ®MKL 庫能夠優化推理性能。
pip install --pre mxnet-mkl
首先,下載訓練好的 SSD-VGG16 模型 和打包的二進制數據。創建 model 和 data 的目錄,解壓 zip 文件並重命名,如下所示:
data/
|--val.rec
|--val.lxt
|--val.idx
model/
|--ssd_vgg16_reduced_300–0000.params
|--ssd_vgg16_reduced_300-symbol.json
然后,你可以使用如下命令來驗證 FP32 的模型:
# USE MKLDNN AS SUBGRAPH BACKEND export MXNET_SUBGRAPH_BACKEND=MKLDNN python evaluate.py --cpu --num-batch 10 --batch-size 224 --deploy --prefix=./model/ssd_
4.2 量化階段
MXNet * 為 SSD-VGG16 提供了一個量化腳本。用戶可以通過設置不同的配置項將模型從 FP32 量化成 INT8,包括 batch size、量化用的 batch 數目、校准模式、目標數據類型、不做量化的層,以及數據加載器的其他配置。我們可以使用如下指令進行量化,默認情況下腳本使用 5 個 batch(每個 batch 包含 32 個樣本)進行量化:
python quantization.py
量化后的 INT8 模型會以如下形式存儲在 model 目錄下:
data/
|--val.rec
|--val.lxt
|--val.idx
model/
|--ssd_vgg16_reduced_300–0000.params
|--ssd_vgg16_reduced_300-symbol.json
|--cqssd_vgg16_reduced_300–0000.params
|--cqssd_vgg16_reduced_300-symbol.json
4.3 部署 INT8 推理
使用如下指令執行 INT8 模型的推理:
python evaluate.py --cpu --num-batch 10 --batch-size 224 --deploy --prefix=./model/cqssd_
4.4 結果可視化
從 Pascal VOC2007 驗證集中取一張圖片,其檢測結果如下圖所示,圖 4.1 顯示的是 FP32 模型的推理結果,圖 4.2 顯示的是 INT8 模型的推理結果。
結果可視化的指令如下:
# Download demo image python data/demo/download_demo_images.py # visualize float32 detection python demo.py --cpu --network vgg16_reduced --data-shape 300 --thresh 0.4 --deploy --prefix=./model/ssd_ # visualize int8 detection python demo.py --cpu --network vgg16_reduced --data-shape 300 --thresh 0.4 --deploy --prefix=./model/cqssd_
圖 4.1. SSD-VGG 檢測結果, FP32
圖 4.2. SSD-VGG 檢測結果, INT8
5. 性能
本節將展示模型量化的性能提升,所測數據均來自 AWS EC2 C5.24xlarge 實例上的英特爾 ® 第二代可擴展處理器(支持 VNNI 指令)。完整的硬件和軟件配置請參閱通知和免責聲明。 更多的模型和性能數據請參考 Apache / MXNet C ++ 接口和 GluonCV 模型中的示例。
通過運算符融合和模型量化,圖 5 中的總吞吐量得到了從 6.42X 到 4.06X 不等的顯著提高。 其中,運算符融合帶來的加速隨着模型中可融合的運算符數量的多少而變化。
圖 5. MXNet* 融合和量化加速對比
模型量化則可以為大部分模型提供穩定的加速,ResNet 50 v1 為 3.66X,ResNet 101 v1 為 3.82X,SSD-VGG16 為 3.77X,其值非常接近於 INT8 的理論加速比——4X。
圖 6. MXNet* VNNI 加速比
在圖 7 中的延遲測試中,運行時間越短表示性能越好。 除了 SSD-VGG16 之外,我們測試的模型都可以在 7 毫秒內完成推理。 特別是對於需要在移動端部署的 MobileNet V1,其網絡計算時間只需 1.01 毫秒,達到了極佳的速度。 另外,實際生產環境通常並不需要使用 CPU 中的所有核心進行推理任務,建議可以選取適當的計算核心(比如 4 個),以達到推理時間和成本的最優配比。
圖 7. MXNet* 延遲比較
除了極佳的加速,量化后的模型的准確性也非常接近於 FP32 模型的精度,如圖 8 所示,量化后的精度損失低於 0.5%。
圖 8. MXNet* 融合和量化精度對比
6. 總結
-
對於圖像分類和物體檢測的 CNN 網絡,經過運算符融合和 INT8 量化后進行推理能夠帶來顯著的加速。
-
量化后的 INT8 模型的精度與 FP32 模型的精度很接近,差異小於 0.5%。
-
第二代英特爾 ® 至強 ® 可擴展處理器,使用英特爾 ®DL Boost 和新的 VNNI 指令集,能夠讓用戶無需修改代碼即可進一步提升模型的計算性能(~4X)。
7. 感謝
感謝 Apache 社區和亞馬遜 MXNet 團隊的支持。感謝 Mu Li, Jun Wu, Da Zheng, Ziheng Jiang, Sheng Zha, Anirudh Subramanian, Kim Sukwon, Haibin Lin, Yixin Bao, Emily Hutson , Emily Backus 提供的幫助。另外也感謝 Apache MXNet 的用戶提出的很多中肯的意見和建議。
8. 附錄
Models | Data Shape | Batch Size | Metric | C5.24xlarge Base | C5.24xlarge Fusion | C5.24xlarge Fusion +Quantization | Speedup | FP32 Acc | INT8 Acc |
---|---|---|---|---|---|---|---|---|---|
ResNet50 V1 | 3x224x224 | 1 | Latency(ms) | 9.18 | 6.05 | 2.41 | 3.81 | 76.48 | 76.10 |
64 | Throughput(img/sec) | 347.77 | 610.04 | 2,232.67 | 6.42 | ||||
ResNet101 V1 | 3x224x224 | 1 | Latency(ms) | 17.28 | 12.08 | 4.92 | 3.51 | 77.30 | 77.02 |
64 | Throughput(img/sec) | 201.88 | 316.52 | 1,210.37 | 6.00 | ||||
MobileNet 1.0 | 3x224x224 | 1 | Latency(ms) | 2.96 | 2.02 | 1.01 | 2.92 | 72.14 | 71.97 |
64 | Throughput(img/sec) | 1,070.08 | 2,222.70 | 5,778.97 | 5.40 | ||||
Inception V3 | 3x299x299 | 1 | Latency(ms) | 13.24 | 10.05 | 6.07 | 2.18 | 77.86 | 77.95 |
64 | Throughput(img/sec) | 304.72 | 423.26 | 1,344.95 | 4.41 | ||||
SSD-VGG16 | 3x300x300 | 1 | Latency(ms) | 25.89 | 25.25 | 8.24 | 3.14 | 83.58 mAP | 83.33 mAP |
224 | Throughput(img/sec) | 78.01 | 84.09 | 317.04 | 4.06 |
9. 通知和免責申明
性能測試中使用的軟件和工作集群可能只針對英特爾 ® 微處理器的性能進行了優化。
如 SYSmark 和 MobileMark 等的性能測試是通過特定的計算機系統、組件、軟件、操作符和函數進行測量的,上述任何因素的改變都可能引起結果的改變。您需要綜合其他信息和性能測試,包括與其他產品組合時該產品的性能,以幫助您全面評估您的預期購買。更多完整信息請訪問 www.intel.com/benchmarks。
性能結果基於 AWS 截至 2019 年 7 月 1 日的測試,並不能反映所有公開可用的安全更新。沒有任何產品或組件是絕對安全的。
測試配置:
重現腳本: https://github.com/intel/optimized-models/tree/v1.0.6/mxnet/blog/medium_vnni
軟件: Apache MXNet 1.5.0b20190623
硬件: AWS EC2 c5.24xlarge 實例, 基於英特爾 ® 第二代可擴展至強 ® 處理器(Cascade Lake),全核頻率為 3.6GHz,單核最高頻率可達 3.9GHz
英特爾、英特爾標識和英特爾至強是英特爾公司或其在美國和 / 或其他國家的子公司的商標。* 其他名稱和品牌可能被視為他人的財產。© 英特爾公司