PAI-EAS支持通过Python官方SDK或自行实现调用逻辑的方式对服务进行VPC高速直连调用。本文详细介绍这两种调用方式的实现方法。

调用原理

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

前提条件

  • 仅支持对部署在专属资源组中的服务进行VPC高速直连调用,因此需要购买(创建)专属资源组,详情请参见开通及购买
  • 部署服务前,需要为专属资源组开通VPC高速直连功能,详情请参见VPC高速直连

调用方式

为方便用户调用服务,PAI-EAS提供了以下两种方式实现VPC高速直连调用:
  • 使用官方SDK调用(Python)

    PAI-EAS封装了调用逻辑并提供了Python官方SDK,您可以直接使用该SDK实现VPC高速直连调用。

  • 自行实现调用逻辑

    推荐使用官方SDK调用服务,从而有效减少编写调用逻辑的时间并提高服务调用稳定性。如果您需要使用其他语言或希望自己编写实现调用逻辑,下文也提供了方法指导供您参考。此外,自行实现调用逻辑需要根据不同框架构建服务请求,详情请参见构建通用Processor服务请求

使用官方SDK调用(Python)

使用Python官方SDK调用服务的方法如下:
  1. 安装。
    pip install -U eas-prediction --user
    该Python DSK的调用详情请参见GitHub官网
  2. 编写调用程序。
    以字符串作为输入输出的程序为例,其他格式(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环境中,通过如下地址即可获得服务的后端地址列表。
地域 地址
华东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/
例如访问华东1(杭州)的%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的ipportweight信息。您可以实现一个weighted round robin算法,在每次调用服务前获取一个Instance,并对其进行VPC直连访问。
说明 您需要从服务端定期同步Endpoint List至本地,每次请求前,从本地Cache中根据WRR(Weighted Round Robin)算法随机访问一个Instance。如果每次请求前从服务端获取Endpoint List,则会大幅度降低访问性能。
服务更新或节点异常发生Failover时,部分Instance可能不可用。因此检测到请求失败时,客户端需要进行自动重试,以避免健康检查失败的Instance在从Instance List中移除的延时过程中被访问,进而造成服务质量下降。