干燥設備網,干燥劑,干燥機,干燥設備,中網干燥設備網 中網干燥設備網(www.tsyct.com)國內首家開放、權威、領先的干燥設備門戶,網站匯集千家干燥設備類商家供求信息,資訊信息等全力打造國內干燥機第一門戶,歡迎登陸網站免費發布干燥設備招商,求購信息!

    <mark id="wmsrj"></mark>
    1. <small id="wmsrj"><strong id="wmsrj"></strong></small>
      17 倍加速:PyTorch 模型的 GPU 優化剖析
      作者:佚名 日期:2020年10月31日 來源:本站原創 瀏覽:

      核心提示:17 倍加速:PyTorch 模型的 GPU 優化剖析 背景 IFX 是滴滴自研的 AI 推理引擎框架,針對云、端、邊提供 AI 部署解決方案。目前,滴滴內部有很多 PyTorch 模型已經接入到 IFX 云端框架,并且通過 Serving 方式上線。 在

      17 倍加速:PyTorch 模型的 GPU 優化剖析

      背景

      IFX 是滴滴自研的 AI 推理引擎框架,針對云、端、邊提供 AI 部署解決方案。目前,滴滴內部有很多 PyTorch 模型已經接入到 IFX 云端框架,并且通過 Serving 方式上線。

      在模型從接入到上線的整個流程中,有一個必需的環節:在相同環境下評測 IFX 相比 PyTorch(1.3.1) 帶來的性能收益。

      這些模型大概分為兩類:resnet 和 mobilenet。從上面結果可以看到 resnet 系列的(A、B、C、D)模型在適配到 IFX 框架之后性能提升大概在3-4倍,mobilenet 系列的(E、F)模型大概是17倍。

      針對用戶接入的E、F模型,IFX 相比 PyTorch 提升了 17 倍左右,為什么有這么大的優化空間呢,本文就來一步一步分析下。

      基礎分析

      E、F模型網絡結構是 mobilenet-v3,這里是 mobilenet-v3模型介紹,可以看下模型主要的結構以及用途。從 PyTorch 導出的 onnx 模型中粗略估算了下,mobilenet-v3 包含約460個算子;

      首先我們先分析一下 PyTorch 的實現,利用 nvprof 看到 PyTorch 的模型執行過程中調用了500+的算子,比460多的原因是 PyTorch 的 conv 算子實現中會額外調用一個數據處理算子。

      然后我們具體分析下模型結構,下面這個是 mobilenet-v3 網絡中最常見結構。mobilenet-v3 網絡中用到了特殊的激活函數 hswish、hsigmoid,上面的四個黑色算子實現的是 hswish。在整個 mobilenet-v3 網絡中,hswish 調用了31次,hsigmoid 調用了13次,這樣相關的算子總數是31*4+13*3=163個,在模型中占比還是比較大的,而 PyTorch 的計算中沒有對這部分做單獨的優化實現,只是依次進行基礎運算。

      這個圖里面包含了 PyTorch 針對 hswish 的實現流程,4個紅色箭頭指向的計算單元分別實現了 hswish 的 add、clip、mul、div 操作,4個算子總耗時為 10.88us。

      下面說一下 IFX 針對此模型的一個優化方法,由于 hswish、hsigmoid 這兩個算子具有通用性,所以 IFX 將 hswish、hsigmoid 兩個函數整合成了2個單獨的算子,這樣的融合操作降低了算子個數,同時優化過的算子相比原來性能更好。

      可以看到 IFX 單獨實現的 hswish 算子計算耗時為2.14us,僅計算部分性能是 PyTorch 的5倍左右。

      其實這個 hswish 的融合操作只是 IFX fusion 策略中的一個,像 conv+elementwise、conv+bn+relu 這種常見的結構是可以 fusion 成一個 conv 的。

      在所有 fusion 策略應用到 mobilenet-v3 之后,模型算子個數由原來的460降低為160,數量降低的同時算子性能還有提升。

      可以看到在只做了兩個算子的融合+基礎算子(Conv、Bn、Fc等)優化之后模型性能已經提升8倍左右,當把所有優化策略應用到模型之后,又有1倍+的性能提升。

      算子數量優化掉這么多,為什么會產生這么大影響呢,需要理解的是所有的算子調用都需要從cpu 上 launch 到 GPU 上計算,這部分開銷在 PyTorch 的實現里是很大的。

      可以看到完成17個算子的計算,GPU 上的耗時大概1.39ms,而其中真正計算占比很。ù蠹s104us),空白區域是 PyTorch 調用到 GPU 其他的一些 Runtime API,這樣看GPU 計算資源沒有被充分利用。所以說針對 PyTorch 框架:operations more,waste more.

      可以看到實現相同的子網絡,IFX 5個算子大概的耗時是80us,其中計算的耗時在53ms,相比 PyTorch 計算效率更高。

      這樣測下來,針對典型子網絡結構,IFX 快了 17 倍左右,和整體性能提升保持一致。測試過程和結果表明,PyTorch 慢是有道理的。

      拓展分析

      接下來我們繼續研究下 PyTorch 為什么在 kernel 執行之間調用那么多的 Cuda Runtime API,首先先看下調用的 API 究竟有哪些:放大之后,看到是CudaSetDevice(),

      CudaGetDevice() 這兩個 API;谶@個信息,我們可以查看下 PyTorch 源碼中這兩個 API 的調用點,最終定位到c10/cuda目錄。

      c10 目錄是 PyTorch 最重要的源代碼文件夾,也就是幾乎所有的源代碼都與這里的代碼有關系,比如我們的類型定義,PyTorch Tensor 的內存分配方式等等,都在這個文件夾中。

      cuda 子目錄里面則實現了 GPU 相關的 Device、Stream、Tensor 的調度和管理。

      通過查看該目錄下的源碼,看到 CudaSetDevice(),CudaGetDevice()這兩個 api 在這些類中有調用:

      PyTorch 的實現里確實是有一些 cuda 調用機制會直接或間接的帶來很大開銷。

      除了這點之外,我們還可以從 nvprof 中看到在模型推理過程中 PyTorch 除了算子計算耗時、額外的 Runtime API 耗時之外還有很多空白的地方,這些其實是在執行 cpu 上的指令。那這個地方有沒有優化空間呢?有的,大家可以分析下這部分耗時的原因。

      歡迎大家使用滴滴云 GPU 云主機來進行深度學習模型的訓練和推理,性能非常好。

      輸入AI大師碼【1122】,滴滴云GPU全線產品享9折優惠。

      上一篇文章:運動木地板必須做維護的原因!
      下一篇文章:很多中國葡萄果農經濟都有的問題,你都懂嗎?
      發表評論
      用戶評論
      關于我們 | 企業推廣 | 服務條款 | 廣告服務 | 隱私聲明 | 免責聲明 | 聯系我們
      9万彩票