您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么用PyTorch部署模型”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
安裝torchserve最好的方法是使用docker。你只需要把鏡像拉下來(lái)。
可以使用以下命令保存最新的鏡像。
docker pull pytorch/torchserve:latest
處理程序負(fù)責(zé)使用模型對(duì)一個(gè)或多個(gè)HTTP請(qǐng)求進(jìn)行預(yù)測(cè)。
默認(rèn) handlers
Torchserve支持以下默認(rèn) handlers
image_classifier
object_detector
text_classifier
image_segmenter
但是請(qǐng)記住,它們都不支持batching請(qǐng)求!
自定義 handlers
torchserve提供了一個(gè)豐富的接口,可以做幾乎所有你想做的事情。一個(gè)Handler
是一個(gè)必須有三個(gè)函數(shù)的類(lèi)。
preprocess
inference
postprocess
你可以創(chuàng)建你自己的類(lèi)或者子類(lèi)BaseHandler
。子類(lèi)化BaseHandler
的主要優(yōu)點(diǎn)是可以在self.model
上訪問(wèn)加載的模型。下面的代碼片段展示了如何子類(lèi)化BaseHandler
。
子類(lèi)化BaseHandler以創(chuàng)建自己的handler
回到圖像分類(lèi)的例子。我們需要
從每個(gè)請(qǐng)求中獲取圖像并對(duì)其進(jìn)行預(yù)處理
從模型中得到預(yù)測(cè)
發(fā)送回一個(gè)響應(yīng)
預(yù)處理
.preprocess
函數(shù)接受請(qǐng)求數(shù)組。假設(shè)我們正在向服務(wù)器發(fā)送一個(gè)圖像,可以從請(qǐng)求的data
或body
字段訪問(wèn)序列化的圖像。因此,我們可以遍歷所有請(qǐng)求并單獨(dú)預(yù)處理每個(gè)圖像。完整的代碼如下所示。
預(yù)處理每個(gè)請(qǐng)求中的每個(gè)圖像
self.transform
是我們的預(yù)處理變換,沒(méi)什么花哨的。對(duì)于在ImageNet上訓(xùn)練的模型來(lái)說(shuō),這是一個(gè)經(jīng)典的預(yù)處理步驟。
我們的transform
在我們對(duì)每個(gè)請(qǐng)求中的每個(gè)圖像進(jìn)行預(yù)處理之后,我們將它們連接起來(lái)創(chuàng)建一個(gè)pytorch張量。
推理
在模型上進(jìn)行推理
這一步很簡(jiǎn)單,我們從 .preprocess
得到張量。然后對(duì)每幅圖像提取預(yù)測(cè)結(jié)果。
后處理
現(xiàn)在我們有了對(duì)每個(gè)圖像的預(yù)測(cè),我們需要向客戶(hù)返回一些內(nèi)容。Torchserve總是返回一個(gè)數(shù)組。BaseHandler
也會(huì)自動(dòng)打開(kāi)一個(gè).json
文件帶有index -> label
的映射(稍后我們將看到如何提供這樣的文件),并將其存儲(chǔ)self.mapping
中。我們可以為每個(gè)預(yù)測(cè)返回一個(gè)字典數(shù)組,其中包含label
和index
的類(lèi)別。
把所有的東西打包到一起,我們的handler是這樣的:
因?yàn)樗械奶幚磉壿嫸挤庋b在一個(gè)類(lèi)中,所以你可以輕松地對(duì)它進(jìn)行單元測(cè)試!
Torchserve 需要提供一個(gè).mar
文件,簡(jiǎn)而言之,該文件只是把你的模型和所有依賴(lài)打包在一起。要進(jìn)行打包,首先需要導(dǎo)出經(jīng)過(guò)訓(xùn)練的模型。
導(dǎo)出模型
有三種方法可以導(dǎo)出torchserve的模型。到目前為止,我發(fā)現(xiàn)的最好的方法是trace
模型并存儲(chǔ)結(jié)果。這樣我們就不需要向torchserve添加任何額外的文件。
讓我們來(lái)看一個(gè)例子,我們將部署一個(gè)經(jīng)過(guò)充分訓(xùn)練的ResNet34模型。
按照順序,我們:
加載模型
創(chuàng)建一個(gè)dummy輸入
使用torch.jit.trace
來(lái)trace模型的輸入
保存模型
創(chuàng)建 .mar 文件
你需要安裝torch-model-archiver
git clone https://github.com/pytorch/serve.git cd serve/model-archiver pip install .
然后,我們準(zhǔn)備好通過(guò)使用下面的命令來(lái)創(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
定義了模型的最終名稱(chēng)。這是非常重要的,因?yàn)樗鼘⑹莈ndpoint的名稱(chēng)空間,負(fù)責(zé)進(jìn)行預(yù)測(cè)。你還可以指定一個(gè)--version
。--serialized-file
指向我們之前創(chuàng)建的存儲(chǔ)的 .pt
模型。--handler
是一個(gè)python文件,我們?cè)谄渲姓{(diào)用我們的自定義handler。一般來(lái)說(shuō),是這樣的:
my_handler.py
它暴露了一個(gè)handle
函數(shù),我們從該函數(shù)調(diào)用自定義handler中的方法。你可以使用默認(rèn)名稱(chēng)來(lái)使用默認(rèn)handler(例如,--handler image_classifier
)。
在--extra-files
中,你需要將路徑傳遞給你的handlers正在使用的所有文件。在本例中,我們必須向.json
文件中添加路徑。使用所有人類(lèi)可讀標(biāo)簽名稱(chēng),并在MyHandler.py
中定義每個(gè)類(lèi)別。
如果你傳遞一個(gè)index_to_name.json
文件,它將自動(dòng)加載到handler ,并通過(guò)self.mapping
訪問(wèn)。
--export-path
就是 .mar
存放的地方,我還添加了-f
來(lái)覆蓋原有的文件。
如果一切順利的話,你可以看到resnet34.mar
存放在./model-store
路徑中。
這是一個(gè)簡(jiǎn)單的步驟,我們可以運(yùn)行帶有所有必需參數(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)在我的機(jī)器中使用)。然后,我從./model-store
創(chuàng)建一個(gè)volume。最后,我通過(guò)padding model-store
并通過(guò)key-value列表的方式指定模型的名稱(chēng)來(lái)調(diào)用torchserve
。
這里,torchserve有一個(gè)endpoint /predictions/resnet34
,我們可以通過(guò)發(fā)送圖像來(lái)預(yù)測(cè)。這可以使用curl來(lái)實(shí)現(xiàn)。
curl -X POST http://127.0.0.1:3000/predictions/resnet34 -T inputs/kitten.jpg
回復(fù):
{ "label": "tiger_cat", "index": 282 }
工作正常!
“怎么用PyTorch部署模型”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。