一行命令啟動,十分鐘內完成部署


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

當然這個魔王不會喊打喊殺,但他會給你出難題,情景可能是這樣的:

一行命令啟動,十分鐘內完成部署


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

一行命令啟動,十分鐘內完成部署


Paddle Serving 是飛槳的服務化部署框架,長期目標就是為人工智能落地的最後一公里提供越來越專業、可靠、易用的服務。隨著飛槳開源框架推出最新的 1.7 版本,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 服務,支撐深度學習模型在線部署的整個流程,使其性能進一步提高。


一行命令啟動,十分鐘內完成部署


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

一行命令啟動,十分鐘內完成部署


圖 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 部署的相關組件,開放更多能夠開箱即用的模型,敬請關注!



分享到:


相關文章: