Triton Inference Server具有以下的特性:
支持多種開源框架的部署,包括TensorFlow/PyTorch/ONNX Runtime/TensorRT等,同時也支持用戶提供自定義的服務后端(backend);支持多個模型同時運行在GPU上,以提高GPU設備的利用率;支持HTTP/gRPC通信協(xié)議,提供二進制格式擴展來壓縮發(fā)送請求大小;支持Dynamic Batching功能,提升服務的吞吐;支持兼容KFServing的API標準。
什么是PAI-EAS?
阿里云機器學習平臺PAI,旨在為阿里云的用戶提供輕量化、高性價比的云原生機器學習。為了幫助用戶打通模型訓練到模型部署的通路,針對在線推理場景提供了新一代AI推理平臺:PAI-EAS(Elastic Algorithm Service),
目前已經穩(wěn)定支持阿里巴巴集團多個BU的深度學習模型預測服務以及大量公有云客戶的在線預測服務。
下圖為PAI-EAS總體架構:
從圖中可以看出PAI-EAS支持以下特性:
支持基于異構硬件(CPU和GPU)的模型部署;支持通用機器學習/深度學習框架模型一鍵部署成在線服務,也提供兼容開源Serving的服務部署方式;與云原生產品深度整合,支持模型服務管理,服務監(jiān)控,日志采集查詢,網(wǎng)絡鏈路優(yōu)化等功能;自研的高性能服務引擎,對下層異構推理引擎透明支持模型預熱,自動Batch,流量鏡像等能力;分層架構設計,可提供簡單易用的微服務開發(fā)接口,用戶可用多種語言開發(fā)自定義的推理業(yè)務邏輯。
為什么將Triton部署在EAS上
將Triton Inference Server部署在EAS上,一方面可以使EAS的用戶能夠方便的使用Triton在NVIDIA GPU設備上多框架多模型部署的能力。另一方面可以充分利用EAS在云原生產品上的深度整合,借助基于云原生的負載均衡,服務管理,網(wǎng)絡鏈路優(yōu)化,資源彈性伸縮等能力。兩方面相結合,獲得了1+1>2的效果,使得用戶可以方便地獲取穩(wěn)定且性能優(yōu)異的預測服務,支持多種多樣的使用場景,未來還可以使用我們集成到EAS中的針對不同框架模型的通用優(yōu)化能力,例如Blade等。
如何使用Triton on EAS
使用準備工作
使用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”
}
]
開通阿里云對象存儲服務對象存儲服務OSS,完成配置后,使用ossutil將準備好的模型文件夾整個上傳到特定的OSS路徑中;
./ossutil cp inception_graphdef/ oss://triton-model-repo/models
開通EAS的專屬資源組,目前只有專屬資源組支持部署Triton服務。
在做完前置的準備工作之后,先要在EAS上部署Triton服務,然后再去請求已經部署好的服務,獲取推理預測的結果。
如何在EAS上部署Triton服務
Triton部署于EAS采用了內置processor的部署形式,processor是EAS服務的必要元素,一般意義下是包含了服務對請求的完整處理邏輯。相比于一般的EAS內置processor部署方式,除了指定processor類型為”triton”以外,只需要新增一個processor_params字段將Triton啟動時支持的參數(shù)傳入即可。
下面為我們創(chuàng)建一個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”:””
}
}
注意:
model-repository參數(shù)需要直接傳入OSS路徑,但是目前不支持直接從用戶bucket根目錄直接加載模型,推薦將模型上傳到bucket下的某個目錄中。當前僅支持使用EASCMD創(chuàng)建Triton服務
下面是使用EASCMD創(chuàng)建服務時,我們可以命令行中看到的輸出,最后可以看到服務的URL以及token,以及服務創(chuàng)建過程中的狀態(tài)變化
./eascmd create triton.config
[RequestId]: AECDB6A4-CB69-4688-AA35-BA1E020C39E6
+——————-+————————————————————————————————+
| Internet Endpoint | http://****************.cn-shanghai.pai-eas.aliyuncs.com/api/predict/test_triton_processor |
| Intranet Endpoint | http://****************.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社區(qū)提供的Python Client,下面我們以社區(qū)提供的Inception模型為例,說明如何來向部署在EAS上的Triton服務發(fā)起請求。首先我們按照Triton官方提供的方式,來安裝Python Client。
pip3 install nvidia-pyindex
pip3 install tritonclient[all]
完成Triton服務部署之后,如果沒有保存EASCMD命令行中輸出的URL以及token,還可以在PAI控制臺–模型部署–EAS-模型在線服務頁面可以看到類似以下的服務詳情,其中也可以查到服務的URL以及訪問服務需要使用的授權token。
填充代碼中的URL以及token,即可使用使用這個demo,對Triton的服務中的Inception模型發(fā)起請求。
import numpy as np
import time
import tritonclient.http as httpclient
from tritonclient.utils import InferenceServerException
URL = “”
HEADERS = {“Authorization”: “”}
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()
執(zhí)行之后,我們可以獲得以下的輸出,在第一次運行時,還額外打印了模型以及輸出的相應信息,確認了對模型的調用請求是如我們期望的。
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已經在上海區(qū)域開始公測,歡迎大家在阿里云官網(wǎng)搜索“機器學習平臺PAI”來踴躍試用。我們也將基于Triton,提供更多的深度學習在線部署能力給用戶。Triton on EAS將支持更多的功能,保證用戶在EAS上使用Triton的體驗:
支持gRPC協(xié)議,支持Java Client(Coming very soon!)支持Blade優(yōu)化接入Triton。