網站首頁 編程語言 正文
導讀
一篇用PyTorch Lighting提供模型服務的完全指南。
縱觀機器學習領域,一個主要趨勢是專注于將軟件工程原理應用于機器學習的項目。例如,Cortex重新創造了部署serverless功能的體驗,但使用了推理管道。類似地,DVC實現了現代版本控制和CI/CD管道,但是是針對ML的。\
PyTorch Lightning也有類似的理念,只適用于訓練。這些框架為PyTorch提供了一個Python包裝器,讓數據科學家和工程師可以編寫干凈、易于管理和性能訓練的代碼。
作為構建整個部署平臺的人,部分原因是我們討厭編寫樣板文件,我們是PyTorch Lightning的忠實粉絲。本著這種精神,我整理了這篇將PyTorch Lightning模型部署到生產中的指南。在此過程中,我們將了解一些用于導出PyTorch Lightning模型并將其包含在推理管道中的不同選項。
使用PyTorch Lightning模型進行推理的各種方法
有三種方法導出用于PyTorch Lightning模型進行服務:
- 保存模型為PyTorch檢查點
- 將模型轉換為ONNX
- 導出模型到Torchscript
我們可以用Cortex來對這三種進行服務。
1. 直接打包部署PyTorch Lightning模型
從最簡單的方法開始,讓我們部署一個不需要任何轉換步驟的PyTorch Lightning模型。
PyTorch Lightning訓練器是一個抽象了樣板訓練代碼(想想訓練和驗證步驟)的類,它有一個內置的save_checkpoint()函數,可以將模型保存為.ckpt文件。要將你的模型保存為一個檢查點,只需將以下代碼添加到你的訓練腳本中:
現在,在我們開始服務這個檢查點之前,重要的是要注意,當我一直說“PyTorch Lightning模型”時,PyTorch Lightning是PyTorch的一個封裝 —— 項目的自述文件字面上說“PyTorch Lightning只是有組織的PyTorch”。因此,導出的模型是一個正常的PyTorch模型,可以相應地提供服務。
有了保存好的檢查點,我們就可以輕松地在Cortex中使用該模型。關于Cortex的部署過程的簡單概述如下:
- 我們用Python為我們的模型編寫了一個預測API
- 我們在YAML中定義api的基礎結構和行為
- 我們通過CLI命令來部署API
我們的預測API將使用Cortex的Python Predictor類來定義一個init()函數來初始化我們的API并加載模型,以及一個predict()函數來在查詢時提供預測:
import torch
import pytorch_lightning as pl
import MyModel from training_code
from transformers import (
AutoModelForSequenceClassification,
AutoConfig,
AutoTokenizer
)
class PythonPredictor:
def __init__(self, config):
self.device = "cpu"
self.tokenizer = AutoTokenizer.from_pretrained("albert-base-v2")
self.model = MyModel.load_from_checkpoint(checkpoint_path="./model.ckpt")
def predict(self, payload):
inputs = self.tokenizer.encode_plus(payload["text"], return_tensors="pt")
predictions = self.model(**inputs)[0]
if (predictions[0] > predictions[1]):
return {"class": "unacceptable"}
else:
return {"class": "acceptable"}
很簡單。我們從訓練代碼中重新定義了一些代碼,添加了一些推理邏輯,就是這樣。需要注意的一點是,如果你將模型上傳到S3(推薦),你需要添加一些訪問它的邏輯。
接下來,我們在YAML中配置基礎的設置:
- name: acceptability-analyzer kind: RealtimeAPI predictor: type: python path: predictor.py compute: cpu: 1
同樣也很簡單。我們給API一個名稱,告訴Cortex我們的預測API在哪里,并分配CPU。
接下來,我們部署它:
注意,我們也可以將其部署到一個集群中,并由Cortex進行管理:
在所有的部署中,Cortex將我們的API打包并將其作為web的服務公開。通過云部署,Cortex可以配置負載平衡、自動擴展、監控、更新和許多其他基礎設施功能。
現在,我們有了一個實時的web API,可以通過請求用模型進行預測。
2. 導出為ONNX并通過ONNX Runtime進行服務
現在我們已經部署了一個普通的PyTorch檢查點,讓我們把事情復雜化一點。
PyTorch Lightning最近添加了一個方便的抽象,用于將模型導出到ONNX(以前,你可以使用PyTorch的內置轉換函數,盡管它們需要更多的樣板文件)。要將模型導出到ONNX,只需將以下代碼添加到訓練腳本中:
注意,輸入樣本應該模擬實際模型輸入的形狀。
一旦你導出了ONNX模型,你就可以使用Cortex的ONNX Predictor來服務它。代碼基本上是一樣的,過程也是一樣的。例如,這是一個ONNX預測API:
import pytorch_lightning as pl
from transformers import (
AutoModelForSequenceClassification,
AutoConfig,
AutoTokenizer
)
class ONNXPredictor:
def __init__(self, onnx_client, config):
self.device = "cpu"
self.client = onnx_client
self.tokenizer = AutoTokenizer.from_pretrained("albert-base-v2")
def predict(self, payload):
inputs = self.tokenizer.encode_plus(payload["text"], return_tensors="pt")
predictions = self.client.predict(**inputs)[0]
if (predictions[0] > predictions[1]):
return {"class": "unacceptable"}
else:
return {"class": "acceptable"}
基本上是一樣的。唯一的區別是,我們不是直接初始化模型,而是通過onnx_client訪問它,這是一個ONNX運行時容器,Cortex為我們的模型提供服務。
我們的YAML看起來也很相似:
- name: acceptability-analyzer kind: RealtimeAPI predictor: type: onnx path: predictor.py model_path: s3://your-bucket/model.onnx monitoring: model_type: classification
?我在這里添加了一個監視標志,只是為了說明配置它是多么容易,并且有一些ONNX特定的字段,但除此之外是相同的YAML。
最后,我們使用與之前相同的$ cortex deploy命令進行部署,我們的ONNX API也是可用的。
3. 使用 Torchscript’s JIT compiler序列化
對于最后的部署,我們把PyTorch Lightning模型導出到Torchscript,并使用PyTorch的JIT編譯器提供服務。要導出模型,只需將此添加到你的訓練腳本:
這個的Python API與普通的PyTorch示例幾乎相同:
import torch
from torch import jit
from transformers import (
AutoModelForSequenceClassification,
AutoConfig,
AutoTokenizer
)
class PythonPredictor:
def __init__(self, config):
self.device = "cpu"
self.tokenizer = AutoTokenizer.from_pretrained("albert-base-v2")
self.model = jit.load("model.ts")
def predict(self, payload):
inputs = self.tokenizer.encode_plus(payload["text"], return_tensors="pt")
predictions = self.model(**inputs)[0]
if (predictions[0] > predictions[1]):
return {"class": "unacceptable"}
else:
return {"class": "acceptable"}
YAML與以前一樣,CLI命令當然是一致的。如果我們愿意,我們可以通過簡單地用新的腳本替換舊的predictor.py腳本來更新之前的PyTorch API,并再次運行$ cortex deploy:
在這里,Cortex會自動執行滾動更新,即啟動一個新的API,然后與舊API進行交換,從而防止模型更新之間的停機時間。
就是這樣。現在,你有了一個用于實時推斷的完全可操作的預測API,從Torchscript模型提供預測。
那么,你會用哪種方法呢?
這里明顯的問題是哪種方法性能最好。事實上,這里沒有一個簡單的答案,因為它取決于你的模型。
對于BERT和GPT-2這樣的Transformer模型,ONNX可以提供令人難以置信的優化(我們測量了cpu吞吐量有40倍提高)。對于其他模型,Torchscript可能比vanilla PyTorch表現得更好 —— 盡管這也帶來了一些警告,因為并不是所有的模型都清晰地導出到Torchscript。
幸運的是,使用任何選項都可以很容易地進行部署,因此可以并行測試這三種方法,看看哪種最適合你的特定API.?
英文原文:towardsdatascience.com/how-to-depl…
原文鏈接:https://juejin.cn/post/7144899265381269512
相關推薦
- 2022-11-14 swiftui開發之padding默認值設置詳解_Swift
- 2022-12-05 一文教你如何優雅處理Golang中的異常_Golang
- 2023-03-26 詳解C/C++中低耦合代碼的設計實現_C 語言
- 2022-07-25 基于?Redis?實現接口限流的方式_Redis
- 2022-05-20 SpringBoot配置文件簡介
- 2023-01-13 Pytorch中關于BatchNorm2d的參數解釋_python
- 2022-09-02 基于Python實現配置熱加載的方法詳解_python
- 2022-07-20 Python3.7.2環境安裝
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支