MXNet 图优化与算子融合
MXNet 圖優化與算子融合Graph Optimization and Quantization based on subgraph and MKL-DNN
Purpose
MKL-DNN引入了兩個高級特性:融合計算和降精度核。這些特性可以顯著地提高各種深度學習拓撲在CPU上的推理性能。
然而,MXNet由于圖表示的局限性和以往缺乏圖的優化,仍然不能從中受益。幸運的是,MXNet的新子圖特性使這些改進現在成為可能。
本文說明基于子圖的解決方案,以利用MKL-DNN在MXNet中的功能。一般來說,解決方案將MKL-DNN算子劃分為子圖,然后在子圖中用融合的內核(如果可能)替代這些MKL-DNN算子。可以通過使用MKL-DNN的降精度核(如INT8核)來選擇量化流,加速模型的推理過程。
Milestone
本文三個步驟可被視為本項目的里程碑,并用于跟蹤過程。
?完成后,將子圖分支轉換為主分支
?完成,MKL-DNN融合實現到子圖分支
?完成后,將量化流實現提交到主分支
Workflow
步驟1. 將MKL-DNN算子劃分到子圖中
這是子圖的主要用途之一。可以列出所有支持的運算符MKL-DNN,并將其傳遞給DefaultSubgraphProperty。應用圖劃分后,所有MKL-DNN算子都將分組到子圖節點中,子圖邊界上的數據格式將自動在MKL-DNN內部格式和NDArray默認格式之間轉換。根據執行模式,子圖邊界有點不同。
-
Symbolic mode
子圖將盡量覆蓋相鄰的MKL-DNN算子。
-
Imperative mode
命令式
每個MKL-DNN操作符將在一個獨立的子圖中執行,以確保MKL-DNN內部格式不會暴露在子圖之外。
Step 2. MKL-DNN operator fusion
MKL-DNN算子融合
MKL-DNN庫支持在一次執行中,運行多個特定的模式算子。比如卷積+relu。可以定義新的SubgraphSelector子圖選擇器,捕獲這種操作符模式,并生成新的MKL-DNN特定算子來替換原來的算子。
新的融合算子是獨立算子,表示定義的MKL-DNN庫算子。例如,在MKL-DNN庫中,卷積可以支持在卷積之后執行relu的post算子。因此,對于卷積+relu融合,將創建一個MKL-DNN卷積(命名為_sg_MKL-DNN_conv),并將relu描述為后算子。
NNVM_REGISTER_OP(_sg_MKL-DNN_conv)
.set_attr(“FStatefulComputeEx”, SgMKL-DNNConvOpForward)
一般來說,新的融合算子遵循MKL-DNN庫的抽象,子圖融合pass是NNVM common圖到MKL-DNN圖的降階過程。融合pass只發生在由step1創建的子圖中,不會影響MXNet默認算子。
Step 3. Quantization
MKL-DNN支持卷積神經網絡中大多數精度較低的基元,尤其是融合基元。MXNet INT8推理包括兩個步驟:
-
INT8模型,量化參數,收集校準數據準備
只執行此步驟一次。為了在FP32模型的基礎上建立INT8模型,在MKL-DNN支持的情況下,在子圖內部運行QuantizeGraph pass,用INT8算子代替FP32算子,并在適當的位置插入dequantize解量化算子。
-
Run INT8 inference
When INT8 symbols and parameters are ready for inference, the user can run inference on new input data which is the same as before.
當INT8符號和參數準備好進行inference時,用戶可以對與以前相同的新輸入數據進行推理。
Accuracy Validation
在使用MKL-DNN時,無論量化程度如何,子圖解本身都不會引入精度損失,反而會增強框架的穩定性。
NETWORK FP32 FP32 with Fusion
Top1 Top5 Top1 Top5
Resnet-152 by MKL-DNN 77.16 92.98 77.16 92.98
Inception by MKL-DNN 72.36 90.58 72.36 90.58
在量化允許的情況下,MKL-DNN與采用熵模式校準的FP32相比,可以在不到0.5%的精度損失范圍內獲得巨大的性能改進。
Accuracy data from the internal branch are shown in below table .
FP32 INT8
No Calibration Calibration using 5 batches Calibration Method
NETWORK Top1 Top5 Top1 Top5 Top1 Top5
Resnet-152 by GPU 77.19 93.01 75.56 92.32 75.58 92.24 Threshold by min/max
75.65 92.35 Threshold by entropy loss
Resnet-152 by MKL-DNN 77.16 92.98 76.59 92.71 76.44 92.69 Threshold by min/max
76.76 92.79 Threshold by entropy loss
Inception-bn by GPU 72.38 90.61 71.98 90.26 71.78 90.26 Threshold by min/max
71.98 90.36 Threshold by entropy loss
Inception-bn by MKL-DNN 72.36 90.58 72.21 90.50 72.16 90.43 Threshold by min/max
72.19 90.45 Threshold by entropy loss
Performance
On performance part, both fusion and quantization can provide the huge improvement on various kinds of topologies.
Below is the inference performance data(images/sec) from the internal branch based on SKX-8180 1 socket with batch size 64.
在性能方面,融合和量化都可以為各種拓撲結構提供巨大的改進。
以下是基于批處理大小為64的SKX-8180 套接字的內部分支的推理性能數據(圖像/秒)。
Topology Base With Fusion With Fusion + Quantization
resnet50-v1 208.17 348.80 568.25
resnet50-v2 198.87 256.10
vgg-16 92.11 101.00 150.92
inception-bn 475.74 658.75 836.94
inception-v3 175.97 227.29 327.39
inception-v4 88.99 109.15
inception-resnet-v2 104.13 124.75
mobilenet 1.0 668.71 1380.64 1788.95
squezenet 708.63 849.27 975.90
測試用例量化解決方案仍在開發中。準備好后會分享更多的數據。
測試需要包括兩個部分。第一個是圖形轉換測試。需要確保:
Step Criterion
1 所有MKL-DNN算子按執行方式劃分為一個或多個子圖。
2 可以捕獲所需的模式并創建所需的融合算子。
3 量化過程可以將期望的算子轉換為具有正確數據連接的量化版本。
另一個是MKL-DNN特定融合算子的單元測試。測試應涵蓋所有融合場景,以確保融合算子能夠提供準確的結果。
Q & A
?用戶將如何調用該功能-要使用的工作流、命令和API是什么?
此功能將在其成熟后啟用。
?計劃進行哪些API增強(或更改)?有關于向后兼容性的問題嗎?
此更改應用了方案提供的API,沒有向后兼容性問題。
?調度的單元和集成測試是什么?完整模型的E2E測試是好的,需要一些小測試,可以通過PR檢查和常規回歸來執行。
將進行完整的測試,包括單元測試和模型級測試。增加單元測試,檢查生成的圖形和融合運算器輸出的正確性。
模型級測試將檢查新變化的訓練和推理精度。
?添加非CV測試用例。
測試了RNN,GAN,RL網絡。例如,通過sockeye模型(GNMT、transformers)驗證性能和功能。
?是否正確地假設用戶選擇完全獨立于底層后端的算子?
不完全是。在這個階段,后端流不會隨子圖而改變。
通過在runtime生成變量(USE \u MKLDNN,USE \u CUDNN)和ctx(gpu,cpu)來指定用戶的后端。
?這是否意味著如果要卷積,例如,mxnet將自動在cpu、GPU和mkldnn之間進行選擇?如果是的話,這到底是怎么做到的?
不,按照當前的MXNet后端使用情況,用戶不能在不同的后端之間切換單個算子。
?認為重要的是,必須明確區分算子及其不同的實現。最后,用戶應該能夠定義一個網絡圖,有責任找到執行它的最佳方式。
同意。最后,應該達到這個狀態,但這不是這一步的目標。
總結
以上是生活随笔為你收集整理的MXNet 图优化与算子融合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ALD技术,相机去噪,图像传感器
- 下一篇: cmodel模拟器开发