百度飛槳的 Paddle Serving 可以實現服務器端快速部署,最近,隨着飛槳更新到 1.7 版本,Paddle Serving 也有了新變化。更新後的 Paddle Serving 有哪些改進?能給用戶帶來多大程度的生產力提高?本文將帶你一睹爲快。
古人云:行百里者半九十。相信在深度學習領域中,很多作算法的小夥伴都會對這句話產生共鳴。辛辛苦苦搭建好網絡,望眼欲穿得訓練調試好模型,等到最後要部署,面對紛繁複雜的實際部署環境時,才發現原來終極大魔王在這裏!python
固然這個魔王不會喊打喊殺,但他會給你出難題,情景多是這樣的:git
在此緊要關頭,是否有什麼捷徑幫助小夥伴順利通關呢?這個真的能夠有,那就是國內最先開源開放、功能完備的開源深度學習平臺飛槳所提供的 Paddle Serving 功能。github
Paddle Serving 是飛槳的服務化部署框架,長期目標就是爲人工智能落地的最後一千米提供愈來愈專業、可靠、易用的服務。隨着飛槳開源框架推出最新的 1.7 版本,Paddle Serving 的最新版本也閃亮登場。有了它,和魔王的對話情景就要變一變啦!算法
Paddle Serving 真的那麼好嗎?固然!Paddle Serving 秉承模型即服務(Model As A Service,MAAS)的理念,全面打通並自動化飛槳訓練框架與 Paddle Serving 的銜接流程,讓用戶在使用飛槳成功完成模型訓練的那一刻,收穫的再也不只是模型,而是同時擁有了該模型的推理服務,使用戶可以在幾分鐘內將模型轉化爲一個能夠在服務器端部署的遠程服務。總的來講,Paddle Serving 具備以下四大特色:json
圖 1 Paddle Serving 工做流程示意圖後端
千言萬語不如一個行動,具體 Paddle Serving 有哪些閃亮操做,我們且往下看!服務器
模型即服務:網絡
一行命令啓動推理服務併發
所謂模型即服務,是指成功訓練出來的模型便可直接被用來部署上線一個推理業務。在這方面飛槳提供了專門的 API 接口用於將訓練成功的模型保存成指定的格式,而後無需編寫其餘代碼,直接使用 Paddle Serving 功能中的一條命令便可將這個模型部署到服務器上,造成線上推理業務。具體如何操做,請看下面的示例。app
本例將使用房價預測模型來演示操做方法,下載及解壓方式以下所示,下載解壓後模型及相關配置文件保存在「uci_housing」文件夾中。
wget --no-check-certificate https://paddle-serving.bj.bcebos.com/uci_housing.tar.gz tar -xzf uci_housing.tar.gz
做爲服務端計算機環境中須要提早安裝有 Paddle Serving 功能的 paddle_serving_server 模塊,若是沒有安裝,則能夠根據硬件環境使用選擇其中一行命令安裝。
pip install paddle_serving_server //在CPU環境上安裝paddle_serving_server pip install paddke_serving_server_gpu //在GPU環境上安裝paddle_serving_server
下面見證奇蹟的時候到了!請看一鍵啓動模型推理服務:
python -m paddle_serving_server.serve --model uci_housing_model/ --thread 10 --port 9292 --name uci
其中各個參數的含義以下:
當返回以下信息時則表示服務端啓動成功。
* Running onhttp://0.0.0.0:9292/(Press CTRL+C to quit)
線上推理服務部署成功後,本例中的 url 格式爲「http://127.0.0.1:9292/uci/prediction」。須要使用推理服務的用戶能夠經過 HTTP 協議將輸入數據以以下報文的格式發送給服務端。服務端在計算出結果後,會將推理出的價格返回給用戶。
curl -H "Content-Type:application/json" -X POST -d '{"x": [0.0137, -0.1136, 0.2553, -0.0692, 0.0582, -0.0727, -0.1583, -0.0584, 0.6283, 0.4919, 0.1856, 0.0795, -0.0332], "fetch":["price"]}'http://127.0.0.1:9292/uci/prediction
模型的保存方法請參見:
https://github.com/PaddlePaddle/Serving/blob/a4d478d79e120229572bcd56a001688bd7e07b94/doc/SAVE.md
上面的操做方法適用於一些不須要較爲複雜的數據預處理過程的普通模型,也就是輸入數據能夠直接被使用進行推理計算的模型。那麼對於一些須要預處理的模型,Paddle Serving 有應對之法麼?其實很簡單。
通常我們本身搞不定的事情會怎麼處理呢?找朋友幫忙唄,一個好漢三個幫嘛!咱們能夠爲服務端再配個朋友——客戶端。讓客戶端將輸入數據預處理爲服務端能夠讀取的形式。
可能有人會問:「多了一個客戶端,那操做會不會變得複雜呢?」嚴格的說,只是多了幾個步驟,相信 10 分鐘仍是能夠搞定的!下面咱們就以 Bert As Service 業務爲例,看看如何在十分鐘以內將它部署上線!
十分鐘構建 Bert As Service
Bert As Service 是 Github 社區比較火爆的代碼庫,其目標是給定輸入一個句子,推理服務能夠將句子表示成一個語義向量返回給客戶端。Bert 模型是目前 NLP 領域比較熱門的模型,在多種公開的 NLP 任務上都取得了很好的效果。若是使用 Bert 模型計算出的語義向量做爲其餘 NLP 模型的輸入,這將對提高模型的表現有很大的幫助。因此能夠想象若是你成功部署一臺能夠對外提供 Bert As Service 服務的服務器,那麼你必定會很快成爲社區中最靚的仔!。
爲了實現這個目標,你僅須要四個步驟就可使用 Paddle Serving 花十分鐘部署上線一個這樣的服務。
Paddle Serving 支持基於飛槳訓練的各類模型,並經過指定模型的輸入和輸出變量來保存可服務模型。爲了便於演示,咱們從飛槳的預訓練模型應用工具 PaddleHub 中加載一個已經訓練好的 Bert 中文模型「bert_chinese_L-12_H-768_A-12」,並利用以下代碼將該模型及相關配置文件保存爲能夠用於部署服務的格式。其中服務端和客戶端的配置分別放在「bert_seq20_model」和「bert_seq20_client」文件夾中。
import paddlehub as hub model_name = "bert_chinese_L-12_H-768_A-12" #獲取模型文件 module = hub.Module(model_name) #獲取模型的輸入輸出信息以及program inputs, outputs, program = module.context( trainable=True, max_seq_len=20) #將輸入輸出的名稱與模型中的輸入輸出變量一一映射 feed_keys = ["input_ids", "position_ids", "segment_ids", "input_mask", ] fetch_keys = ["pooled_output", "sequence_output"] feed_dict = dict(zip(feed_keys, [inputs[x] for x in feed_keys])) fetch_dict = dict(zip(fetch_keys, [outputs[x] for x in fetch_keys])) #保存serving須要的模型與配置文件,參數1是server端模型與配置文件保存的目錄,參數2是client端配置文件保存的目錄,參數3是輸入dict,參數4是輸出dict,參數5是模型的program import paddle_serving_client.io as serving_io serving_io.save_model("bert_seq20_model", "bert_seq20_client", feed_dict, fetch_dict, program)
在服務端的計算機上使用以下命令啓動服務,其中 gpu_ids 表示 GPU 索引號。
python -m paddle_serving_server_gpu.serve --model bert_seq20_model --thread 10 --port 9292 --gpu_ids 0
當返回以下信息時則表示服務端啓動成功。
Server[baidu::paddle_serving::predictor::general_model:: GeneralModelServiceImpl] is serving on port=9292.
Paddle Serving 擁有針對多個經典數據集的數據預處理模塊,對於本示例的中文 Bert 語義表示的計算,咱們採用 paddle_serving_app 下的 ChineseBertReader 類對數據做預處理操做,這樣開發者能夠很容易得到一個原始中文句子所對應的語義向量,用於做爲推理服務模型的輸入。安裝 paddle_serving_app 的方法以下所示。
pip install paddle_serving_app
import os import sys from paddle_serving_client import Client from paddle_serving_app import ChineseBertReader #定義數據預處理reader reader = ChineseBertReader() #指定要獲取的預測結果 fetch = ["pooled_output"] #指定server端地址 endpoint_list = ["127.0.0.1:9292"] #定義client類 client = Client() #加載client配置文件 client.load_client_config("bert_seq20_client/serving_client_conf.prototxt") #鏈接server端 client.connect(endpoint_list) #從標準輸入讀取數據,發送給server端,並打印結果 for line in sys.stdin: feed_dict = reader.process(line) result = client.predict(feed=feed_dict, fetch=fetch) print(result)
將須要推理中文句子製做成 txt 文件,例如 data.txt。而後運行腳本訪問服務器,便可獲取推理結果。
cat data.txt | python bert_client.py
Bert As Service 示例相關的腳本請參見:
https://github.com/PaddlePaddle/Serving/tree/develop/python/examples/bert
部署後吞吐性能大幅領先
功能怎麼樣,數聽說了算!吞吐性能是對相同線上服務部署質量的重要評價指標。在 4 塊 NVIDIA Tesla V100 上對基於 Paddle Serving 部署的 Bert As Service 進行性能測試,並與基於業界同類最優產品實現的 Bert As Service 作比對。在採用了相同的 batch size 和併發數的條件下,其比對數據結果如圖 2 所示,使用 Paddle Serving 部署的服務的吞吐性能大幅領先,batch size 爲 128 的請況下,吞吐率超出 58.3%!
圖 2 Paddle Serving 性能壓力測試吞吐量示意圖
此外,以下表所示,飛槳的工程師們還提供了多個其它任務領域的模型推理服務示例以及性能分析的工具。歡迎各位小夥伴根據本身的需求下載使用。
性能可視化工具 Timeline
Paddle Serving 支持性能可視化工具 Timeline,該工具能夠查看客戶端啓動後各個進程的各階段 timeline。以 Bert As Service 服務爲例,Timeline 可視化後的結果如圖 3 所示,其中 bert_pre 表明客戶端的數據預處理階段,client_infer 表明客戶端完成預測請求的發送和接收結果的階段,每一個進程的第二行展現的是服務端各個算子的 timeline。
經過 Timeline 用戶能夠很容易發現預估服務在各個環節的耗時,有的放矢的優化預估流程。針對 Bert 這樣的熱門模型,在接下來的版本中,Paddle Serving 還會在 paddle_serving_app 中持續開放新的高性能預處理 reader 接口。
圖 3 Timeline 性能可視化工具界面效果圖
Timeline 的使用方法請參見:
https://github.com/PaddlePaddle/Serving/tree/develop/python/examples/util
Paddle Serving 是面向社區用戶的核心訴求進行打造,在易用性方面相比此前的版本有了大幅度提高,用戶甚至不須要掌握多深厚的飛槳相關知識便可使用 Paddle Serving 部署模型推理服務,極大的提高了部署效率。Paddle Serving 會在接下來的版本中繼續下降用戶的使用門檻,提供更多語言類型的客戶端,以及 Kubernetes 部署的相關組件,開放更多可以開箱即用的模型,敬請關注!
若是您加入官方 QQ 羣,您將趕上大批志同道合的深度學習同窗。官方 QQ 羣:703252161。
若是您想詳細瞭解更多飛槳的相關內容,請參閱如下文檔。