本文为您介绍如何为基于通用Processor的Caffe服务构造请求数据。

输入数据说明

PAI-EAS预置了Caffe Processor,为保证性能,其输入输出为ProtoBuf格式。

调用案例

PAI-EAS在华东2(上海)的VPC环境中部署了一个Public的测试案例,其服务名称为caffenet_serving_example,访问Token为空。您可以通过URLhttp://pai-eas-vpc.cn-shanghai.aliyuncs.com/api/predict/caffenet_serving_example访问该服务。具体方式如下:
  1. 获取模型信息。
    通过Caffe服务的model文件,可以查看模型每个layer的相关信息。例如该案例的model文件内容如下。
    name: "CaffeNet"
    layer {
      name: "data"
      type: "Input"
      top: "data"
      input_param {
        shape {
          dim: 10
          dim: 3
          dim: 227
          dim: 227
        }
      }
    }
    ....
    layer {
      name: "prob"
      type: "Softmax"
      bottom: "fc8"
      top: "prob"
    }
    该模型是一个经典的CaffeNet模型,type取值为Inputlayer(通常为第一层layer)声明模型的输入,最后一层layer声明模型的输出。该模型的输入shape[10, 3, 227, 227],其中第一维表示batch_size(如果单个请求只包含一张图片,则batch_size为1)。构建输入时,无论shape取值如何,都必须将输入展开成一维向量。该示例中,构建输入时,需要将输入构建为1*3*227*227的一维向量。如果服务请求中指定的shape与模型的shape不一致,则预测请求报错。
  2. 安装ProtoBuf并调用服务(以Python为例,介绍如何对Caffe服务进行调用)。
    PAI-EAS为Python预先生成了ProtoBuf包,您可以使用如下命令直接安装。
    $ pip install http://eas-data.oss-cn-shanghai.aliyuncs.com/pai_caffe_predict_proto-1.0-py2.py3-none-any.whl
    调用服务进行预测的示例代码如下。
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    import requests
    from pai_caffe_predict_proto import caffe_predict_pb2
    # build request.
    request = caffe_predict_pb2.PredictRequest()
    request.input_name.extend(['data'])
    array_proto = caffe_predict_pb2.ArrayProto()
    array_proto.shape.dim.extend([1, 3, 227, 227])
    array_proto.data.extend([1.0]*3*227*227)
    request.input_data.extend([array_proto])
    # 将ProtoBuf转换成string进行传输。
    data = request.SerializeToString()
    # 该API需要在华东2(上海)的VPC内访问。
    url = 'http://pai-eas-vpc.cn-shanghai.aliyuncs.com/api/predict/caffenet_serving_example'
    s = requests.Session()
    resp = s.post(url, data=data)
    if resp.status_code != 200:
        print resp.content
    else:
        response = caffe_predict_pb2.PredictResponse()
        response.ParseFromString(resp.content)
        print(response)

其它语言的调用方法

除Python外,使用其它语言客户端调用服务都需要根据.proto文件手动生成预测的请求代码文件。调用示例如下:
  1. 编写请求代码文件(例如创建caffe.proto文件),内容如下。
    syntax = "proto2";
    package caffe.eas;
    option java_package = "com.aliyun.openservices.eas.predict.proto";
    option java_outer_classname = "CaffePredictProtos";
    message ArrayShape {
      repeated int64 dim = 1 [packed = true];
    }
    message ArrayProto {
      optional ArrayShape shape = 1;
      repeated float data = 2 [packed = true];
    }
    message PredictRequest {
      repeated string input_name = 1;
      repeated ArrayProto input_data = 2;
      repeated string output_filter = 3;
    }
    message PredictResponse {
      repeated string output_name = 1;
      repeated ArrayProto output_data = 2;
    }
    其中 PredictRequest定义caffe服务的输入格式,PredictResponse定义服务的输出格式。关于ProtoBuf的详细用法请参见ProtoBuf介绍
  2. 安装protoc。
    #/bin/bash
    PROTOC_ZIP=protoc-3.3.0-linux-x86_64.zip
    curl -OL https://github.com/google/protobuf/releases/download/v3.3.0/$PROTOC_ZIP
    unzip -o $PROTOC_ZIP -d ./ bin/protoc
    rm -f $PROTOC_ZIP
  3. 生成请求代码文件:
    • Java版本
      $ bin/protoc --java_out=./ caffe.proto
      命令执行完成后,系统会在当前目录生成com/aliyun/openservices/eas/predict/proto/CaffePredictProtos.java,在项目中导入该文件即可。
    • Python版本
      $ bin/protoc --python_out=./ caffe.proto
      命令执行完成后,系统会在当前目录生成caffe_pb2.py,通过import命令导入该文件即可。
    • C++版本
      $ bin/protoc --cpp_out=./ caffe.proto
      命令执行完成后,系统在当前目录生成caffe.pb.cccaffe.pb.h。在代码中使用include caffe.pb.h命令,并将caffe.pb.cc添加至compile列表即可。