最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

5個實用提速深度學(xué)習(xí)模型的方法

2021-08-23 17:09 作者:深藍(lán)學(xué)院  | 我要投稿

您是否通過深度學(xué)習(xí)模型獲得了良好的準(zhǔn)確性,卻發(fā)現(xiàn)推理時間不足以部署到生產(chǎn)環(huán)境中?您是否對如何優(yōu)化模型的推理速度迷失了方向?那么這篇文章是給你的。眾所周知,數(shù)據(jù)科學(xué)項目有一個奇特的特性,即項目者需要不斷轉(zhuǎn)換關(guān)注重點,根據(jù)業(yè)務(wù)或項目的不同需求。下面羅列了一些具體的關(guān)注點:

  • 數(shù)據(jù)集是如何獲取的?是否是自己創(chuàng)建的數(shù)據(jù)集?(如果是自己的數(shù)據(jù)集,那么準(zhǔn)確的標(biāo)簽是什么?任務(wù)中需要使用的樣本需要多少?)

  • 如何將模型充分利用到實際項目中來?即使一個模型很好,但是如何將這個模型投入到實際項目中?

  • 你將使用什么模型?目前,學(xué)術(shù)界已經(jīng)發(fā)表了很多具有價值的算法模型,而我們在研究中時,很多技術(shù)已經(jīng)發(fā)生了改變。

  • 最重要的問題:這上述的一切是否可行,也就是按照目前的預(yù)算,是否可以用數(shù)據(jù)集訓(xùn)練出一個模型?并且這樣的模型,是否能夠滿足我們應(yīng)用場景的需要?

通常,在最后一個問題中,我們主要關(guān)注獲得數(shù)據(jù)集的最佳預(yù)測準(zhǔn)確性。這是最有意義的,因為它允許我們驗證項目是否可行。反正,如果我們需要為模型投資更多數(shù)據(jù)以實現(xiàn)其目標(biāo),那么我們就需要權(quán)衡效率的問題。對于某些項目,緩慢的推理速度并不是一個破壞因素。但是,如果真的是這樣的情況,那么具體會發(fā)生什么事情?

這種情況,可能發(fā)生在任何深度學(xué)習(xí)項目中,但在將涉及對象檢測的項目部署到生產(chǎn)時通常會出現(xiàn)這種情況。當(dāng)操作來自相機(jī)的圖像時,每秒處理的每個幀都很重要。在硬件上投入更多資金絕對可以解決或緩解我們的問題。但是,如果我們打算將我們的產(chǎn)品作為解決方案(比如帶有集成邊緣 GPU 的攝像機(jī))銷售,這會線性增加產(chǎn)品的成本,直到我們無法從投資中獲得回報。

針對許多實際情況,我們經(jīng)歷了上述的問題。這里,我們給出不同的方法清單,用來提高算法模型的推理速度。

1.改變模型的權(quán)重

從我們的經(jīng)驗來看,優(yōu)化運行時模型的第一步是充分利用模型的架構(gòu)。

1.1.1 訓(xùn)練后量化

將算法模型權(quán)重的精度,由浮點類型(32-bits)轉(zhuǎn)換到整型(8-bits),將會降低模型的準(zhǔn)確度。但是,從內(nèi)存存儲角度來看,這大大降低了存儲消耗,反正提高了CPU和硬件加速器的延遲。

具體如何實現(xiàn)這個方法,主要取決于此算法模型所實現(xiàn)的框架。如果算法模型是用TensorFlow實現(xiàn),那么很幸運,因為TensorFlow給出了模型量化的封裝函數(shù)。如果算法模型使用PyTorch實現(xiàn)的,那么稍微有點困難。就在寫本文的時候,PyTorch對于模型量化的支持,還局限于CPU端的支持。未來PyTorch對于模型量化的支持,將擴(kuò)充到GPU端,就目前來看對于GPU端的模型量化支持還不夠成熟。

當(dāng)然,針對PyTorch實現(xiàn)的算法進(jìn)行量化優(yōu)化也不是沒有任何方法,可以利用NVIDIA的TensorRT進(jìn)行實現(xiàn),但是為了能夠在TensorRT運行時上運行PyTorch模型,模型權(quán)重需要先轉(zhuǎn)化為中間模型權(quán)重格式。目前,可以實施的方法就是將PyTorch模型權(quán)重轉(zhuǎn)換為ONNX模型格式,最終轉(zhuǎn)化到TensorRT上進(jìn)行運行。

1.1.2 實驗舉例

如果我們嘗試量化一個用PyTorch框架實現(xiàn)的Faster R-CNN算法模型,但是不幸的是,這回產(chǎn)生很多問題。在論文上,所有這些過程都是有道理的,應(yīng)該很容易做到。然而,在實踐中,所有這些轉(zhuǎn)換都可能出現(xiàn)問題。這主要是因為 PyTorch、ONNX 和 TensorRT 的發(fā)展會朝著多個方向發(fā)展,當(dāng)一項功能被添加到一個功能中時,舊的集成不一定支持它??赡艿膯栴}如下:

☆ 我們的模型可能能夠在ONNX上運行,但是問題可能發(fā)生在將ONNX格式的模型轉(zhuǎn)為TensorRT格式的過程中。尤其是,針對某些網(wǎng)絡(luò)層,例如是PyTorch中的Resize層。

☆ 在我們嘗試進(jìn)行這種轉(zhuǎn)換時,我們碰巧使用PyTorch v1.3 或更高版本構(gòu)建的模型可以轉(zhuǎn)換并在ONNX Runtime 中運行,但無法通過 ONNX 優(yōu)化器運行(這在轉(zhuǎn)換網(wǎng)絡(luò)是尤其重要的一步)。

請記住,這些問題可能會出現(xiàn)也可能不會出現(xiàn),這取決于我們模型的架構(gòu),我們在轉(zhuǎn)換簡單的CNN網(wǎng)絡(luò)時沒有問題,但是對于我們正在使用的Faster R-CNN實現(xiàn),這是另一回事。一些用戶可以通過降級PyTorch設(shè)法解決了轉(zhuǎn)換過程中的問題。但是,這限制了我們可以訪問的ONNX的opset,這反過來也限制了我們可以使用哪個TensorRT 版本來運行您的引擎。希望所有這些問題都能在不久的將來得到解決……但考慮到所有這些框架的開發(fā)速度都很快,很可能總會有短暫的不兼容期。

訓(xùn)練后量化絕對是一個強(qiáng)大的工具,雖然有些PyTorch模型不能用這種方法量化,但你仍然應(yīng)該試一試,考慮到將你的模型導(dǎo)出到ONNX后,可以很方便的使用命令行 trtexec 來轉(zhuǎn)換模型。順便說一下,它與Nvidia TensorRT docker容器中的 TensorRT 一起很容易獲得。如果PyTorch量化失敗,那么如果量化仍然是你想要的方法,我們建議你尋找TensorFlow實現(xiàn)。

1.2.1 將模型轉(zhuǎn)換為半精度

與之前的方法類似,這種替代方法旨在權(quán)衡速度和內(nèi)存效率的準(zhǔn)確性。它提供了FP32和UInt8之間的中間點,其中:

模型大小最多減少一半(而不是最多 75%)

☆ 精度的下降小于 UInt8,這使得精度權(quán)衡更接近 FP32。

☆ 大多數(shù)神經(jīng)網(wǎng)絡(luò)權(quán)重已經(jīng)落入這個范圍內(nèi),盡管進(jìn)行這種轉(zhuǎn)換有梯度下溢(小梯度值變?yōu)榱悖┑娘L(fēng)險,這會阻止網(wǎng)絡(luò)正確學(xué)習(xí)任何東西。

考慮到如今 GPU 的架構(gòu)已轉(zhuǎn)向針對 FP16 操作進(jìn)行優(yōu)化,尤其是使用張量核心,這種方法為提高速度提供了很好的權(quán)衡。此外,事實證明,并非網(wǎng)絡(luò)的所有層在推理過程中都花費大量時間。這意味著我們可以通過僅在需要速度提升的層(例如卷積)中使用半精度并將其余部分留在 FP32 中來找到更好的權(quán)衡。更好的是,在 FP32 中有一些層有助于防止梯度下溢。這種方法稱為自動混合精度,它在量化方面的不同之處在于,不是對訓(xùn)練模型的權(quán)重進(jìn)行后處理,而是應(yīng)該從一開始就使用混合精度來訓(xùn)練模型。

1.2.2 實驗舉例

TensorFlow 通過為我們提供原生支持來實現(xiàn)這一目標(biāo),再次在很大程度上讓我們的實際開發(fā)更輕松。而如果您使用PyTorch,NVIDIA Apex是你應(yīng)該使用的工具,幸運的是,根據(jù)我們的經(jīng)驗,它比使用PyTorch 模型進(jìn)行量化所帶來的痛苦要少得多。集成 Apex 被宣傳為僅在你的代碼中添加三行。而實際上,還不止這些。你必須對其進(jìn)行初始化,更改反向傳遞調(diào)用以使用 Apex 的縮放損失,并修改你保存和加載檢查點的方式,實例如下:

結(jié)果也很不錯。你獲得多少加速將在很大程度上取決于你正在訓(xùn)練的模型。對于我們上面提出的Faster R-CNN模型實例來說,我們獲得了超過30%的速度提升,而對我們的Faster R-CNN 模型的準(zhǔn)確性沒有任何影響。

2.尋找最優(yōu)模型

我們試圖從我們的模型中提取最后一個dropout以縮短推理時間。但也許這還不夠。也許我們模型的架構(gòu)對于我們試圖解決的問題來說太大了。減小模型的大小也會降低我們的準(zhǔn)確性嗎?不必要!這不僅取決于我們希望模型解決的問題的具體性質(zhì)。而且通過研究,不斷提出和試驗新的模型架構(gòu),通常會產(chǎn)生更纖薄的架構(gòu),通過設(shè)計實現(xiàn)更高的準(zhǔn)確性!更好的是,如果我們實現(xiàn)了前面描述的任何方法,我們就可以重用該工作,并決定對我們的模型進(jìn)行任何修改。

2.1 改變模型的backbone

在進(jìn)行遷移學(xué)習(xí)時,我們可以查看模型的主干和對其進(jìn)行預(yù)訓(xùn)練的數(shù)據(jù)集,僅作為我們在網(wǎng)格搜索中使用的超參數(shù)。我們不需要經(jīng)過完全訓(xùn)練的模型來評估推理時間。這使我們可以對多個主干進(jìn)行實驗,并查看哪些可以更好地改善推理時間。我們應(yīng)該期待我們的推理時間有相當(dāng)大的改進(jìn),記住我們的模型仍然需要通過一個主干,雖然相當(dāng)數(shù)量的推理時間發(fā)生在主干上,我們模型的外層仍然可以有對推理時間有很大影響。在研究了哪些主干提供了更好的時序之后,使用它的模型需要完全重新訓(xùn)練,以便我們分析主干對模型準(zhǔn)確性的影響。

2.2 改變整個模型

數(shù)據(jù)科學(xué)家的日常工作不僅是從事數(shù)據(jù)科學(xué)項目,還要密切關(guān)注研究以及它如何影響當(dāng)前的技術(shù)狀態(tài)。盡管我們模型的主干是我們模型的一個重要組成部分,但我們只能通過嘗試優(yōu)化一些保持其他事物靜態(tài)的東西來做這么多。如果畢竟方法推理時間仍然不符合你的喜好,那么是時候查看新開發(fā)的模型并驗證這些模型所承諾的內(nèi)容是否適用于你的實際用例。

2.3 實驗舉例

以物體檢測問題為例,一些模型專門針對速度進(jìn)行了優(yōu)化,例如 YOLO,而同時其他模型提供了多種配置,這些配置隨神經(jīng)網(wǎng)絡(luò)的深度和它們接收的輸入的大小而變化,例如 EfficentDet,允許你訓(xùn)練和比較準(zhǔn)確度與速度之間的權(quán)衡如何變化。更重要的是,令人驚嘆的機(jī)器學(xué)習(xí)社區(qū)通常會提供這些模型的開源實現(xiàn),供我們協(xié)作并幫助我們不要重新發(fā)明輪子!例如zylo117對EfficientDet 的 PyTorch 實現(xiàn)。

3.知識蒸餾

我們最后提出的改善模型推理時間的選項是通過知識蒸餾。假設(shè)我們有一個大模型(或模型的集合),它的預(yù)測精度很高,但其推理速度并不理想。Knowledge Distillation 建議通過使用我們的大模型作為訓(xùn)練器來訓(xùn)練一個具有較少參數(shù)的較小模型。這實質(zhì)上是訓(xùn)練我們的小模型輸出與我們的大模型或集成相同的預(yù)測。這樣做的一個很大優(yōu)勢是我們不僅限于使用標(biāo)記數(shù)據(jù)。

請注意,雖然我們的準(zhǔn)確性可能會受到影響,但我們應(yīng)該能夠從中獲得不錯的速度提升。不幸的是,我們沒有愉快地自己實施這種方法。但是知識蒸餾最近非常流行,并已用于對象分類、對象檢測、聲學(xué)模型和 NLP等。如果你想了解更多關(guān)于 知識蒸餾的信息,請查看Geoffrey Hinton等人的這篇論文。

4.總結(jié)

在本博客中,我們描述了五種方法來改善深度學(xué)習(xí)模型的推理時間。特別是,我們建議你按照我們列出的順序?qū)崿F(xiàn)它們,因為我們?yōu)閷崿F(xiàn)模型量化和自動混合精度所做的任何編碼對于我們對模型進(jìn)行的任何進(jìn)一步更改都具有重要價值。

我們希望這篇文章對你有價值,無論是通過為你當(dāng)前面臨的問題提供指導(dǎo),還是在需要時用我們的知識武裝你的項目!如果你有本博文中未涵蓋的加速模型推理的方法,請告訴我們……對模型的推理速度優(yōu)化有任何疑問嗎?如果可以,我們很樂意在評論中回答這些問題。

5.參考鏈接

https://www.tensorflow.org/api docs/python/tf/quantization/quantize

https://pytorch.org/docs/stable/quantization.html

https://developer.nvidia.com/zh-cn/tensorrt

https://github.com/onnx/onnx

https://arxiv.org/abs/1506.01497

https://github.com/onnx/onnx-tensorrt/issues/302

https://github.com/NVIDIA/TensorRT/issues/284

https://github.com/onnx/onnx/issues/2417

https://ngc.nvidia.com/catalog/containers/nvidiatensorrt

https://developer.nvidia.com/blog/mixed-precision-training-deep-neural-networks/

https://github.com/NVIDIAapex

https://github.com/zylo117Yet-Another-EfficientDet-Pytorch

https://arxiv.org/pdf/1503.02531.pdf

作者:匡吉

5個實用提速深度學(xué)習(xí)模型的方法的評論 (共 條)

分享到微博請遵守國家法律
合江县| 固阳县| 招远市| 大城县| 涞源县| 卢龙县| 肥西县| 泊头市| 墨竹工卡县| 孝义市| 敦煌市| 阳山县| 嵊州市| 靖州| 信宜市| 九江县| 遵化市| 麻栗坡县| 平凉市| 溆浦县| 玛多县| 卫辉市| 买车| 上饶县| 正定县| 湖南省| 高邑县| 天津市| 宜春市| 思南县| 松潘县| 定远县| 北安市| 林芝县| 苏尼特左旗| 九寨沟县| 清原| 平乡县| 文化| 台南市| 苍南县|