用PyTorch部署模型

2021-02-19 人工智慧與算法學習

最近,PyTorch推出了名為torchserve.的新生產框架來為模型提供服務。我們看一下今天的roadmap:

1、使用Docker安裝

2、導出模型

3、定義handler

4、保存模型

為了展示torchserve,我們將提供一個經過全面訓練的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

但是請記住,它們都不支持batching請求!

自定義 handlers

torchserve提供了一個豐富的接口,可以做幾乎所有你想做的事情。一個Handler是一個必須有三個函數的類。

你可以創建你自己的類或者子類BaseHandler。子類化BaseHandler 的主要優點是可以在self.model上訪問加載的模型。下面的代碼片段展示了如何子類化BaseHandler。

子類化BaseHandler以創建自己的handler

回到圖像分類的例子。我們需要

預處理

.preprocess函數接受請求數組。假設我們正在向伺服器發送一個圖像,可以從請求的data或body欄位訪問序列化的圖像。因此,我們可以遍歷所有請求並單獨預處理每個圖像。完整的代碼如下所示。

預處理每個請求中的每個圖像

self.transform是我們的預處理變換,沒什麼花哨的。對於在ImageNet上訓練的模型來說,這是一個經典的預處理步驟。

我們的transform

在我們對每個請求中的每個圖像進行預處理之後,我們將它們連接起來創建一個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模型。

按照順序,我們:

使用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。一般來說,是這樣的:

my_handler.py

它暴露了一個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

kitten.jpg

回覆:

{
  "label": "tiger_cat",
  "index": 282
}

工作正常!

總結

相關焦點

  • torchserve來進行PyTorch模型的部署
    的更多信息:https://github.com/pytorch/serve#quick-start-with-dockerHandlers官方文檔:https://github.com/pytorch/serve/blob/master/docs/custom_service.md處理程序負責使用模型對一個或多個
  • 模型部署翻車記:PyTorch轉onnx踩坑實錄
    在深度學習模型部署時,從pytorch轉換onnx的過程中,踩了一些坑。本文總結了這些踩坑記錄,希望可以幫助其他人。首先,簡單說明一下pytorch轉onnx的意義。在pytorch訓練出一個深度學習模型後,需要在TensorRT或者openvino部署,這時需要先把Pytorch模型轉換到onnx模型之後再做其它轉換。因此,在使用pytorch訓練深度學習模型完成後,在TensorRT或者openvino或者opencv和onnxruntime部署時,pytorch模型轉onnx這一步是必不可少的。
  • 輕鬆學pytorch之使用onnx runtime實現pytorch模型部署
    ONNX(Open Neural Network Exchange)是一種標準與開放的網絡模型交換格式,直白點說就是tensorflow/pytorch
  • 經驗 | 在C++平臺上部署PyTorch模型流程+踩坑實錄
    的模型部署到c++平臺上,基本過程主要參照官網的教學示例,期間發現了不少坑,特此記錄。traced_script_module = torch.jit.trace(model, example)缺點是如果模型中存在控制流比如if-else語句,一組輸入只能遍歷一個分支,這種情況下就沒辦法完整的把模型信息記錄下來。
  • TensorRT加速PyTorch模型教程
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。
  • PyTorch OCR模型的安卓端部署
    def relu6(x,inplace=True):  return torch.clamp(x,0,6) 問題2:Resize算子轉換問題概述:因為各個框架對Resize算子的支持都不盡相同,在轉換過程中總會出現一些問題,pytorch中的interpolate
  • 實用教程詳解:模型部署,用DNN模塊部署YOLOv5目標檢測(附原始碼)
    在典型的機器學習和深度學習項目中,我們通常從定義問題陳述開始,然後是數據收集和準備(數據預處理)和模型構建(模型訓練),對吧?但是,最後,我們希望我們的模型能夠提供給最終用戶,以便他們能夠利用它。模型部署是任何機器學習項目的最後階段之一,可能有點棘手。如何將機器學習模型傳遞給客戶/利益相關者?
  • TensorRT 加速 PyTorch 模型基本方法
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。
  • 劍指TensorFlow,PyTorch Hub官方模型庫一行代碼復現主流模型
    加載模型現在我們已經知道有哪些預訓練模型,下面就可以使用 torch.hub.load() API 加載這些模型了。使用 API 加載模型時,它只需要一行命令,而不需要額外安裝 wheel。另外,torch.hub.help() API 也能提供一些有用的信息來幫助演示如何使用預訓練模型。
  • 如何使用TensorRT對訓練好的PyTorch模型進行加速?
    一.簡介TensorRT是Nvidia公司出的能加速模型推理的框架,其實就是讓你訓練的模型在測試階段的速度加快,比如你的模型測試一張圖片的速度是50ms,那麼用tensorRT加速的話,可能只需要10ms。當然具體能加速多少也不能保證,反正確實速度能提升不少。
  • Facebook聯合AWS推出PyTorch模型服務框架:可讓模型快速投入生產
    即便有了 PyTorch,在生產中部署和管理模型仍然是機器學習的一大難題,包括構建定製的預測 API,對其進行縮放以及保證其安全等問題。簡化模型部署過程的一種方法是使用模型伺服器,即專門設計用於在生產中提供機器學習預測的現成的 Web 應用程式。模型伺服器可輕鬆加載一個或多個模型,並自動創建由可伸縮 Web 伺服器支持的預測 API。它們還能夠根據預測請求運行預處理和後處理代碼。
  • onnx實現對pytorch模型推理加速
    onnxruntime模型部署流程1.安裝pip install onnxpip install onnxruntime( pip install onnxruntime-gpu #GPU環境)2.
  • 模型部署 ONNX runtime
    通常我們在訓練模型時可以使用很多不同的框架,比如有的同學喜歡用 Pytorch,有的同學喜歡使用 TensorFLow,也有的喜歡 MXNet,
  • 用 TFserving 部署深度學習模型
    個人簡介:wedo實驗君, 數據分析師;熱愛生活,熱愛寫作1.什麼是TFserving當你訓好你的模型,需要提供給外部使用的時候,你就需要把模型部署到線上,並提供合適的接口給外部調用。你可能會考慮一些問題:目前流行的深度學習框架Tensorflow和Pytorch, Pytorch官方並沒有提供合適的線上部署方案;Tensorflow則提供了TFserving方案來部署線上模型推理。另外,Model Server for Apache MXNet 為MXNet模型提供推理服務。
  • 用pytorch踩過的坑
    ,因為要監控模型的性能,在跑完若干個epoch訓練之後,需要進行一次在驗證集[4]上的性能驗證。保存梯度是需要額外顯存或者內存進行保存的,佔用了空間,有時候還會在驗證階段導致OOM(Out Of Memory)錯誤,因此我們在驗證和測試階段,最好顯式地取消掉模型變量的梯度。
  • 使用PyTorch微調ALBERT中文預訓練模型
    為了減小模型參數和模型訓練時間,ALBERT提出了兩種解決方法。ALBERT也是採用和Bert一樣的Transformer的Encoder[1]結構,激活函數也是GLUE[2]。Embedding因式分解    我們用H表示隱藏層大小,E表示embedding維度,V表示詞彙表的大小。    Bert base模型的Encoder輸出大小(H)和embedding維度(E)都是768,然而,ALBERT認為詞級別的embedding是沒有上下文依賴的表述;而隱藏層的輸出值,不僅包括了詞本身的意思,還包含了上下文信息。
  • 那些用pytorch踩過的坑
    ,因為要監控模型的性能,在跑完若干個epoch訓練之後,需要進行一次在驗證集[4]上的性能驗證。保存梯度是需要額外顯存或者內存進行保存的,佔用了空間,有時候還會在驗證階段導致OOM(Out Of Memory)錯誤,因此我們在驗證和測試階段,最好顯式地取消掉模型變量的梯度。
  • pytorch中文語言模型bert預訓練代碼
    大部分中文語言模型都是在tensorflow上訓練的,一個常見例子是中文roberta項目。可以參考https://github.com/brightmart/roberta_zh使用pytorch進行中文bert語言模型預訓練的例子比較少。在huggingface的Transformers中,有一部分代碼支持語言模型預訓練(不是很豐富,很多功能都不支持比如wwm)。
  • PyTorch 模型訓練實用教程(附代碼)
    前幾年一直在用 Caffe 和 MatConvNet,近期轉 PyTorch。當時只想快速地用上 PyTorch 進行模型開發,然而搜了一圈 PyTorch 的教程,並沒有找到一款適合的。很多 PyTorch 教程是從學習機器學習 (深度學習) 的角度出發,以 PyTorch 為工具進行編寫,裡面介紹很多模型,並且附上模型的 demo。
  • 【他山之石】pytorch計算模型FLOPs和Params
    地址:https://www.zhihu.com/people/zhuang-ming-xi-31-16網絡框架模型計算量影響到模型的推斷時間,模型的參數量對設備內存有要求,為了進行模型比較給大家介紹兩種計算FLOPs和Params實用的小工具:01https://github.com