本文為您介紹如何為基于通用Processor的Caffe服務構造請求數(shù)據(jù)。

輸入數(shù)據(jù)說明

PAI-EAS預置了Caffe Processor,為保證性能,其輸入輸出為ProtoBuf格式。

調用案例

PAI-EAS在華東2(上海)的VPC環(huán)境中部署了一個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"
    }
    該模型是一個經(jīng)典的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外,使用其它語言客戶端調用服務都需要根據(jù).proto文件手動生成預測的請求代碼文件。調用示例如下:
  1. 編寫請求代碼文件(例如創(chuàng)建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
      命令執(zhí)行完成后,系統(tǒng)會在當前目錄生成com/aliyun/openservices/eas/predict/proto/CaffePredictProtos.java,在項目中導入該文件即可。
    • Python版本
      $ bin/protoc --python_out=./ caffe.proto
      命令執(zhí)行完成后,系統(tǒng)會在當前目錄生成caffe_pb2.py,通過import命令導入該文件即可。
    • C++版本
      $ bin/protoc --cpp_out=./ caffe.proto
      命令執(zhí)行完成后,系統(tǒng)在當前目錄生成caffe.pb.cccaffe.pb.h。在代碼中使用include caffe.pb.h命令,并將caffe.pb.cc添加至compile列表即可。