機器之心發佈

機器之心編輯部

百度飛槳的 Paddle Serving 能夠實現服務器端快速部署,最近,隨着飛槳更新到 1.7 版本,Paddle Serving 也有了新變化。更新後的 Paddle Serving 有哪些改進?能給用戶帶來多大程度的生產力提升?本文將帶你一睹爲快。

古人云:行百里者半九十。相信在深度學習領域中,不少做算法的小夥伴都會對這句話產生共鳴。辛辛苦苦搭建好網絡,望眼欲穿得訓練調試好模型,等到最後要部署,面對紛繁複雜的實際部署環境時,才發現原來終極大魔王在這裏!
當然這個魔王不會喊打喊殺,但他會給你出難題,情景可能是這樣的:

一行命令啓動,十分鐘內完成部署,Paddle Serving 開放模型即服務功能

在此緊要關頭,是否有什麼捷徑幫助小夥伴順利通關呢?這個真的可以有,那就是國內最早開源開放、功能完備的開源深度學習平臺飛槳所提供的 Paddle Serving 功能。

一行命令啓動,十分鐘內完成部署,Paddle Serving 開放模型即服務功能

Paddle Serving 是飛槳的服務化部署框架,長期目標就是爲人工智能落地的最後一公里提供越來越專業、可靠、易用的服務。隨着飛槳開源框架推出最新的 1.7 版本, Paddle Serving 的最新版本也閃亮登場。有了它,和魔王的對話情景就要變一變啦!

一行命令啓動,十分鐘內完成部署,Paddle Serving 開放模型即服務功能

Paddle Serving 真的那麼好嗎?當然!Paddle Serving 秉承模型即服務(Model As A Service,MAAS)的理念,全面打通並自動化飛槳訓練框架與 Paddle Serving 的銜接流程,讓用戶在使用飛槳成功完成模型訓練的那一刻,收穫的不再只是模型,而是同時擁有了該模型的推理服務,使用戶能夠在幾分鐘內將模型轉化爲一個可以在服務器端部署的遠程服務。總的來說,Paddle Serving 具有如下四大特點:

  • 簡單易用:爲了讓使用飛槳的用戶能夠以極低的成本部署模型,Paddle Serving 設計了一套與飛槳開源框架無縫打通的預測部署 API。對於不需要較爲複雜的數據預處理過程的普通模型來說,每一位模型算法工程師僅使用一行命令就可以輕鬆部署自己的模型服務。

  • 工業可用:爲了達到工業級深度學習模型在線部署的要求,Paddle Serving 提供很多大規模場景需要的部署功能:

  • 分佈式稀疏參數索引功能。

  • 高併發底層通信能力。

  • 模型管理、在線 A/B 流量測試、模型熱加載。

  • 功能擴展:當前 Paddle Serving 支持 C++、Python、Golang 的客戶端,未來也會面向不同類型的客戶新增多種語言的客戶端。在 Paddle Serving 的框架設計方面,儘管當前版本以支持飛槳模型的部署爲核心功能,但是用戶也可以很容易嵌入其它的機器學習庫部署在線預測服務。

  • 高性能引擎支持:飛槳的 Paddle Inference 原生推理庫作爲當前 Paddle Serving 唯一支持的後端推理引擎,具備諸多高性能的特性,例如內存 / 顯存複用、算子自動融合、TensorRT 子圖以及 Paddle Lite 子圖自動調用等功能。Paddle Serving 從客戶端請求到服務端計算的整體流程如圖 1 所示,整個底層通信都採用了高併發、低延時的 Baidu-RPC 服務,支撐深度學習模型在線部署的整個流程,使其性能進一步提高。

一行命令啓動,十分鐘內完成部署,Paddle Serving 開放模型即服務功能

圖 1 Paddle Serving 工作流程示意圖
千言萬語不如一個行動,具體 Paddle Serving 有哪些閃亮操作,咱們且往下看!
模型即服務:一行命令啓動推理服務
所謂模型即服務,是指成功訓練出來的模型即可直接被用來部署上線一個推理業務。在這方面飛槳提供了專門的 API 接口用於將訓練成功的模型保存成指定的格式,然後無需編寫其他代碼,直接使用 Paddle Serving 功能中的一條命令即可將這個模型部署到服務器上,形成線上推理業務。具體如何操作,請看下面的示例。
本例將使用房價預測模型來演示操作方法,下載及解壓方式如下所示,下載解壓後模型及相關配置文件保存在「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  

其中各個參數的含義如下:

  • model:Server 端配置與模型文件所在目錄。

  • thread:Server 端線程數。

  • port:Server 端預測服務端口號。

  • name:HTTP 預測服務的的名稱,如果不指定 name,則會啓動 RPC 預測服務。

當返回如下信息時則表示服務端啓動成功。

    * Running on http://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 花十分鐘部署上線一個這樣的服務。
1. 保存可服務模型
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)  

2. 啓動服務端
在服務端的計算機上使用如下命令啓動服務,其中 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.  

3. 配置客戶端數據預處理邏輯
Paddle Serving 擁有針對多個經典數據集的數據預處理模塊,對於本示例的中文 Bert 語義表示的計算,我們採用 paddle_serving_app 下的 ChineseBertReader 類對數據作預處理操作,這樣開發者可以很容易獲得一個原始中文句子所對應的語義向量,用於作爲推理服務模型的輸入。安裝 paddle_serving_app 的方法如下所示。

    pip install paddle_serving_app  

4. 配置客戶端訪問服務器獲取推理結果

     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%!

一行命令啓動,十分鐘內完成部署,Paddle Serving 開放模型即服務功能

圖 2 Paddle Serving 性能壓力測試吞吐量示意圖
此外,如下表所示,飛槳的工程師們還提供了多個其它任務領域的模型推理服務示例以及性能分析的工具。歡迎各位小夥伴根據自己的需求下載使用。

一行命令啓動,十分鐘內完成部署,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 接口。

一行命令啓動,十分鐘內完成部署,Paddle Serving 開放模型即服務功能

圖 3 Timeline 性能可視化工具界面效果圖
_
_Timeline 的使用方法請參見: https://github.com/PaddlePaddle/Serving/tree/develop/python/examples/util
寫在最後
Paddle Serving 是面向社區用戶的核心訴求進行打造,在易用性方面相比此前的版本有了大幅度提升,用戶甚至不需要掌握多深厚的飛槳相關知識即可使用 Paddle Serving 部署模型推理服務,極大的提升了部署效率。Paddle Serving 會在接下來的版本中繼續降低用戶的使用門檻,提供更多語言類型的客戶端,以及 Kubernetes 部署的相關組件,開放更多能夠開箱即用的模型,敬請關注!
如果您加入官方 QQ 羣,您將遇上大批志同道合的深度學習同學。官方 QQ 羣:703252161。
如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文檔。

飛槳開源框架項目地址:

來源鏈接:mp.weixin.qq.com