點擊上方「AI公園」,關注公衆號,選擇加「星標「或「置頂」python
做者:Francesco Zuppichinigit
編譯:ronghuaiyang
github
演示了使用PyTorch最近發佈的新工具torchserve來進行PyTorch模型的部署。web
最近,PyTorch推出了名爲torchserve.
的新生產框架來爲模型提供服務。咱們看一下今天的roadmap:docker
一、使用Docker安裝json
二、導出模型數組
三、定義handler服務器
四、保存模型微信
爲了展現torchserve,咱們將提供一個通過全面訓練的ResNet34進行圖像分類的服務。app
使用Docker安裝
官方文檔:https://github.com/pytorch/serve/blob/master/README.md##install-torchserve
安裝torchserve最好的方法是使用docker。你只須要把鏡像拉下來。
可使用如下命令保存最新的鏡像。
docker pull pytorch/torchserve:latest
全部可用的tags:https://hub.docker.com/r/pytorch/torchserve/tags
關於docker和torchserve的更多信息:https://github.com/pytorch/serve#quick-start-with-docker
Handlers
官方文檔:https://github.com/pytorch/serve/blob/master/docs/custom_service.md
處理程序負責使用模型對一個或多個HTTP請求進行預測。
默認 handlers
Torchserve支持如下默認 handlers
-
image_classifier
-
object_detector
-
text_classifier
-
image_segmenter
可是請記住,它們都不支持batching請求!
自定義 handlers
torchserve提供了一個豐富的接口,能夠作幾乎全部你想作的事情。一個Handler
是一個必須有三個函數的類。
-
preprocess -
inference -
postprocess
你能夠建立你本身的類或者子類BaseHandler
。子類化BaseHandler
的主要優勢是能夠在self.model
上訪問加載的模型。下面的代碼片斷展現瞭如何子類化BaseHandler
。
回到圖像分類的例子。咱們須要
-
從每一個請求中獲取圖像並對其進行預處理 -
從模型中獲得預測 -
發送回一個響應
預處理
.preprocess
函數接受請求數組。假設咱們正在向服務器發送一個圖像,能夠從請求的data
或body
字段訪問序列化的圖像。所以,咱們能夠遍歷全部請求並單獨預處理每一個圖像。完整的代碼以下所示。
self.transform
是咱們的預處理變換,沒什麼花哨的。對於在ImageNet上訓練的模型來講,這是一個經典的預處理步驟。
在咱們對每一個請求中的每一個圖像進行預處理以後,咱們將它們鏈接起來建立一個pytorch張量。
推理
這一步很簡單,咱們從 .preprocess
獲得張量。而後對每幅圖像提取預測結果。
後處理
如今咱們有了對每一個圖像的預測,咱們須要向客戶返回一些內容。Torchserve老是返回一個數組。BaseHandler
也會自動打開一個.json
文件帶有index -> label
的映射(稍後咱們將看到如何提供這樣的文件),並將其存儲self.mapping
中。咱們能夠爲每一個預測返回一個字典數組,其中包含label
和index
的類別。
把全部的東西打包到一塊兒,咱們的handler是這樣的:
由於全部的處理邏輯都封裝在一個類中,因此你能夠輕鬆地對它進行單元測試!
導出你的模型
官方文檔:https://github.com/pytorch/serve/tree/master/model-archiver#creating-a-model-archive
Torchserve 須要提供一個.mar
文件,簡而言之,該文件只是把你的模型和全部依賴打包在一塊兒。要進行打包,首先須要導出通過訓練的模型。
導出模型
有三種方法能夠導出torchserve的模型。到目前爲止,我發現的最好的方法是trace
模型並存儲結果。這樣咱們就不須要向torchserve添加任何額外的文件。
讓咱們來看一個例子,咱們將部署一個通過充分訓練的ResNet34模型。
按照順序,咱們:
-
加載模型 -
建立一個dummy輸入 -
使用 torch.jit.trace
來trace模型的輸入 -
保存模型
建立 .mar 文件
官方文檔:https://github.com/pytorch/serve/blob/master/model-archiver/README.md
你須要安裝torch-model-archiver
git clone https://github.com/pytorch/serve.git
cd serve/model-archiver
pip install .
而後,咱們準備好經過使用下面的命令來建立.mar
文件。
torch-model-archiver --model-name resnet34 \--version 1.0 \--serialized-file resnet34.pt \--extra-files ./index_to_name.json,./MyHandler.py \--handler my_handler.py \--export-path model-store -f
按照順序。變量--model-name
定義了模型的最終名稱。這是很是重要的,由於它將是endpoint的名稱空間,負責進行預測。你還能夠指定一個--version
。--serialized-file
指向咱們以前建立的存儲的 .pt
模型。--handler
是一個python文件,咱們在其中調用咱們的自定義handler。通常來講,是這樣的:
它暴露了一個handle
函數,咱們從該函數調用自定義handler中的方法。你可使用默認名稱來使用默認handler(例如,--handler image_classifier
)。
在--extra-files
中,你須要將路徑傳遞給你的handlers正在使用的全部文件。在本例中,咱們必須向.json
文件中添加路徑。使用全部人類可讀標籤名稱,並在MyHandler.py
中定義每一個類別。
若是你傳遞一個index_to_name.json
文件,它將自動加載到handler ,並經過self.mapping
訪問。
--export-path
就是 .mar
存放的地方,我還添加了-f
來覆蓋原有的文件。
若是一切順利的話,你能夠看到resnet34.mar
存放在./model-store
路徑中。
用模型進行服務
這是一個簡單的步驟,咱們能夠運行帶有全部必需參數的torchserve docker容器。
docker run --rm -it \-p 3000:8080 -p 3001:8081 \-v $(pwd)/model-store:/home/model-server/model-store pytorch/torchserve:0.1-cpu \torchserve --start --model-store model-store --models resnet34=resnet34.mar
我將容器端口8080和8081分別綁定到3000和3001(8080/8081已經在個人機器中使用)。而後,我從./model-store
建立一個volume。最後,我經過padding model-store
並經過key-value列表的方式指定模型的名稱來調用torchserve
。
這裏,torchserve有一個endpoint /predictions/resnet34
,咱們能夠經過發送圖像來預測。這可使用curl來實現。
curl -X POST http://127.0.0.1:3000/predictions/resnet34 -T inputs/kitten.jpg
回覆:
{
"label": "tiger_cat",
"index": 282
}
工做正常!
總結
-
使用docker安裝torchserve -
默認以及自定義handlers -
模型打包生成 -
使用docker提供模型服務
英文原文:https://towardsdatascience.com/deploy-models-and-create-custom-handlers-in-torchserve-fc2d048fbe91
請長按或掃描二維碼關注本公衆號
喜歡的話,請給我個好看吧!
本文分享自微信公衆號 - AI公園(AI_Paradise)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。