output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
允中 發自 凹非寺
量子位 編輯 | 公眾號 QbitAI
假如問在深度學習實踐中,最難的部分是什么?猜測80%的開發者都會說:
“當然是調參啊。”
為什么難呢?因為調參就像廚師根據食材找到了料理配方,藥劑師根據藥材找到了藥方,充滿了玄幻色彩。
但是,掌握了調參,頂多算深度學習的絕學掌握了一半。而另一半就是“模型部署”。
模型部署有什么難的?舉個例子:前面這位大廚在培訓學校,經過各種訓練掌握了很多料理配方,終于要到酒店上任了,卻發現酒店的廚房環境和訓練時不一樣,就餐高峰時手忙腳亂,客戶等了1個小時還沒上菜,結果第一天上崗就被投訴了。
雖然比喻略有夸張,卻也道出了深度學習模型訓練和推理部署的關系。
我們知道,深度學習一般分為訓練和推理兩個部分,訓練是神經網絡“學習”的過程,主要關注如何搜索和求解模型參數,發現訓練數據中的規律。
有了訓練好的模型之后,就要在線上環境中應用模型,實現對未知數據做出預測,這個過程在AI領域叫做推理。
在實際應用中,推理階段可能會面臨和訓練時完全不一樣的硬件環境,當然也對應著不一樣的計算性能要求。我們訓練得到的模型,需要能在具體生產環境中正確、高效地實現推理功能,完成上線部署。
所以,當我們千辛萬苦訓練好模型,終于要上線了,但這個時候可能會遇到各種問題,比如:
- 線上部署的硬件環境和訓練時不同 
- 推理計算耗時太高, 可能造成服務不可用 
- 模型上的內存占用過高無法上線 
對工業級部署而言,要求的條件往往非常繁多而且苛刻,不是每個深度學習框架都對實際生產部署上能有良好的支持。一款對推理支持完善的的框架,會讓你的模型上線工作事半功倍。
飛槳作為源于產業實踐的深度學習框架,在推理部署能力上有特別深厚的積累和打磨,提供了性能強勁、上手簡單的服務器端推理庫Paddle Inference,幫助用戶擺脫各種上線部署的煩惱。
Paddle Inference是什么
飛槳框架的推理部署能力經過多個版本的升級迭代,形成了完善的推理庫Paddle Inference。Paddle Inference功能特性豐富,性能優異,針對不同平臺不同的應用場景進行了深度的適配優化,做到高吞吐、低時延,保證了飛槳模型在服務器端即訓即用,快速部署。
Paddle Inference的高性能實現
內存/顯存復用提升服務吞吐量
在推理初始化階段,對模型中的OP輸出Tensor 進行依賴分析,將兩兩互不依賴的Tensor在內存/顯存空間上進行復用,進而增大計算并行量,提升服務吞吐量。
細粒度OP橫向縱向融合減少計算量
在推理初始化階段,按照已有的融合模式將模型中的多個OP融合成一個OP,減少了模型的計算量的同時,也減少了 Kernel Launch的次數,從而能提升推理性能。目前Paddle Inference支持的融合模式多達幾十個。
內置高性能的CPU/GPU Kernel
內置同Intel、Nvidia共同打造的高性能kernel,保證了模型推理高性能的執行。
子圖集成TensorRT加快GPU推理速度
Paddle Inference采用子圖的形式集成TensorRT,針對GPU推理場景,TensorRT可對一些子圖進行優化,包括OP的橫向和縱向融合,過濾冗余的OP,并為OP自動選擇最優的kernel,加快推理速度。
子圖集成Paddle Lite輕量化推理引擎
Paddle Lite 是飛槳深度學習框架的一款輕量級、低框架開銷的推理引擎,除了在移動端應用外,還可以使用服務器進行 Paddle Lite 推理。Paddle Inference采用子圖的形式集成 Paddle Lite,以方便用戶在服務器推理原有方式上稍加改動,即可開啟 Paddle Lite 的推理能力,得到更快的推理速度。并且,使用 Paddle Lite 可支持在百度昆侖等高性能AI芯片上執行推理計算。
支持加載PaddleSlim量化壓縮后的模型
PaddleSlim是飛槳深度學習模型壓縮工具,Paddle Inference可聯動PaddleSlim,支持加載量化、裁剪和蒸餾后的模型并部署,由此減小模型存儲空間、減少計算占用內存、加快模型推理速度。其中在模型量化方面,Paddle Inference在X86 CPU上做了深度優化,常見分類模型的單線程性能可提升近3倍,ERNIE模型的單線程性能可提升2.68倍。
【性能測一測】通過比較resnet50和bert模型的訓練前向耗時和推理耗時,可以觀測到Paddle Inference有顯著的加速效果。
說明:測試耗時的方法,使用相同的輸入數據先空跑1000次,循環運行1000次,每次記錄模型運行的耗時,最后計算出模型運行的平均耗時。
Paddle Inference的通用性
主流軟硬件環境兼容適配
支持服務器端X86 CPU、NVIDIA GPU芯片,兼容Linux/Mac/Windows系統。支持所有飛槳訓練產出的模型,完全做到即訓即用。
多語言環境豐富接口可靈活調用
支持C++, Python, C, Go和R語言API, 接口簡單靈活,20行代碼即可完成部署。對于其他語言,提供了ABI穩定的C API, 用戶可以很方便地擴展。
Paddle Inference怎么用
下面我們一起來看看如何使用飛槳完成服務器端推理部署。
“一個函數”搞定模型保存
飛槳框架提供了一個內置函數 save_inference_model, 將模型保存為推理用的模型格式。save_inference_model可以根據推理需要的輸入和輸出, 對訓練模型進行剪枝, 去除和推理無關部分, 得到的模型相比訓練時更加精簡, 適合進一步優化和部署。
from?paddle?import?fluidplace?=?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和輸出與推理相關的部分網絡
fluid.io.save_inference_model("model",?feed_var_names=["image"],
????target_vars=[predict].?executor=executor)
“一個配置管理器”搞定部署設置
保存推理模型之后, 就可以使用推理庫了, Paddle Inference提供了 AnalysisConfig 用于管理推理部署的各種設置,比如設置在CPU還是GPU部署、加載模型路徑、開啟/關閉計算圖分析優化、使用MKLDNN/TensorRT進行部署的加速等,用戶可以根據自己的上線環境, 打開所需優化配置。同時,可配置采用zero copy的方式管理輸入和輸出, 推理執行時可跳過feed op和fetch op,減少多余的數據拷貝,提高推理性能。
from?paddle.fluid.core?import?AnalysisConfig#?創建配置對象
config?=?AnalysisConfig("./model")
#?配置采用zero?copy的方式
config.switch_use_feed_fetch_ops(False)
config.switch_specify_input_names(True)
“一個預測器”搞定高性能推理
定義好部署的配置后,就可以創建預測器了。Paddle Inference提供了多項圖優化的方式,創建預測器時將會加載推理模型并自動進行圖優化,以增強推理性能。
#?創建預測器from?paddle.fluid.core?import?create_paddle_predictor
predictor?=?create_paddle_predictor(config)
創建好預測器之后,只需要傳入數據就可以運行推理計算預測結果了。這里假設我們已經將輸入數據讀入了一個numpy.ndarray數組中,飛槳提供了簡單易用的API來管理輸入和輸出。
#?獲取并傳入數據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"))
#?運行預測器,?這里將會執行真正的預測
predictor.zero_copy_run()
#?輸出預測結果
ouput_names?=?predictor.get_output_names()
output_tensor?=?predictor.get_output_tensor(output_names[0])
output_data?=?output_tensor.copy_to_cpu()
接下來以一個完整的Python API的實例,來實踐一下使用飛槳部署模型的全流程。我們以在P4 GPU服務器上部署resnet模型為例。
- (1)安裝PaddlePaddle。 
可以參考官網下載并安裝PaddlePaddle。
- (2)獲取模型。 
- (3)準備模型部署代碼,并將代碼保存到infer_resnet.py文件中。 
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()
????#?設置AnalysisConfig
????config?=?set_config(args)
????#?創建PaddlePredictor
????predictor?=?create_paddle_predictor(config)
????#?獲取輸入的名稱
????input_names?=?predictor.get_input_names()
????input_tensor?=?predictor.get_input_tensor(input_names[0])
????#?設置輸入
????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)
????#?運行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)執行推理任務。 
python3?infer_resnet.py?--model_file=model/model?--params_file=model/params
以上就是使用Paddle Inference的Python API進行模型部署的完整流程,可從官網獲取代碼。如果想了解C++部署,可以參考官網提供的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如何進一步優化性能?
到這里已經完成一個基本的推理服務,是否可以交差了?對于精益求精的開發者們來說顯然還不夠,飛槳還可通過下面這些方法,幫助用戶進一步提高推理性能:
啟用MKLDNN加速CPU推理
在X86 CPU上, 若硬件支持, 可以打開DNNL (Deep Neural Network Library, 原名MKLDNN) 優化, 這是一個Intel開源的高性能計算庫, 用于Intel架構的處理器和圖形處理器上的神經網絡優化, 飛槳可自動調用,只需要在配置選項中打開即可。
config.enable_mkldnn()切換到GPU推理
若需要使用NVIDIA GPU,只需一行配置,就可自動切換到GPU上。
#?在 GPU 0?上初始化 100 MB 顯存。這只是一個初始值,實際顯存可能會動態變化。config.enable_use_gpu(100,?0)
啟動TensorRT加快GPU推理速度
TensorRT是一個高性能的深度學習推理加速庫,可為GPU上的深度學習推理應用程序提供低延遲和高吞吐量的優化服務。Paddle Inference采用子圖的形式對TensorRT 進行了集成。在已經配置使用 GPU 推理的基礎上, 只需要一行配置就可以開啟 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輕量化推理引擎
針對一些計算量較小,實際推理耗時很少的小模型,如果直接使用Paddle Inference,框架耗時可能與模型耗時在同一量級,此時可選用Paddle Lite子圖的方式來運行以減少框架耗時。Paddle Inference采用子圖的形式集成 Paddle Lite,只需要添加一行配置即可開啟 Paddle Lite 的推理加速引擎。
config.enable_lite_engine(precision_mode=AnalysisConfig.Precision.Float32)飛槳在工業部署領域覆蓋哪些場景?
工業級部署可能面臨多樣化的部署環境,針對不同應用場景,飛槳提供了三種推理部署方案:
- Paddle Inference作為飛槳深度學習框架原生的高性能推理庫,可應用于本地服務器端部署場景,做到即訓即用。 
- 針對服務化部署場景,飛槳提供Paddle Serving部署方案。該場景將推理模塊作為遠程調用服務,客戶端發出請求,服務端返回推理結果。是云端部署必不可少的方案。 
- 針對移動端、嵌入式芯片等端側硬件部署的場景,飛槳提供Paddle Lite部署方案,滿足高性能、輕量化的部署需求。 
更多介紹可訪問如下飛槳項目地址,一起探索飛槳強大的工業部署實踐能力。
相關資料
飛槳Paddle Inference項目地址:https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/inference
飛槳Paddle Lite項目地址:https://github.com/PaddlePaddle/Paddle-Lite
飛槳Paddle Serving項目地址:https://github.com/PaddlePaddle/Serving
飛槳PaddleSlim項目地址:https://github.com/PaddlePaddle/PaddleSlim
如果您加入官方QQ群,您將遇上大批志同道合的深度學習同學。
官方QQ群:703252161。
如果您想詳細了解更多飛槳的相關內容,請參閱以下文檔。
官網地址:https://www.paddlepaddle.org.cn
飛槳核心框架項目地址:
GitHub:?https://github.com/PaddlePaddle/Paddle
Gitee:?https://gitee.com/paddlepaddle/Paddle
— 完 —
高能直播 | 云體驗無人車試乘+頂級技術專家拆解仿真系統
量子位?QbitAI · 頭條號簽約作者
?'?' ? 追蹤AI技術和產品新動態
喜歡就點「在看」吧 !
總結
以上是生活随笔為你收集整理的output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python xpath定位元素方法_P
- 下一篇: ArcGIS制图之Subset工具点抽稀
