本文为您介绍如何为基于通用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版本