日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库

發(fā)布時(shí)間:2023/12/13 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
允中 發(fā)自 凹非寺
量子位 編輯 | 公眾號(hào) QbitAI

假如問在深度學(xué)習(xí)實(shí)踐中,最難的部分是什么?猜測80%的開發(fā)者都會(huì)說:

“當(dāng)然是調(diào)參啊。”

為什么難呢?因?yàn)檎{(diào)參就像廚師根據(jù)食材找到了料理配方,藥劑師根據(jù)藥材找到了藥方,充滿了玄幻色彩。

但是,掌握了調(diào)參,頂多算深度學(xué)習(xí)的絕學(xué)掌握了一半。而另一半就是“模型部署”。

模型部署有什么難的?舉個(gè)例子:前面這位大廚在培訓(xùn)學(xué)校,經(jīng)過各種訓(xùn)練掌握了很多料理配方,終于要到酒店上任了,卻發(fā)現(xiàn)酒店的廚房環(huán)境和訓(xùn)練時(shí)不一樣,就餐高峰時(shí)手忙腳亂,客戶等了1個(gè)小時(shí)還沒上菜,結(jié)果第一天上崗就被投訴了。

雖然比喻略有夸張,卻也道出了深度學(xué)習(xí)模型訓(xùn)練和推理部署的關(guān)系。

我們知道,深度學(xué)習(xí)一般分為訓(xùn)練和推理兩個(gè)部分,訓(xùn)練是神經(jīng)網(wǎng)絡(luò)“學(xué)習(xí)”的過程,主要關(guān)注如何搜索和求解模型參數(shù),發(fā)現(xiàn)訓(xùn)練數(shù)據(jù)中的規(guī)律。

有了訓(xùn)練好的模型之后,就要在線上環(huán)境中應(yīng)用模型,實(shí)現(xiàn)對未知數(shù)據(jù)做出預(yù)測,這個(gè)過程在AI領(lǐng)域叫做推理

在實(shí)際應(yīng)用中,推理階段可能會(huì)面臨和訓(xùn)練時(shí)完全不一樣的硬件環(huán)境,當(dāng)然也對應(yīng)著不一樣的計(jì)算性能要求。我們訓(xùn)練得到的模型,需要能在具體生產(chǎn)環(huán)境中正確、高效地實(shí)現(xiàn)推理功能,完成上線部署。

所以,當(dāng)我們千辛萬苦訓(xùn)練好模型,終于要上線了,但這個(gè)時(shí)候可能會(huì)遇到各種問題,比如:

  • 線上部署的硬件環(huán)境和訓(xùn)練時(shí)不同

  • 推理計(jì)算耗時(shí)太高, 可能造成服務(wù)不可用

  • 模型上的內(nèi)存占用過高無法上線

對工業(yè)級(jí)部署而言,要求的條件往往非常繁多而且苛刻,不是每個(gè)深度學(xué)習(xí)框架都對實(shí)際生產(chǎn)部署上能有良好的支持。一款對推理支持完善的的框架,會(huì)讓你的模型上線工作事半功倍。

飛槳作為源于產(chǎn)業(yè)實(shí)踐的深度學(xué)習(xí)框架,在推理部署能力上有特別深厚的積累和打磨,提供了性能強(qiáng)勁、上手簡單的服務(wù)器端推理庫Paddle Inference,幫助用戶擺脫各種上線部署的煩惱。

Paddle Inference是什么

飛槳框架的推理部署能力經(jīng)過多個(gè)版本的升級(jí)迭代,形成了完善的推理庫Paddle Inference。Paddle Inference功能特性豐富,性能優(yōu)異,針對不同平臺(tái)不同的應(yīng)用場景進(jìn)行了深度的適配優(yōu)化,做到高吞吐、低時(shí)延,保證了飛槳模型在服務(wù)器端即訓(xùn)即用,快速部署。

Paddle Inference的高性能實(shí)現(xiàn)

內(nèi)存/顯存復(fù)用提升服務(wù)吞吐量

在推理初始化階段,對模型中的OP輸出Tensor 進(jìn)行依賴分析,將兩兩互不依賴的Tensor在內(nèi)存/顯存空間上進(jìn)行復(fù)用,進(jìn)而增大計(jì)算并行量,提升服務(wù)吞吐量。

細(xì)粒度OP橫向縱向融合減少計(jì)算量

在推理初始化階段,按照已有的融合模式將模型中的多個(gè)OP融合成一個(gè)OP,減少了模型的計(jì)算量的同時(shí),也減少了 Kernel Launch的次數(shù),從而能提升推理性能。目前Paddle Inference支持的融合模式多達(dá)幾十個(gè)。

內(nèi)置高性能的CPU/GPU Kernel

內(nèi)置同Intel、Nvidia共同打造的高性能kernel,保證了模型推理高性能的執(zhí)行。

子圖集成TensorRT加快GPU推理速度

Paddle Inference采用子圖的形式集成TensorRT,針對GPU推理場景,TensorRT可對一些子圖進(jìn)行優(yōu)化,包括OP的橫向和縱向融合,過濾冗余的OP,并為OP自動(dòng)選擇最優(yōu)的kernel,加快推理速度。

子圖集成Paddle Lite輕量化推理引擎

Paddle Lite 是飛槳深度學(xué)習(xí)框架的一款輕量級(jí)、低框架開銷的推理引擎,除了在移動(dòng)端應(yīng)用外,還可以使用服務(wù)器進(jìn)行 Paddle Lite 推理。Paddle Inference采用子圖的形式集成 Paddle Lite,以方便用戶在服務(wù)器推理原有方式上稍加改動(dòng),即可開啟 Paddle Lite 的推理能力,得到更快的推理速度。并且,使用 Paddle Lite 可支持在百度昆侖等高性能AI芯片上執(zhí)行推理計(jì)算。

支持加載PaddleSlim量化壓縮后的模型

PaddleSlim是飛槳深度學(xué)習(xí)模型壓縮工具,Paddle Inference可聯(lián)動(dòng)PaddleSlim,支持加載量化、裁剪和蒸餾后的模型并部署,由此減小模型存儲(chǔ)空間、減少計(jì)算占用內(nèi)存、加快模型推理速度。其中在模型量化方面,Paddle Inference在X86 CPU上做了深度優(yōu)化,常見分類模型的單線程性能可提升近3倍,ERNIE模型的單線程性能可提升2.68倍。

【性能測一測】通過比較resnet50和bert模型的訓(xùn)練前向耗時(shí)和推理耗時(shí),可以觀測到Paddle Inference有顯著的加速效果。

說明:測試耗時(shí)的方法,使用相同的輸入數(shù)據(jù)先空跑1000次,循環(huán)運(yùn)行1000次,每次記錄模型運(yùn)行的耗時(shí),最后計(jì)算出模型運(yùn)行的平均耗時(shí)。

Paddle Inference的通用性

主流軟硬件環(huán)境兼容適配

支持服務(wù)器端X86 CPU、NVIDIA GPU芯片,兼容Linux/Mac/Windows系統(tǒng)。支持所有飛槳訓(xùn)練產(chǎn)出的模型,完全做到即訓(xùn)即用。

多語言環(huán)境豐富接口可靈活調(diào)用

支持C++, Python, C, Go和R語言API, 接口簡單靈活,20行代碼即可完成部署。對于其他語言,提供了ABI穩(wěn)定的C API, 用戶可以很方便地?cái)U(kuò)展。

Paddle Inference怎么用

下面我們一起來看看如何使用飛槳完成服務(wù)器端推理部署。

“一個(gè)函數(shù)”搞定模型保存

飛槳框架提供了一個(gè)內(nèi)置函數(shù) save_inference_model, 將模型保存為推理用的模型格式。save_inference_model可以根據(jù)推理需要的輸入和輸出, 對訓(xùn)練模型進(jìn)行剪枝, 去除和推理無關(guān)部分, 得到的模型相比訓(xùn)練時(shí)更加精簡, 適合進(jìn)一步優(yōu)化和部署。

from?paddle?import?fluid

place?=?fluid.CPUPlace()
executor?=?fluid.Executor(place)

image?=?fluid.data(name="image",?shape=[None,?28,?28],?dtype="float32")
label?=?fluid.data(name="label",?shape=[None,?1],?dtype="int64")

feeder?=?fluid.DataFeeder(feed_list=[image,?label],?place=place)
predict?=?fluid.layers.fc(input=image,?size=10,?act='softmax')

loss?=?fluid.layers.cross_entropy(input=predict,?label=label)
avg_loss?=?fluid.layers.mean(loss)

executor.run(fluid.default_startup_program())

#?保存模型到model目錄中,?只保存與輸入image和輸出與推理相關(guān)的部分網(wǎng)絡(luò)
fluid.io.save_inference_model("model",?feed_var_names=["image"],
????target_vars=[predict].?executor=executor)

“一個(gè)配置管理器”搞定部署設(shè)置

保存推理模型之后, 就可以使用推理庫了, Paddle Inference提供了 AnalysisConfig 用于管理推理部署的各種設(shè)置,比如設(shè)置在CPU還是GPU部署、加載模型路徑、開啟/關(guān)閉計(jì)算圖分析優(yōu)化、使用MKLDNN/TensorRT進(jìn)行部署的加速等,用戶可以根據(jù)自己的上線環(huán)境, 打開所需優(yōu)化配置。同時(shí),可配置采用zero copy的方式管理輸入和輸出, 推理執(zhí)行時(shí)可跳過feed op和fetch op,減少多余的數(shù)據(jù)拷貝,提高推理性能。

from?paddle.fluid.core?import?AnalysisConfig

#?創(chuàng)建配置對象
config?=?AnalysisConfig("./model")
#?配置采用zero?copy的方式
config.switch_use_feed_fetch_ops(False)
config.switch_specify_input_names(True)

“一個(gè)預(yù)測器”搞定高性能推理

定義好部署的配置后,就可以創(chuàng)建預(yù)測器了。Paddle Inference提供了多項(xiàng)圖優(yōu)化的方式,創(chuàng)建預(yù)測器時(shí)將會(huì)加載推理模型并自動(dòng)進(jìn)行圖優(yōu)化,以增強(qiáng)推理性能。

#?創(chuàng)建預(yù)測器
from?paddle.fluid.core?import?create_paddle_predictor
predictor?=?create_paddle_predictor(config)

創(chuàng)建好預(yù)測器之后,只需要傳入數(shù)據(jù)就可以運(yùn)行推理計(jì)算預(yù)測結(jié)果了。這里假設(shè)我們已經(jīng)將輸入數(shù)據(jù)讀入了一個(gè)numpy.ndarray數(shù)組中,飛槳提供了簡單易用的API來管理輸入和輸出。

#?獲取并傳入數(shù)據(jù)
input_names?=?predictor.get_input_names()
input_tensor?=?predictor.get_input_tensor(input_names[0])
input_tensor.copy_from_cpu(input_data.reshape([1,?28,?28]).astype("float32"))

#?運(yùn)行預(yù)測器,?這里將會(huì)執(zhí)行真正的預(yù)測
predictor.zero_copy_run()

#?輸出預(yù)測結(jié)果
ouput_names?=?predictor.get_output_names()
output_tensor?=?predictor.get_output_tensor(output_names[0])
output_data?=?output_tensor.copy_to_cpu()

接下來以一個(gè)完整的Python API的實(shí)例,來實(shí)踐一下使用飛槳部署模型的全流程。我們以在P4 GPU服務(wù)器上部署resnet模型為例。

  • (1)安裝PaddlePaddle。

可以參考官網(wǎng)下載并安裝PaddlePaddle。

  • (2)獲取模型。

wget?http://paddle-inference-dist.bj.bcebos.com/resnet50_model.tar.gz?&&?tar?-xzf?resnet50_model.tar.gz
  • (3)準(zhǔn)備模型部署代碼,并將代碼保存到infer_resnet.py文件中。

import?argparse
import?argparse
import?numpy?as?np
from?paddle.fluid.core?import?AnalysisConfig
from?paddle.fluid.core?import?create_paddle_predictor

def?main():???

????args?=?parse_args()

????#?設(shè)置AnalysisConfig
????config?=?set_config(args)

????#?創(chuàng)建PaddlePredictor
????predictor?=?create_paddle_predictor(config)

????#?獲取輸入的名稱
????input_names?=?predictor.get_input_names()
????input_tensor?=?predictor.get_input_tensor(input_names[0])

????#?設(shè)置輸入
????fake_input?=?np.random.randn(args.batch_size,?3,?318,?318).astype("float32")
????input_tensor.reshape([args.batch_size,?3,?318,?318])
????input_tensor.copy_from_cpu(fake_input)

????#?運(yùn)行predictor
????predictor.zero_copy_run()

????#?獲取輸出
????output_names?=?predictor.get_output_names()
????output_tensor?=?predictor.get_output_tensor(output_names[0])
????output_data?=?output_tensor.copy_to_cpu()?#?numpy.ndarray類型
????for?i?in?range(args.batch_size):
????????print(np.argmax(output_data[i]))

def?parse_args():

????#?模型路徑配置
????parser?=?argparse.ArgumentParser()
????parser.add_argument("--model_file",?type=str,?help="model?filename")
????parser.add_argument("--params_file",?type=str,?help="parameter?filename")
????parser.add_argument("--batch_size",?type=int,?default=1,?help="batch?size")

????return?parser.parse_args()

def?set_config(args):
????config?=?AnalysisConfig(args.model_file,?args.params_file)
????config.enable_use_gpu(100,?0)
????config.switch_use_feed_fetch_ops(False)
????config.switch_specify_input_names(True)
????return?config

if?__name__?==?"__main__":
main()
  • (4)執(zhí)行推理任務(wù)。

#?model為模型存儲(chǔ)路徑
python3?infer_resnet.py?--model_file=model/model?--params_file=model/params

以上就是使用Paddle Inference的Python API進(jìn)行模型部署的完整流程,可從官網(wǎng)獲取代碼。如果想了解C++部署,可以參考官網(wǎng)提供的C++示例。

Python示例:https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/python_infer_cn.html#id6

C++示例:https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/native_infer.html#a-name-c-c-a

Paddle Inference如何進(jìn)一步優(yōu)化性能?

到這里已經(jīng)完成一個(gè)基本的推理服務(wù),是否可以交差了?對于精益求精的開發(fā)者們來說顯然還不夠,飛槳還可通過下面這些方法,幫助用戶進(jìn)一步提高推理性能:

啟用MKLDNN加速CPU推理

在X86 CPU上, 若硬件支持, 可以打開DNNL (Deep Neural Network Library, 原名MKLDNN) 優(yōu)化, 這是一個(gè)Intel開源的高性能計(jì)算庫, 用于Intel架構(gòu)的處理器和圖形處理器上的神經(jīng)網(wǎng)絡(luò)優(yōu)化, 飛槳可自動(dòng)調(diào)用,只需要在配置選項(xiàng)中打開即可。

config.enable_mkldnn()

切換到GPU推理

若需要使用NVIDIA GPU,只需一行配置,就可自動(dòng)切換到GPU上。

#?在 GPU 0?上初始化 100 MB 顯存。這只是一個(gè)初始值,實(shí)際顯存可能會(huì)動(dòng)態(tài)變化。
config.enable_use_gpu(100,?0)

啟動(dòng)TensorRT加快GPU推理速度

TensorRT是一個(gè)高性能的深度學(xué)習(xí)推理加速庫,可為GPU上的深度學(xué)習(xí)推理應(yīng)用程序提供低延遲和高吞吐量的優(yōu)化服務(wù)。Paddle Inference采用子圖的形式對TensorRT 進(jìn)行了集成。在已經(jīng)配置使用 GPU 推理的基礎(chǔ)上, 只需要一行配置就可以開啟 Paddle TensorRT加速推理:

config.enable_tensorrt_engine(workspace_size=1?<30,
??????????????????????????????max_batch_size=1,
??????????????????????????????min_subgraph_size=3,
??????????????????????????????precision_mode=AnalysisConfig.Precision.Float32,
??????????????????????????????use_static=False,
??????????????????????????????use_calib_mode=False)

開啟Paddle Lite輕量化推理引擎

針對一些計(jì)算量較小,實(shí)際推理耗時(shí)很少的小模型,如果直接使用Paddle Inference,框架耗時(shí)可能與模型耗時(shí)在同一量級(jí),此時(shí)可選用Paddle Lite子圖的方式來運(yùn)行以減少框架耗時(shí)。Paddle Inference采用子圖的形式集成 Paddle Lite,只需要添加一行配置即可開啟 Paddle Lite 的推理加速引擎。

config.enable_lite_engine(precision_mode=AnalysisConfig.Precision.Float32)

飛槳在工業(yè)部署領(lǐng)域覆蓋哪些場景?

工業(yè)級(jí)部署可能面臨多樣化的部署環(huán)境,針對不同應(yīng)用場景,飛槳提供了三種推理部署方案:

  • Paddle Inference作為飛槳深度學(xué)習(xí)框架原生的高性能推理庫,可應(yīng)用于本地服務(wù)器端部署場景,做到即訓(xùn)即用。

  • 針對服務(wù)化部署場景,飛槳提供Paddle Serving部署方案。該場景將推理模塊作為遠(yuǎn)程調(diào)用服務(wù),客戶端發(fā)出請求,服務(wù)端返回推理結(jié)果。是云端部署必不可少的方案。

  • 針對移動(dòng)端、嵌入式芯片等端側(cè)硬件部署的場景,飛槳提供Paddle Lite部署方案,滿足高性能、輕量化的部署需求。

更多介紹可訪問如下飛槳項(xiàng)目地址,一起探索飛槳強(qiáng)大的工業(yè)部署實(shí)踐能力。

相關(guān)資料

飛槳Paddle Inference項(xiàng)目地址:https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/inference

飛槳Paddle Lite項(xiàng)目地址:https://github.com/PaddlePaddle/Paddle-Lite

飛槳Paddle Serving項(xiàng)目地址:https://github.com/PaddlePaddle/Serving

飛槳PaddleSlim項(xiàng)目地址:https://github.com/PaddlePaddle/PaddleSlim

如果您加入官方QQ群,您將遇上大批志同道合的深度學(xué)習(xí)同學(xué)。

官方QQ群:703252161。

如果您想詳細(xì)了解更多飛槳的相關(guān)內(nèi)容,請參閱以下文檔。

官網(wǎng)地址:https://www.paddlepaddle.org.cn

飛槳核心框架項(xiàng)目地址:

GitHub:?https://github.com/PaddlePaddle/Paddle

Gitee:?https://gitee.com/paddlepaddle/Paddle

高能直播 | 云體驗(yàn)無人車試乘+頂級(jí)技術(shù)專家拆解仿真系統(tǒng)

量子位?QbitAI · 頭條號(hào)簽約作者

?'?' ? 追蹤AI技術(shù)和產(chǎn)品新動(dòng)態(tài)

喜歡就點(diǎn)「在看」吧 !

總結(jié)

以上是生活随笔為你收集整理的output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。