引言
近些年来,随着GPU等计算设备算力的飞速提升,对算力要求较高的深度进修模型逐步开始在网购、医疗、音视频领域有了越来越广泛的应用。如何结合深度进修框架,用好高算力的GPU设备,是我们在AI基础建设中遇到的一个至关重要的问题。英伟达公司从硬件厂商的角度出发推出了Trition推理效劳器,阿里云PAI平台从云原生效劳角度出发,推出了PAI-EAS云原生弹性推理效劳平台,目的都是为了更好地帮助用户更好更方便地摆设深度进修,供给优质的在线预测效劳。
首先我们来了解一下Triton和EAS具体是什么,以及我们为什么要将两者进行有机的结合。
什么是Triton?
Triton推理效劳器(NVIDIA Triton Inference Server) 是英伟达公司推出的开源推理框架,为用户供给在云和边缘推理上摆设的解决方案。下图为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 | 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社区供给的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