推荐使用PAI-EAS提供的官方SDK进行服务调用,从而有效减少编写调用逻辑的时间并提高调用稳定性。本文介绍官方Python SDK接口详情,并以常见类型的输入输出为例,提供了使用Python SDK进行服务调用的完整程序示例。

安装方法

pip install -U eas-prediction --user

接口列表

接口 描述
PredictClient PredictClient(endpoint, service_name)
  • 功能:PredictClient类的构造方法。
  • 参数:
    • endpoint:服务端的Endpoint地址。

      如果是普通服务,则设置为默认网关Endpoint。例如182848887922***.cn-shanghai.pai-eas.aliyuncs.com

      如果是VPC直连请求,则设置为当前地域的通用Endpoint。例如,华东2(上海)设置为pai-eas-vpc.cn-shanghai.aliyuncs.com

    • service_name:服务名字。
set_endpoint(endpoint)
  • 功能:设置服务的Endpoint地址。
  • 参数:endpoint表示服务端的Endpoint地址。

    如果是普通服务,则设置为默认网关Endpoint。例如182848887922***.cn-shanghai.pai-eas.aliyuncs.com

    如果是VPC直连请求,则设置为当前地域的通用Endpoint。例如,华东2(上海)设置为pai-eas-vpc.cn-shanghai.aliyuncs.com

set_service_name(service_name)
  • 功能:设置请求的服务名字。
  • 参数:service_name请求的服务名字。
set_endpoint_type(endpoint_type)
  • 功能:设置服务端的网关类型。
  • 参数:endpoint_type待设置的网关类型,支持以下网关类型:
    • ENDPOINT_TYPE_GATEWAY:默认网关。
    • ENDPOINT_TYPE_DIRECT:表示直连请求。如果没有手动设置该参数,则默认通过网关访问服务。
set_token(token)
  • 功能:设置服务访问的Token。
  • 参数:token表示服务访问的Token。
set_retry_count(max_retry_count)
  • 功能:设置请求失败的重试次数。
  • 参数:max_retry_count表示请求失败的重试次数,默认为5。
    注意 对于服务端进程异常、服务器异常或网关长连接断开等情况导致的个别请求失败,均需要客户端重新发送请求。因此,请勿将该参数设置为0。
set_max_connection_count(max_connection_count)
  • 功能:设置客户端连接池中长链接数量的最大值。出于性能考虑,客户端会与服务端建立长连接,并将连接放入连接池中。每次请求时,从连接池中获取一个空闲连接访问服务。
  • 参数:max_connection_count表示连接池中最大的长连接数量,默认值为100。
set_timeout(timeout)
  • 功能:设置请求的超时时间。
  • 参数:timeout表示请求的超时时间。单位为ms,默认值为5000。
init() 对PredictClient对象进行初始化。在上述设置参数的接口执行完成后,需要调用init()接口才能生效。
predict(request)
  • 功能:向在线预测服务提交一个预测请求。
  • 参数:request是一个抽象类,可以输入不同类型的request,例如StringRequest或TFRequest。
  • 返回值:返回请求对应的Response。
StringRequest StringRequest(request_data)
  • 功能:StringRequest类的构造方法。
  • 参数:request_data表示待发送的请求字符串。
StringResponse to_string()
  • 功能:将StringResponse类转换为字符串。
  • 返回值:返回请求的Response Body。
TFRequest TFRequest(signature_name)
  • 功能:TFRequest类构造方法。
  • 参数:signature_name表示待请求模型中的Signature Name。
add_feed(self, input_name, shape, data_type, content)
  • 功能:请求TensorFlow在线预测服务模型时,设置需要输入的input数据。
  • 参数:
    • input_name:输入Tensor的别名。
    • shape:输入Tensor的TensorShape。
    • data_type:输入Tensor的DataType,支持以下类型:
      • TFRequest.DT_FLOAT
      • TFRequest.DT_DOUBLE
      • TFRequest.DT_INT8
      • TFRequest.DT_INT16
      • TFRequest.DT_INT32
      • TFRequest.DT_INT64
      • TFRequest.DT_STRING
      • TFRequest.TF_BOOL
    • content:输入Tensor的内容,通过一维数组展开表示。
add_fetch(self, output_name)
  • 功能: 请求TensorFlow在线预测服务模型时,设置需要输出的Tensor别名。
  • 参数:output_name表示待输出Tensor的别名。

    对于SavedModel模型,该参数可选。如果没有设置该参数,则输出所有的outputs

    对于Frozen Model,该参数必选。

to_string()
  • 功能:将TFRequest构建的用于请求传输的ProtoBuf对象序列化成字符串。
  • 返回值:TFRequest序列化后的字符串。
TFResponse get_tensor_shape(output_name)
  • 功能:获得指定别名的输出Tensor的TensorShape。
  • 参数:output_name表示待获取Shape的Tensor别名。
  • 返回值:输出的TensorShape。
get_values(output_name)
  • 功能:获取输出Tensor的数据向量。
  • 参数:output_name表示待获取结果数据的Tensor别名。
  • 返回值:输出结果以一维数组的形式保存。您可以搭配get_tensor_shape()接口,获取对应Tensor的Shape,将其还原成所需的多维Tensor。接口会根据output的类型,返回不同类型的结果数组。
TorchRequest TorchRequest() TorchRequest类的构造方法。
add_feed(self, index, shape, data_type, content)
  • 功能:请求PyTorch在线预测服务模型时,设置需要输入的Tensor。
  • 参数:
    • index:待输入Tensor的下标。
    • shape:输入Tensor的TensorShape。
    • data_type表示输入Tensor的DataType,支持以下类型:
      • TFRequest.DT_FLOAT
      • TFRequest.DT_DOUBLE
      • TFRequest.DT_INT8
      • TFRequest.DT_INT16
      • TFRequest.DT_INT32
      • TFRequest.DT_INT64
      • TFRequest.DT_STRING
      • TFRequest.TF_BOOL
    • content:输入Tensor的内容,通过一维数组展开表示。
add_fetch(self, output_index)
  • 功能:请求PyTorch在线预测服务模型时,设置需要输出Tensor的Index。该接口为可选,如果您没有调用该接口设置输出Tensor的Index,则输出所有的outputs
  • 参数:output_index表示输出Tensor的Index。
to_string()
  • 功能:将TorchRequest构建的用于请求传输的ProtoBuf对象序列化成字符串。
  • 返回值:TorchRequest序列化后的字符串。
TorchResponse get_tensor_shape(output_index)
  • 功能:获得指定下标的输出Tensor的TensorShape。
  • 参数:待获取Shape的输出Tensor的Index。
  • 返回值:下标Index对应的输出Tensor的Shape。
get_values(output_index)
  • 功能:获取输出Tensor的数据向量,输出结果以一维数组的形式保存。您可以搭配使用get_tensor_shape()接口,获取对应Tensor的Shape,将其还原成所需的多维Tensor。接口会根据output的类型,返回不同类型的结果数组。
  • 参数:output_index表示待获取的输出 Tensor对应的下标。
  • 返回值:返回的结果Tensor的数据数组。

程序示例

  • 字符串输入输出示例
    对于使用自定义Processor部署服务的用户而言,通常采用字符串进行服务调用(例如,PMML模型服务的调用),具体的Demo程序如下。
    #!/usr/bin/env python
    
    from eas_prediction import PredictClient
    from eas_prediction import StringRequest
    
    if __name__ == '__main__':
        client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'scorecard_pmml_example')
        client.set_token('YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****')
        client.init()
    
        request = StringRequest('[{"fea1": 1, "fea2": 2}]')
        for x in range(0, 1000000):
            resp = client.predict(request)
            print(resp)
  • TensorFlow输入输出示例
    使用TensorFlow的用户,需要将TFRequest和TFResponse分别作为输入和输出数据格式,具体Demo示例如下。
    #!/usr/bin/env python
    
    from eas_prediction import PredictClient
    from eas_prediction import StringRequest
    from eas_prediction import TFRequest
    
    if __name__ == '__main__':
        client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
        client.set_token('YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****')
        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)
  • 通过VPC网络直连方式调用服务的示例
    通过网络直连方式,您只能访问部署在PAI-EAS专属资源组的服务,且需要为该资源组与用户指定的vSwitch连通网络后才能使用。关于如何购买PAI-EAS专属资源组和连通网络,请参见专属资源组VPC高速直连。该调用方式与普通调用方式相比,仅需增加一行代码client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)即可,特别适合大流量高并发的服务,具体示例如下。
    #!/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-hangzhou.aliyuncs.com', 'mnist_saved_model_example')
        client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****')
        client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)
        client.init()
    
        request = TFRequest('predict_images')
        request.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
        for x in range(0, 1000000):
            resp = client.predict(request)
            print(resp)
  • PyTorch输入输出示例
    使用PyTorch的用户,需要将TorchRequest和TorchResponse分别作为输入和输出数据格式,具体Demo示例如下。
    #!/usr/bin/env python
    
    from eas_prediction import PredictClient
    from eas_prediction import TorchRequest
    
    if __name__ == '__main__':
        client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'pytorch_gpu_wl')
        client.init()
    
        req = TorchRequest()
        req.add_feed(0, [1, 3, 224, 224], TorchRequest.DT_FLOAT, [1] * 150528)
        # req.add_fetch(0)
        import time
        st = time.time()
        timer = 0
        for x in range(0, 10):
            resp = client.predict(req)
            timer += (time.time() - st)
            st = time.time()
            print(resp.get_tensor_shape(0))
            # print(resp)
        print("average response time: %s s" % (timer / 10) )
  • BladeProcessor输入输出示例
    使用BladeProcessor的用户,需要将BladeRequest和BladeResponse分别作为输入和输出数据格式,具体Demo示例如下。
    #!/usr/bin/env python
    
    from eas_prediction import PredictClient
    from eas_prediction import BladeRequest 
    
    if __name__ == '__main__':
        client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
        client.init()
    
        req = BladeRequest()
    
        req.add_feed('input_data', 1, [1, 360, 128], BladeRequest.DT_FLOAT, [0.8] * 85680)
        req.add_feed('input_length', 1, [1], BladeRequest.DT_INT32, [187])
        req.add_feed('start_token', 1, [1], BladeRequest.DT_INT32, [104])
        req.add_fetch('output', BladeRequest.DT_FLOAT)
        import time
        st = time.time()
        timer = 0
        for x in range(0, 10):
            resp = client.predict(req)
            timer += (time.time() - st)
            st = time.time()
            # print(resp)
            # print(resp.get_values('output'))
            print(resp.get_tensor_shape('output'))
        print("average response time: %s s" % (timer / 10) )
  • 兼容PAI-EAS默认TensorFlow接口的BladeProcessor输入输出示例
    BladeProcessor用户可以使用兼容PAI-EAS默认TensorFlow接口的TFRequest与TFResponse作为数据的输入输出格式,具体Demo示例如下。
    #!/usr/bin/env python
    
    from eas_prediction import PredictClient
    from eas_prediction.blade_tf_request import TFRequest # Need Importing blade TFRequest 
    
    if __name__ == '__main__':
        client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
        client.init()
    
        req = TFRequest(signature_name='predict_words')
    
        req.add_feed('input_data', [1, 360, 128], TFRequest.DT_FLOAT, [0.8] * 85680)
        req.add_feed('input_length', [1], TFRequest.DT_INT32, [187])
        req.add_feed('start_token', [1], TFRequest.DT_INT32, [104])
        req.add_fetch('output')
        import time
        st = time.time()
        timer = 0
        for x in range(0, 10):
            resp = client.predict(req)
            timer += (time.time() - st)
            st = time.time()
            # print(resp)
            # print(resp.get_values('output'))
            print(resp.get_tensor_shape('output'))
        print("average response time: %s s" % (timer / 10) )