一、深度學(xué)習(xí)的部署流程
步驟1:確定部署環(huán)境u?有沒(méi)有GPU?具體GPU型號(hào)是什么?u?具體什么操作系統(tǒng)?可以聯(lián)網(wǎng)部署么?u?具體CPU和內(nèi)存是多大?u?具體部署方法是什么?編程環(huán)境是什么?
步驟2:確定部署要求u?最長(zhǎng)響應(yīng)時(shí)間多少?u?平均響應(yīng)時(shí)間多少?u?最大并發(fā)量多少?u?模型最大權(quán)重多少?
步驟3:實(shí)施模型部署我纪,包括安裝壹将、打包和驗(yàn)證;
GPU部署:利用CUDA加速;
CPU部署:利用CPU完成計(jì)算;
服務(wù)部署:把模型調(diào)用過(guò)程封裝為HTTP或GRPC服務(wù);
本地部署:將模型部署到設(shè)備本地贪薪,直接進(jìn)行調(diào)用;
Python語(yǔ)言部署:p C++語(yǔ)言部署
---------------------------------
部署方法1:基于Python的本地部署高氮,將模型權(quán)重導(dǎo)出,并使用Python加載進(jìn)行預(yù)測(cè)撒汉。
適用場(chǎng)景:簡(jiǎn)單的Demo,或者桌面GUI應(yīng)用;
p 部署方法2:基于服務(wù)器的GPU部署巢钓,需要利用服務(wù)器GPU進(jìn)行加速病苗,并完成遠(yuǎn)程調(diào)用;
適用場(chǎng)景:大多數(shù)API調(diào)用場(chǎng)景;
p 部署方法3:基于服務(wù)器的CPU部署,并完成遠(yuǎn)程調(diào)用;
適用場(chǎng)景:大多數(shù)API調(diào)用場(chǎng)景;
p 部署方法4:基于移動(dòng)端/嵌入式設(shè)備症汹,在移動(dòng)端完成本地模型調(diào)用;
適用場(chǎng)景:現(xiàn)有的智能手機(jī)設(shè)備等場(chǎng)景;
---------------------------------
模型參數(shù)量:模型權(quán)重大小;
模型計(jì)算量:FLOPs(浮點(diǎn)運(yùn)算數(shù))
模型精度:
模型環(huán)境:所依賴(lài)的環(huán)境
二硫朦、深度學(xué)習(xí)模型加速和壓縮方法
權(quán)重冗余:裁剪、分解背镇、蒸餾;
數(shù)值冗余:量化;
------------------------------
裁剪(Pruning):去掉不重要的參數(shù)
方法1:在參數(shù)loss中加入L1咬展,讓權(quán)重稀疏化;
方法2:考慮參數(shù)對(duì)loss的影響,根據(jù)導(dǎo)數(shù)衡量重要性;
方法3:考慮到參數(shù)對(duì)后續(xù)層的影響;
方法4:計(jì)算參數(shù)相關(guān)性;
------------------------------
分解(Low-rank factorization):施加低秩約束的方式稀疏化卷積核矩陣
方法1:將參數(shù)矩陣進(jìn)行SVD分解;
方法2:通過(guò)聚類(lèi)方法壓縮矩陣;
優(yōu)點(diǎn):適合模型壓縮;
缺點(diǎn):計(jì)算成本很高瞒斩,現(xiàn)在已經(jīng)很少使用;
------------------------------
量化(quantization):用較低位寬表示典型的 32 位浮點(diǎn)網(wǎng)絡(luò)參數(shù)
方法1:二值量化破婆,將權(quán)值矩陣中的單精度浮點(diǎn)數(shù)用兩個(gè)值來(lái)表示;
方法2:多值量化,使用8big或16bit定點(diǎn)數(shù)來(lái)表示;
------------------------------
蒸餾(Knowledge distillation):將深度和寬度網(wǎng)絡(luò)壓縮成較淺的網(wǎng)絡(luò)胸囱,其中壓縮模型模擬了
復(fù)雜模型所學(xué)習(xí)的函數(shù)祷舀。
三、GPU/CPU部署方法
GPU環(huán)境:如何充分利用GPU完成加速;
步驟1:導(dǎo)出深度學(xué)習(xí)為ONNX格式;
步驟2:模型參數(shù)裁剪;
步驟3:TensorRT參數(shù)量化烹笔,轉(zhuǎn)換;
------------------------------
CPU環(huán)境:如何充分利用多核CPU完成加速;
步驟1:模型參數(shù)裁剪;
步驟2:利用MKL-DNN或OpenVINO完成加速;
MKL/MKL-DNN
Intel MKL(Intel Math Kernel Library)裳扯,英特爾數(shù)學(xué)核心函數(shù)庫(kù),是一套高度優(yōu)化谤职、線(xiàn)程安全
的數(shù)學(xué)例程饰豺、函數(shù),面向高性能的工程柬帕、科學(xué)與財(cái)務(wù)應(yīng)用哟忍。提供了線(xiàn)性代數(shù)、快速傅立葉轉(zhuǎn)換陷寝、
矢量數(shù)學(xué)與隨機(jī)號(hào)碼生成器支持。
OpenVINO
OpenVINO是英特爾推出的一款全面的工具套件其馏,可以兼容各種開(kāi)源框架訓(xùn)練好的模型凤跑,擁有算法模
型上線(xiàn)部署的各種能力。
------------------------------
TFLite:TensorFlow Lite 是一種用于設(shè)備端推斷的開(kāi)源深度學(xué)習(xí)框架叛复。
------------------------------
TensorFlow Serving
是一個(gè)適用于機(jī)器學(xué)習(xí)模型的靈活仔引、高性能應(yīng)用系統(tǒng),專(zhuān)為生產(chǎn)環(huán)境而設(shè)計(jì)褐奥。
模型的端到端轉(zhuǎn)換包含tensorflow版本和pytorch版本的實(shí)踐
補(bǔ)充:
opencv也是可以來(lái)進(jìn)行模型的部署的
gRPC 是可以在任何環(huán)境中運(yùn)行的現(xiàn)代開(kāi)源高性能 RPC 框架咖耘。它可以通過(guò)可插拔的支持來(lái)有效地連接數(shù)據(jù)中心內(nèi)和跨數(shù)據(jù)中心的服務(wù),以實(shí)現(xiàn)負(fù)載平衡撬码,跟蹤儿倒,運(yùn)行狀況檢查和身份驗(yàn)證。它也適用于分布式計(jì)算的最后一英里,以將設(shè)備夫否,移動(dòng)應(yīng)用程序和瀏覽器連接到后端服務(wù)彻犁。
參考文章:
https://zhuanlan.zhihu.com/p/46591057
https://zhuanlan.zhihu.com/p/58182172 Int8量化
https://github.com/tensorflow/tensorrt TensorRT的代碼TF版本
https://github.com/NVIDIA-AI-IOT/torch2trt pytorch版本
https://www.tensorflow.org/lite/examples/bert_qa/overview?hl=zh-cn CV&NLP的常見(jiàn)任務(wù)執(zhí)行TensorFlow Lite
https://github.com/tensorflow/serving 生產(chǎn)環(huán)境的serving部署
https://pytorch.org/tutorials/intermediate/pruning_tutorial.html? pruning_tutorial
https://www.tensorflow.org/model_optimization/guide/quantization/post_training 量化
https://docs.opencv.org/4.5.2/dc/d70/pytorch_cls_tutorial_dnn_conversion.html opencv進(jìn)行模型的部署
https://software.intel.com/content/www/us/en/develop/articles/intel-optimization-for-tensorflow-installation-guide.html intel
http://doc.oschina.net/grpc 開(kāi)源中國(guó)組織翻譯的《gRPC 官方文檔中文版》