本文為您介紹如何為基于通用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訪問該服務。具體方式如下:
- 獲取模型信息。
通過Caffe服務的model文件,可以查看模型每個layer的相關信息。例如該案例的model文件內容如下。
該模型是一個經典的CaffeNet模型,type取值為Input的layer(通常為第一層layer)聲明模型的輸入,最后一層layer聲明模型的輸出。該模型的輸入shape為[10, 3, 227, 227],其中第一維表示batch_size(如果單個請求只包含一張圖片,則batch_size為1)。構建輸入時,無論shape取值如何,都必須將輸入展開成一維向量。該示例中,構建輸入時,需要將輸入構建為1*3*227*227的一維向量。如果服務請求中指定的shape與模型的shape不一致,則預測請求報錯。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" }
- 安裝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文件手動生成預測的請求代碼文件。調用示例如下:
- 編寫請求代碼文件(例如創建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介紹。 - 安裝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
- 生成請求代碼文件:
- Java版本
命令執行完成后,系統會在當前目錄生成com/aliyun/openservices/eas/predict/proto/CaffePredictProtos.java,在項目中導入該文件即可。$ bin/protoc --java_out=./ caffe.proto
- Python版本
命令執行完成后,系統會在當前目錄生成caffe_pb2.py,通過$ bin/protoc --python_out=./ caffe.proto
import
命令導入該文件即可。 - C++版本
命令執行完成后,系統在當前目錄生成caffe.pb.cc和caffe.pb.h。在代碼中使用$ bin/protoc --cpp_out=./ caffe.proto
include caffe.pb.h
命令,并將caffe.pb.cc添加至compile列表即可。
- Java版本