Triton推理伺服器在阿里雲機器學習PAI-EAS公測啦!!!
引言
近些年來,隨著GPU等計算設備算力的飛速提升,對算力要求較高的深度學習模型逐步開始在網購、醫療、音影片領域有了越來越廣泛的應用。如何結合深度學習框架,用好高算力的GPU設備,是我們在AI基礎建設中遇到的一個至關重要的問題。NVIDIA 公司從硬體廠商的角度出發推出了Trition推理伺服器,阿里雲PAI平台從雲原生服務角度出發,推出了PAI-EAS雲原生彈性推理服務平台,目的都是為了更好地幫助用戶更好更方便地部署深度學習,提供優質的在線預測服務。
首先我們來了解一下Triton和EAS具體是什麼,以及我們為什麼要將兩者進行有機的結合。
什麼是Triton?
Triton推理伺服器(NVIDIA Triton Inference Server) 是NVIDIA 公司推出的開源推理框架,為用戶提供在雲和邊緣推理上部署的解決方案。下圖為Triton的架構圖:
Triton Inference Server具有以下的特性:
· 支援多種開源框架的部署,包括TensorFlow/PyTorch/ONNX Runtime/TensorRT等,同時也支援用戶提供自定義的服務後端(backend);
· 支援多個模型同時運行在GPU上,以提高GPU設備的利用率;
· 支援HTTP/gRPC通訊協議,提供二進位格式擴展來壓縮發送請求大小;
· 支援Dynamic Batching功能,提升服務的吞吐;
· 支援兼容KFServing的API標準。
什麼是PAI-EAS?
阿里雲機器學習平台PAI,旨在為阿里雲的用戶提供輕量化、高性價比的雲原生機器學習。為了幫助用戶打通模型訓練到模型部署的通路,針對在線推理場景提供了新一代AI推理平台:PAI-EAS(Elastic Algorithm Service),
目前已經穩定支援阿里巴巴集團多個BU的深度學習模型預測服務以及大量公有雲客戶的在線預測服務。
下圖為PAI-EAS總體架構:
從圖中可以看出PAI-EAS支援以下特性:
· 支援基於異構硬體(CPU和GPU)的模型部署;
· 支援通用機器學習/深度學習框架模型一鍵部署成在線服務,也提供兼容開源Serving的服務部署方式;
· 與雲原生產品深度整合,支援模型服務管理,服務監控,日誌採集查詢,網路鏈路優化等功能;
· 自研的高性能服務引擎,對下層異構推理引擎透明支援模型預熱,自動Batch,流量鏡像等能力;
· 分層架構設計,可提供簡單易用的微服務開發介面,用戶可用多種語言開發自定義的推理業務邏輯。
為什麼將Triton部署在EAS上
將Triton Inference Server部署在EAS上,一方面可以使EAS的用戶能夠方便的使用Triton在NVIDIA GPU設備上多框架多模型部署的能力。另一方面可以充分利用EAS在雲原生產品上的深度整合,藉助基於雲原生的負載均衡,服務管理,網路鏈路優化,資源彈性伸縮等能力。兩方面相結合,獲得了1+1>2的效果,使得用戶可以方便地獲取穩定且性能優異的預測服務,支援多種多樣的使用場景,未來還可以使用我們集成到EAS中的針對不同框架模型的通用優化能力,例如Blade等。
如何使用Triton on EAS
使用準備工作
1. 使用Triton github repo中提供的腳本,下載Inception模型,同時準備好以下的配置文件來聲明部署模型的輸入輸出等資訊,並將模型文件、配置文件以及模型對應的label文件都放置在一個目錄中;
name: “inception_graphdef”
platform: “tensorflow_graphdef”
max_batch_size: 128
input [
{
name: “input”
data_type: TYPE_FP32
format: FORMAT_NHWC
dims: [ 299, 299, 3 ]
}
]
output [
{
name: “InceptionV3/Predictions/Softmax”
data_type: TYPE_FP32
dims: [ 1001 ]
label_filename: “inception_labels.txt”
}
]
2. 開通阿里雲對象存儲服務對象存儲服務OSS,完成配置後,使用ossutil將準備好的模型文件夾整個上傳到特定的OSS路徑中;
./ossutil cp inception_graphdef/ oss://triton-model-repo/models
3. 開通EAS的專屬資源組,目前只有專屬資源組支援部署Triton服務。
在做完前置的準備工作之後,先要在EAS上部署Triton服務,然後再去請求已經部署好的服務,獲取推理預測的結果。
如何在EAS上部署Triton服務
Triton部署於EAS採用了內置processor的部署形式,processor是EAS服務的必要元素,一般意義下是包含了服務對請求的完整處理邏輯。相比於一般的EAS內置processor部署方式,除了指定processor類型為”triton”以外,只需要新增一個processor_params欄位將Triton啟動時支援的參數傳入即可。
下面為我們創建一個Triton服務時使用的配置文件的示例:
{
“name”: “triton_test”,
“processor”: “triton”,
“processor_params”: [
“–model-repository=oss://triton-model-repo/models”,
“–allow-http=true”,
],
“metadata”: {
“instance”: 1,
“cpu”: 4,
“gpu”: 1,
“memory”: 10000,
“resource”:”<your resource id>”
}
}
注意:
1. model-repository參數需要直接傳入OSS路徑,但是目前不支援直接從用戶bucket根目錄直接載入模型,推薦將模型上傳到bucket下的某個目錄中。
2. 當前僅支援使用EASCMD創建Triton服務
下面是使用EASCMD創建服務時,我們可以命令行中看到的輸出,最後可以看到服務的URL以及token,以及服務創建過程中的狀態變化
./eascmd create triton.config
[RequestId]: AECDB6A4-CB69-4688-AA35-BA1E020C39E6
+——————-+————————————————————————————————+
| Internet Endpoint | //****************.cn-shanghai.pai-eas.aliyuncs.com/api/predict/test_triton_processor |
| Intranet Endpoint | //****************.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/test_triton_processor |
| Token | MmY3M2ExZG***********************WM1ZTBiOWQ3MGYxZGNkZQ== |
+——————-+————————————————————————————————+
[OK] Service is now deploying
[OK] Successfully synchronized resources
[OK] Waiting [Total: 1, Pending: 1, Running: 0]
[OK] Waiting [Total: 1, Pending: 1, Running: 0]
[OK] Running [Total: 1, Pending: 0, Running: 1]
[OK] Service is running
如何訪問EAS上的Triton服務
Triton on EAS完全兼容Triton社區提供的Python Client,下面我們以社區提供的Inception模型為例,說明如何來向部署在EAS上的Triton服務發起請求。首先我們按照Triton官方提供的方式,來安裝Python Client。
pip3 install nvidia-pyindex
pip3 install tritonclient[all]
完成Triton服務部署之後,如果沒有保存EASCMD命令行中輸出的URL以及token,還可以在PAI控制台–模型部署–EAS-模型在線服務頁面可以看到類似以下的服務詳情,其中也可以查到服務的URL以及訪問服務需要使用的授權token。
填充程式碼中的URL以及token,即可使用使用這個demo,對Triton的服務中的Inception模型發起請求。
import numpy as np
import time
import tritonclient.http as httpclient
from tritonclient.utils import InferenceServerException
URL = “<servcice url>”
HEADERS = {“Authorization”: “<service token>”}
input_img = httpclient.InferInput(“input”, [1, 299, 299, 3], “FP32”)
rand_img = np.random.rand(1, 299, 299, 3).astype(np.float32)
input_img.set_data_from_numpy(rand_img, binary_data=True)
output = httpclient.InferRequestedOutput(
“InceptionV3/Predictions/Softmax”, binary_data=True
)
triton_client = httpclient.InferenceServerClient(url=URL, verbose=False)
start = time.time()
for i in range(10):
results = triton_client.infer(
“inception_graphdef”, inputs=[input_img], outputs=[output], headers=HEADERS
)
res_body = results.get_response()
elapsed_ms = (time.time() – start) * 1000
if i == 0:
print(“model name: “, res_body[“model_name”])
print(“model version: “, res_body[“model_version”])
print(“output name: “, res_body[“outputs”][0][“name”])
print(“output shape: “, res_body[“outputs”][0][“shape”])
print(“[{}] Avg rt(ms): {:.2f}”.format(i, elapsed_ms))
start = time.time()
執行之後,我們可以獲得以下的輸出,在第一次運行時,還額外列印了模型以及輸出的相應資訊,確認了對模型的調用請求是如我們期望的。
model name: inception_graphdef
model version: 1
output name: InceptionV3/Predictions/Softmax
output shape: [1, 1001]
[0] Avg rt(ms): 76.29
[1] Avg rt(ms): 43.45
[2] Avg rt(ms): 37.30
[3] Avg rt(ms): 34.17
[4] Avg rt(ms): 32.26
[5] Avg rt(ms): 30.52
[6] Avg rt(ms): 30.34
[7] Avg rt(ms): 29.13
[8] Avg rt(ms): 23.56
[9] Avg rt(ms): 23.42
結語
目前Triton on EAS已經在上海區域開始公測,歡迎大家在阿里雲官網搜索「機器學習平台PAI」來踴躍試用。我們也將基於Triton,提供更多的深度學習在線部署能力給用戶。Triton on EAS將支援更多的功能,保證用戶在EAS上使用Triton的體驗:
· 支援gRPC協議,支援Java Client(Coming very soon!)
· 支援Blade優化接入Triton