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封装了调用逻辑并提供了Python官方SDK。推荐使用官方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 Llist,则会大幅度降低访问性能。
    服务更新或节点异常发生Failover时,部分Instance可能不可用。因此检测到请求失败时,客户端需要进行自动重试,以避免健康检查失败的Instance在从Instance List中移除的延时过程中被访问,进而造成服务质量下降。