<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          AI部署以及工業(yè)落地學(xué)習(xí)之路(文章較長,建議收藏)

          共 4102字,需瀏覽 9分鐘

           ·

          2022-05-19 12:24

          點(diǎn)擊下方卡片,關(guān)注“新機(jī)器視覺”公眾號

          重磅干貨,第一時(shí)間送達(dá)

          來源:計(jì)算機(jī)視覺研究院? ? 作者:Edison_G

          最近在復(fù)盤今年上半年做的一些事情,不管是訓(xùn)練模型、部署模型搭建服務(wù),還是寫一些組件代碼,零零散散是有一些產(chǎn)出。

          本文主要轉(zhuǎn)自知乎《鏈接:https://zhuanlan.zhihu.com/p/386488468


          深感還有很多很多需要學(xué)習(xí)的地方。既然要學(xué)習(xí),那么學(xué)習(xí)路線就顯得比較重要了。

          本文重點(diǎn)談?wù)剬W(xué)習(xí)AI部署的一些基礎(chǔ)和需要提升的地方。這也是老潘之前學(xué)習(xí)、或者未來需要學(xué)習(xí)的一些點(diǎn),這里拋磚引玉下,也希望大家能夠提出一點(diǎn)意見。


          1

          ?AI部署


          AI部署這個(gè)詞兒大家肯定不陌生,可能有些小伙伴還不是很清楚這個(gè)是干嘛的,但總歸是耳熟能詳了。



          2

          ?主題:聊聊AI部署


          作為AI算法部署工程師,你要做的就是將訓(xùn)練好的模型部署到線上,根據(jù)任務(wù)需求,速度提升2-10倍不等,還需要保證模型的穩(wěn)定性。

          是不是很有挑戰(zhàn)性?


          3

          ?需要什么技術(shù)?


          需要一些算法知識以及扎實(shí)的工程能力。

          老潘認(rèn)為算法部署落地這個(gè)方向是比較踏實(shí)務(wù)實(shí)的方向,相比設(shè)計(jì)模型提出新算法,對于咱們這種并不天賦異稟來說,只要肯付出,收獲是肯定有的(不像設(shè)計(jì)模型,那些巧妙的結(jié)果設(shè)計(jì)不出來就是設(shè)計(jì)不出來你氣不氣)。

          其實(shí)算法部署也算是開發(fā)了,不僅需要和訓(xùn)練好的模型打交道,有時(shí)候也會(huì)干一些粗活累活(也就是dirty work),自己用C++、cuda寫算子(預(yù)處理、op、后處理等等)去實(shí)現(xiàn)一些獨(dú)特的算子。也需要經(jīng)常調(diào)bug、聯(lián)合編譯、動(dòng)態(tài)靜態(tài)庫混搭等等。

          算法部署最常用的語言是啥,當(dāng)然是C++了。如果想搞深度學(xué)習(xí)AI部署這塊,C++是逃離不了的。

          所以,學(xué)好C++很重要,起碼能看懂各種關(guān)于部署精巧設(shè)計(jì)的框架(再列一遍:Caffe、libtorch、ncnn、mnn、tvm、OpenVino、TensorRT,不完全統(tǒng)計(jì),我就列過我用過的)。當(dāng)然并行計(jì)算編程語言也可以學(xué)一個(gè),針對不同的平臺而不同,可以先學(xué)學(xué)CUDA,資料更多一些,熟悉熟悉并行計(jì)算的原理,對以后學(xué)習(xí)其他并行語言都有幫助。

          系統(tǒng)的知識嘛,還在整理,還是建議實(shí)際中用到啥再看啥,或者有項(xiàng)目在push你,這樣學(xué)習(xí)的更快一些。

          可以選擇上手的項(xiàng)目:

          • 好用的開源推理框架:Caffe、NCNN、MNN、TVM、OpenVino

          • 好用的半開源推理框架:TensorRT

          • 好用的開源服務(wù)器框架:triton-inference-server

          • 基礎(chǔ)知識:計(jì)算機(jī)原理、編譯原理等


          需要的深度學(xué)習(xí)基礎(chǔ)知識


          AI部署當(dāng)然也需要深度學(xué)習(xí)的基礎(chǔ)知識,也需要知道怎么訓(xùn)練模型,怎么優(yōu)化模型,模型是怎么設(shè)計(jì)的等等。不然你怎會(huì)理解這個(gè)模型的具體op細(xì)節(jié)以及運(yùn)行細(xì)節(jié),有些模型結(jié)構(gòu)比較復(fù)雜,也需要對原始模型進(jìn)行debug。


          常用的框架


          這里介紹一些部署常用到的框架,畢竟對于某些任務(wù)來說,自己造輪子不如用別人造好的輪子。并且大部分大廠的輪子都有很多我們可以學(xué)習(xí)的地方,因?yàn)殚_源我們也可以和其他開發(fā)者一同討論相關(guān)問題;同樣,雖然開源,但用于生產(chǎn)環(huán)境也幾乎沒有問題,我們也可以根據(jù)自身需求進(jìn)行魔改。

          這里介紹一些值得學(xué)習(xí)的推理框架,不瞞你說,這些推理框架已經(jīng)被很多公司使用于生成環(huán)境了。

          • Caffe

          • Libtorch (torchscript)

          libtorch是Pytorch的C++版,有著前端API和與Pytorch一樣的自動(dòng)求導(dǎo)功能,可以用于訓(xùn)練或者推理。Pytorch訓(xùn)練出來的模型經(jīng)過torch.jit.trace或者torch.jit.scrpit可以導(dǎo)出為.pt格式,隨后可以通過libtorch中的API加載然后運(yùn)行,因?yàn)閘ibtorch是純C++實(shí)現(xiàn)的,因此libtorch可以集成在各種生產(chǎn)環(huán)境中,也就實(shí)現(xiàn)了部署
          • TensorRT

          • OpenVINO

          在英特爾CPU端(也就是我們常用的x86處理器)部署首選它!開源且速度很快,文檔也很豐富,更新很頻繁,代碼風(fēng)格也不錯(cuò),很值得學(xué)習(xí)。
          • NCNN/MNN/TNN/TVM

          有移動(dòng)端部署需求的,即模型需要運(yùn)行在手機(jī)或者嵌入式設(shè)備上的需求可以考慮這些框架。
          • PaddlePaddle

          PaddlePaddle作為國內(nèi)唯一一個(gè)用戶最多的深度學(xué)習(xí)框架。很多任務(wù)都有與訓(xùn)練模型可以使用,不論是GPU端還是移動(dòng)端,大部分的模型都很優(yōu)秀很好用。如果想快速上手深度學(xué)習(xí),飛漿是不錯(cuò)的選擇,官方提供的示例代碼都很詳細(xì),一步一步教你教到你會(huì)為止。
          • ??甸_放平臺



          4

          ?AI部署中提速的方法


          我的看法是,部署不光是從研究環(huán)境到生產(chǎn)環(huán)境的轉(zhuǎn)換,更多的是模型速度的提升和穩(wěn)定性的提升。穩(wěn)定性這個(gè)可能要與服務(wù)器框架有關(guān)了,網(wǎng)絡(luò)傳輸、負(fù)載均衡等等。不過速度的話,從模型訓(xùn)練出來,到部署推理這一步,有什么優(yōu)化空間呢?

          上到模型層面,下到底層硬件層面,其實(shí)能做的有很多。如果我們將各種方法都用一遍(大力出奇跡),最終模型提升10倍多真的不是夢!

          有哪些能做的呢?

          • 模型結(jié)構(gòu)

          • 剪枝

          • 蒸餾

          • 稀疏化訓(xùn)練

          • 量化訓(xùn)練

          • 算子融合、計(jì)算圖優(yōu)化、底層優(yōu)化

          主要說說最后兩個(gè)模塊。

          量化訓(xùn)練

          這里指的量化訓(xùn)練是在INT8精度的基礎(chǔ)上對模型進(jìn)行量化。簡稱QAT(Quantization Aware Training)。

          量化后的模型在特定CPU或者GPU上相比FP32、FP16有更高的速度和吞吐,也是部署提速方法之一。

          PS:FP16量化一般都是直接轉(zhuǎn)換模型權(quán)重從FP32->FP16,不需要校準(zhǔn)或者finetune。

          量化訓(xùn)練是在模型訓(xùn)練中量化的,與PTQ(訓(xùn)練后量化)不同,這種量化方式對模型的精度影響不大,量化后的模型速度基本與量化前的相同(另一種量化方式PTQ,TensorRT或者NCNN中使用交叉熵進(jìn)行校準(zhǔn)量化的方式,在一些結(jié)構(gòu)中會(huì)對模型的精度造成比較大的影響)。

          舉個(gè)例子,我個(gè)人CenterNet訓(xùn)練的一個(gè)網(wǎng)絡(luò),使用ResNet-34作為backbone,利用TensorRT進(jìn)行轉(zhuǎn)換后,使用1024x1024作為測試圖像大小的指標(biāo):

          精度/指標(biāo)FP32INT8(PTQ)INT8(QAT)

          精度不降反升(可以由于之前FP32的模型訓(xùn)練不夠徹底,finetune后精度又提了一些),還是值得一試的。

          目前我們常用的Pytorch當(dāng)然也是支持QAT量化的。

          不過Pytorch量化訓(xùn)練出來的模型,官方目前只支持CPU。即X86和Arm,具有INT8指令集的CPU可以使用:

          • x86 CPUs with AVX2 support or higher (without AVX2 some operations have inefficient implementations)

          • ARM CPUs (typically found in mobile/embedded devices)

          已有很多例子。

          那么GPU支持嗎?

          Pytorch官方不支持,但是NVIDIA支持。

          NVIDIA官方提供了Pytorch的量化訓(xùn)練框架包,目前雖然不是很完善,但是已經(jīng)可以正常使用:

          • NVIDIA官方提供的pytorch-quantization-toolkit

          利用這個(gè)量化訓(xùn)練后的模型可以導(dǎo)出為ONNX(需要設(shè)置opset為13),導(dǎo)出的ONNX會(huì)有QuantizeLinear和DequantizeLinear兩個(gè)算子:

          帶有QuantizeLinearDequantizeLinear算子的ONNX可以通過TensorRT8加載,然后就可以進(jìn)行量化推理:

          Added two new layers to the API: IQuantizeLayer and IDequantizeLayer which can be used to explicitly specify the precision of operations and data buffers. ONNX’s QuantizeLinear and DequantizeLinear operators are mapped to these new layers which enables the support for networks trained using Quantization-Aware Training (QAT) methodology. For more information, refer to the Explicit-Quantization, IQuantizeLayer, and IDequantizeLayer sections in the TensorRT Developer Guide and Q/DQ Fusion in the Best Practices For TensorRT Performance guide.

          而TensorRT8版本以下的不支持直接載入,需要手動(dòng)去賦值MAX閾值。


          5

          ?AI部署流程


          假設(shè)我們的模型是使用Pytorch訓(xùn)練的,部署的平臺是英偉達(dá)的GPU服務(wù)器。

          訓(xùn)練好的模型通過以下幾種方式轉(zhuǎn)換:

          • Pytorch->ONNX->trt?onnx2trt

          • Pytorch->trt?torch2trt

          • Pytorch->torchscipt->trt?trtorch

          其中onnx2trt最成熟,torch2trt比較靈活,而trtorch不是很好用。三種轉(zhuǎn)化方式各有利弊,基本可以覆蓋90%常見的主流模型。

          遇到不支持的操作,首先考慮是否可以通過其他pytorch算子代替。如果不行,可以考慮TensorRT插件、或者模型拆分為TensorRT+libtorch的結(jié)構(gòu)互相彌補(bǔ)。trtorch最新的commit支持了部分op運(yùn)行在TensorRT部分op運(yùn)行在libtorch,但還不是很完善,感興趣的小伙伴可以關(guān)注一下。

          常見的服務(wù)部署搭配:

          • triton server + TensorRT/libtorch

          • flask + Pytorch

          • Tensorflow Server


          本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。

          —THE END—
          瀏覽 115
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美三级黄色 | 99这里都是精品 | 国产精品www...xxc | 啪啪网网站 | 天堂AV中文在线 |