Categories
程式開發

AWS和Facebook合作推出PyTorch模型服務框架TorchServe:可讓模型快速投入生產


近日,Facebook和AWS合作推出了PyTorch模型服務庫TorchServe,強強聯手劍指Google TensorFlow。

PyTorch是當下最火的深度學習開源庫之一,可以幫助開發者和研究人員更輕鬆地構建和訓練模型。即便有了PyTorch,在生產中部署和管理模型仍然是機器學習的一大難題,包括構建定制的預測API,對其進行縮放以及保證其安全等問題。

簡化模型部署過程的一種方法是使用模型服務器,即專門設計用於在生產中提供機器學習預測的現成的Web應用程序。模型服務器可輕鬆加載一個或多個模型,並自動創建由可伸縮Web服務器支持的預測API。它們還能夠根據預測請求運行預處理和後處理代碼。最後一個要點是,模型服務器還提供了一些在生產中至關重要的功能,例如日誌記錄、監視和安全。目前比較受歡迎的模型服務器包括TensorFlow Serving和Multi Model Server。

今天,我非常高興地宣布TorchServe——PyTorch模型服務庫,能在不編寫自定義代碼的情況下輕鬆地大規模部署訓練好的PyTorch模型。

TorchServe概述

TorchServe是由AWS和Facebook合作開發的PyTorch模型服務庫,是PyTorch開源項目的一部分。

項目地址:https://github.com/pytorch/serve

借助TorchServe,PyTorch用戶可以更快地將其模型應用於生產,而無需編寫自定義代碼:除了提供低延遲預測API之外,TorchServe還為一些最常見的應用程序嵌入了默認處理程序,例如目標檢測和文本分類。此外,TorchServe包括多模型服務、用於A / B測試的模型版本控制、監視指標以及用於應用程序集成的RESTful端點。如你所料,TorchServe支持任何機器學習環境,包括Amazon SageMaker、容器服務和Amazon Elastic Compute Cloud(EC2)。一些客戶已經在體驗TorchServe的優越性了。

豐田研究院高級開發有限公司(TRI-AD)正在為豐田汽車公司開發自動駕駛軟件。 TRI-AD機器學習工具負責人Yusuke Yachide稱:

我們在不斷優化和改進計算機視覺模型,這對於踐行TRI-AD以人為本,安全出行的自動駕駛使命至關重要。我們的模型是通過AWS上的PyTorch進行訓練的,但是直到現在,PyTorch仍缺乏模型服務框架。因此,我們花費了大量的技術成本來創建和維護用於將PyTorch模型部署到豐田車輛和雲服務器車隊的軟件。有了TorchServe,我們現在擁有了高性能、輕量級的模型服務器,該服務器由AWS和PyTorch社區支持和維護。

Matroid是計算機視覺軟件的製造商,該軟件可檢測視頻鏡頭中的目標和事件。 Matroid公司創始人兼首席執行官Reza Zadeh表示:

我們在AWS和本地環境上使用PyTorch在短時間內很快開發出了大量的機器學習模型。使用自定義模型服務器部署模型,需要將模型轉換為其他格式,既費時又麻煩。 TorchServe允許我們使用單個可服務文件簡化模型部署,該文件也可作為真實情況的唯一來源,並且易於共享和管理。
下面,我就來展示下如何安裝 TorchServe以及如何加載一個在Amazon Elastic Compute Cloud (EC2)上預先訓練好的模型。

TorchServe的安裝

首先,我啟動了一個基於CPU 的 Amazon Elastic Compute Cloud(EC2)instance運行深度學習AMI(Ubuntu版)。該AMI預先安裝了一些我需要的依賴項,這將加快設置速度。當然,你可以改用任何AMI。

TorchServe用Java實現,我需要最新的OpenJDK才能運行它。

sudo apt install openjdk-11-jdk

接下來,我為TorchServe創建並激活一個新的Conda環境。這將使我的Python軟件包保持整潔(當然virtualenv也可以)。

conda create -n torchserve
source activate torchserve

接下來,我為TorchServe安裝依賴項。

pip install sentencepiece       # not available as a Conda package
conda install psutil pytorch torchvision torchtext -c pytorch

如果開發者使用的是GPU instance,則需要一個額外的程序包。

conda install cudatoolkit=10.1

現在已經安裝了依賴項,我可以克隆TorchServe存儲庫,然後安裝TorchServe。

git clone https://github.com/pytorch/serve.git
cd serve
pip install .
cd model-archiver
pip install .

設置已經完成,就可以部署模型了。

部署模型

為了進行此演示,我將簡單地從PyTorch模型Zoo中下載預訓練好的模型。在現實生活中,你可以使用自己的模型。

wget https://download.pytorch.org/models/densenet161-8d451a50.pth

接下來,我需要將模型打包到模型文件夾中。模型文件夾是一個ZIP文件,其中存儲了所有模型構件,即模型本身(densitynet161-8d451a50.pth)、用於加載狀態機庫(張量與層匹配)的Python腳本以及你可能需要的任何其他文件。在這裡,我介紹一個名為index_to_name.json的文件,該文件能將類標識符映射到類名上。該文件將應用於負責預測邏輯的內置的image_classifier處理程序上。其他內置處理程序也可用其他文件實現(object_detector、text_classifier、image_segmenter),你也可以使用自己的文件來實現。

torch-model-archiver --model-name densenet161 --version 1.0 
--model-file examples/image_classifier/densenet_161/model.py 
--serialized-file densenet161-8d451a50.pth 
--extra-files examples/image_classifier/index_to_name.json 
--handler image_classifier

接下來,我創建一個目錄來存儲模型文件夾,然後將剛才創建的目錄移到那裡。

mkdir model_store
mv densenet161.mar model_store/

現在,我可以啟動TorchServe,將其指向模型存儲和要加載的模型。當然,如果需要,我可以加載多個模型。

torchserve --start --model-store model_store --models densenet161=densenet161.mar

還是在同一台計算機上,我抓取一張圖像並將其輕鬆發送到TorchServe上,以使用HTTP POST請求進行本地服務。請要特別注意URL的格式,包括要使用的模型的名稱。
curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg

curl -X POST http://127.0.0.1:8080/predictions/densenet161 -T kitten.jpg
結果立即就出來了。這裡要強調下,由於借助了內置處理程序,因此類名是可見的。

[
{"tiger_cat": 0.4693356156349182},
{"tabby": 0.46338796615600586},
{"Egyptian_cat": 0.06456131488084793},
{"lynx": 0.0012828155886381865},
{"plastic_bag": 0.00023323005007114261}
]

然後,使用“ stop ”命令停止TorchServe。

torchserve --stop

如上所見,使用默認配置可以輕鬆開始使用TorchServe。接下來,我就來介紹下如何設置它來進行遠程服務。

配置TorchServe來進行遠程服務

先來為 TorchServe創建一個名為 config.properties(默認名稱)的配置文件。該文件定義了要加載的模型,並設置了遠程服務。在這裡,我將服務器綁定到所有公共IP地址,你也可以根據需要將其限制為特定的地址。由於這是在 EC2 instance上運行的,因此我需要確保在安全組中打開了8080和8081端口。

model_store=model_store
load_models=densenet161.mar
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081

現在,我可以在同一目錄中啟動TorchServe,而不必傳遞任何命令行參數。

torchserve --start

現在回到我的本地計算機上,我可以遠程調用TorchServe,並獲得相同的結果。

curl -X POST http://ec2-54-85-61-250.compute-1.amazonaws.com:8080/predictions/densenet161 -T kitten.jpg

你或許也注意到我使用了HTTP。我猜很多人在生產中都需要HTTPS,所以我將來展示下如何進行設置。

為HTTPS配置TorchServe

TorchServe可以使用Java密鑰庫或證書。後面內容將逐一介紹。

首先,我使用openssl創建證書和私鑰。

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

然後,更新配置文件以定義證書和密鑰的位置,並將TorchServe綁定到其默認安全端口(別忘記更新安全組)。

model_store=model_store
load_models=densenet161.mar
inference_address=https://0.0.0.0:8443
management_address=https://0.0.0.0:8444
private_key_file=mykey.key
certificate_file=mycert.pem

我重新啟動TorchServe,現在可以使用HTTPS調用它。由於我使用了自簽名證書時,所以需要將“——insecure”標誌傳到curl。

curl --insecure -X POST https://ec2-54-85-61-250.compute-1.amazonaws.com:8443/predictions/densenet161 -T kitten.jpg

原文鏈接:

https://aws.amazon.com/cn/blogs/aws/announcing-torchserve-an-open-source-model-server-for-pytorch/