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