PAI-EAS支持通过Python官方SDK或自行实现调用逻辑的方式对服务进行VPC高速直连调用。本文详细介绍这两种调用方式的实现方法。
调用原理
VPC高速直连调用、公网调用及VPC地址调用的链路如下图所示。
开启服务运行所在资源组的VPC高速直连功能后,无需通过网关访问服务,避免了四层SLB和七层网络转发,您可以在自己的VPC中直接访问PAI-EAS实例。同时,PAI-EAS预置的RPC实现了HTTP相关协议栈,对于高QPS(Queries
Per Second)的大流量服务(例如图像服务),可以大幅度提高访问性能、降低访问延时。

前提条件
调用方式
为方便用户调用服务,PAI-EAS提供了以下两种方式实现VPC高速直连调用:
- 使用官方SDK调用(Python)
PAI-EAS封装了调用逻辑并提供了Python官方SDK,您可以直接使用该SDK实现VPC高速直连调用。
- 自行实现调用逻辑
推荐使用官方SDK调用服务,从而有效减少编写调用逻辑的时间并提高服务调用稳定性。如果您需要使用其他语言或希望自己编写实现调用逻辑,下文也提供了方法指导供您参考。此外,自行实现调用逻辑需要根据不同框架构建服务请求,详情请参见构建通用Processor服务请求。
使用官方SDK调用(Python)
使用Python官方SDK调用服务的方法如下:
- 安装。
该Python DSK的调用详情请参见GitHub官网。pip install -U eas-prediction --user
- 编写调用程序。
以字符串作为输入输出的程序为例,其他格式(TensorFlow或PyTorch等)的输入输出程序示例请参见GitHub官网。
其中#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest from eas_prediction import ENDPOINT_TYPE_DIRECT if __name__ == '__main__': client = PredictClient('http://pai-eas-vpc.cn-shanghai.aliyuncs.com', 'mnist_saved_model_example') client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # 表示通过直连通道访问服务。 client.init() #request = StringRequest('[{}]') req = TFRequest('predict_images') req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) for x in range(0, 1000000): resp = client.predict(req) print(resp)
client = PredictClient()
的函数入参源于VPC调用的访问地址。例如VPC调用的访问地址为http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/heart_predict_online,则PredictClient()
函数的调用格式为client = PredictClient('http://166408185518****.vpc.cn-hangzhou.pai-eas.aliyuncs.com','heart_predict_online')
。
自行实现调用逻辑
如果您需要使用其他语言或希望自己编写调用逻辑,则可以参见如下方法,自行实现直连访问功能,采用HTTP接口调用。PAI-EAS提供服务发现机制,在VPC环境中,通过如下地址即可获得服务的后端地址列表。
例如访问华东1(杭州)的
服务更新或节点异常发生Failover时,部分Instance可能不可用。因此检测到请求失败时,客户端需要进行自动重试,以避免健康检查失败的Instance在从Instance
List中移除的延时过程中被访问,进而造成服务质量下降。
地域 | 地址 |
---|---|
华东2(上海) | http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
华北2(北京) | http://pai-eas-vpc.cn-beijing.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
华东1(杭州) | http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
%mnist_saved_model_example;
服务(该服务有两个Instance),示例如下。$curl http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
获得的服务后端地址列表如下。{ "correlative": [ "mnist_saved_model_example" ], "endpoints": { "items": [ { "app": "mnist-saved-model-example", "ip": "172.16.XX.XX", "port": 50000, "weight": 100 }, { "app": "mnist-saved-model-example", "ip": "172.16.XX.XX", "port": 50000, "weight": 100 } ] } }如上所示,客户端可以获得该服务后端对应的两个Instance的ip、port及weight信息。您可以实现一个weighted round robin算法,在每次调用服务前获取一个Instance,并对其进行VPC直连访问。
说明 您需要从服务端定期同步Endpoint List至本地,每次请求前,从本地Cache中根据WRR(Weighted Round Robin)算法随机访问一个Instance。如果每次请求前从服务端获取Endpoint
List,则会大幅度降低访问性能。