教你用PyTorch部署模型的方法
導讀
演示了使用PyTorch最近發(fā)布的新工具torchserve來進行PyTorch模型的部署。
最近,PyTorch推出了名為torchserve.
的新生產(chǎn)框架來為模型提供服務。我們看一下今天的roadmap:
1、使用Docker安裝
2、導出模型
3、定義handler
4、保存模型
為了展示torchserve,我們將提供一個經(jīng)過全面訓練的ResNet34進行圖像分類的服務。
使用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
是一個必須有三個函數(shù)的類。
- preprocess
- inference
- postprocess
你可以創(chuàng)建你自己的類或者子類BaseHandler
。子類化BaseHandler
的主要優(yōu)點是可以在self.model
上訪問加載的模型。下面的代碼片段展示了如何子類化BaseHandler
。
子類化BaseHandler以創(chuàng)建自己的handler
回到圖像分類的例子。我們需要
- 從每個請求中獲取圖像并對其進行預處理
- 從模型中得到預測
- 發(fā)送回一個響應
預處理
.preprocess
函數(shù)接受請求數(shù)組。假設我們正在向服務器發(fā)送一個圖像,可以從請求的data
或body
字段訪問序列化的圖像。因此,我們可以遍歷所有請求并單獨預處理每個圖像。完整的代碼如下所示。
預處理每個請求中的每個圖像
self.transform
是我們的預處理變換,沒什么花哨的。對于在ImageNet上訓練的模型來說,這是一個經(jīng)典的預處理步驟。
我們的transform
在我們對每個請求中的每個圖像進行預處理之后,我們將它們連接起來創(chuàng)建一個pytorch張量。
推理
在模型上進行推理
這一步很簡單,我們從 .preprocess
得到張量。然后對每幅圖像提取預測結(jié)果。
后處理
現(xiàn)在我們有了對每個圖像的預測,我們需要向客戶返回一些內(nèi)容。Torchserve總是返回一個數(shù)組。BaseHandler
也會自動打開一個.json
文件帶有index -> label
的映射(稍后我們將看到如何提供這樣的文件),并將其存儲self.mapping
中。我們可以為每個預測返回一個字典數(shù)組,其中包含label
和index
的類別。
把所有的東西打包到一起,我們的handler是這樣的:
因為所有的處理邏輯都封裝在一個類中,所以你可以輕松地對它進行單元測試!
導出你的模型
官方文檔:https://github.com/pytorch/serve/tree/master/model-archiver#creating-a-model-archive
Torchserve 需要提供一個.mar
文件,簡而言之,該文件只是把你的模型和所有依賴打包在一起。要進行打包,首先需要導出經(jīng)過訓練的模型。
導出模型
有三種方法可以導出torchserve的模型。到目前為止,我發(fā)現(xiàn)的最好的方法是trace
模型并存儲結(jié)果。這樣我們就不需要向torchserve添加任何額外的文件。
讓我們來看一個例子,我們將部署一個經(jīng)過充分訓練的ResNet34模型。
按照順序,我們:
- 加載模型
- 創(chuàng)建一個dummy輸入
- 使用
torch.jit.trace
來trace模型的輸入 - 保存模型
創(chuàng)建 .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 .
然后,我們準備好通過使用下面的命令來創(chuàng)建.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
指向我們之前創(chuàng)建的存儲的 .pt
模型。--handler
是一個python文件,我們在其中調(diào)用我們的自定義handler。一般來說,是這樣的:
my_handler.py
它暴露了一個handle
函數(shù),我們從該函數(shù)調(diào)用自定義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
路徑中。
用模型進行服務
這是一個簡單的步驟,我們可以運行帶有所有必需參數(shù)的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已經(jīng)在我的機器中使用)。然后,我從./model-store
創(chuàng)建一個volume。最后,我通過padding model-store
并通過key-value列表的方式指定模型的名稱來調(diào)用torchserve
。
這里,torchserve有一個endpoint /predictions/resnet34
,我們可以通過發(fā)送圖像來預測。這可以使用curl來實現(xiàn)。
curl -X POST http://127.0.0.1:3000/predictions/resnet34 -T inputs/kitten.jpg
kitten.jpg
回復:
{ "label": "tiger_cat", "index": 282 }
工作正常!
總結(jié)
使用docker安裝torchserve
默認以及自定義handlers
模型打包生成
使用docker提供模型服務到此這篇關于用PyTorch部署模型的文章就介紹到這了,更多相關PyTorch部署模型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
git push 本地項目推送到遠程分支的方法(git命令版)
這篇文章主要介紹了git push 本地項目推送到遠程分支的方法(git命令版),需要的朋友可以參考下2020-09-09詳解git merge 與 git rebase的區(qū)別
這篇文章主要介紹了詳解git merge 與 git rebase的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07在VSCode中如何配置Python開發(fā)環(huán)境
VScode是一個相當優(yōu)秀的IDE,具備開源、跨平臺、模塊化、插件豐富、啟動時間快、顏值高、可高度定制等等優(yōu)秀的特質(zhì),所以用VScode來編寫Python,也是相當?shù)暮糜玫?。所以,今天我們就來講講,怎么在VScode上配置Python開發(fā)環(huán)境。2020-01-01