全部产品
云市场

Caffe服务请求构造

更新时间:2019-04-08 17:10:15

Caffe模型服务请求构造

输入数据说明

PAI-EAS内置了Caffe processor,用户可一键将caffe模型部署成服务,出于性能考虑输入输出为protobuf,用户需按需求以protobuf的形式构建输入。下面我们以一个实际的例子进讲解如何对基于通用processor的Caffe服务构造调用数据并进行服务请求。

调用案例

我们在cn-shanghai部署了一个public的测试Demo,服务名字为caffenet_serving_example,访问token为空,在上海vpc环境中,用户可通过
http://pai-eas-vpc.cn-shanghai.aliyuncs.com/api/predict/caffenet_serving_example 
这个地址对服务进行访问。

1.获取模型信息

在caffe的model文件中记录了模型每个layer的相关信息,如果不清楚模型的相关信息,可以查看该文件,例如上面部署的caffenet模型,其model文件内容如下所示:

  1. name: "CaffeNet"
  2. layer {
  3. name: "data"
  4. type: "Input"
  5. top: "data"
  6. input_param {
  7. shape {
  8. dim: 10
  9. dim: 3
  10. dim: 227
  11. dim: 227
  12. }
  13. }
  14. }
  15. ....
  16. layer {
  17. name: "prob"
  18. type: "Softmax"
  19. bottom: "fc8"
  20. top: "prob"
  21. }

这是一个经典的caffenet模型,type为Input的layer声明了模型的输入(一般为第一层layer),最后一层layer声明了模型的输出。可以看到该模型的输入shape为[10, 3, 227, 227],其中第一维为batch_size, 若单个请求只包含一张图片,则batch_size为1。在构建输入时不论shape是什么,我们都需要将输入展开成一维向量进行传入,在该例子中,在构建输入时同样需要将输入构建成1*3*227*227的一维向量,若request中指定的shape与模型的shape不一致,则预测请求会报错。

2. 客户端使用Python进行预测

我们以python为例介绍如何对tensorflow服务进行调用,首先需要生成输入的protobuf格式的request文件,我们为python预先生成了pb包,可直接通过下面的命令进行安装:

  1. $ pip install http://eas-data.oss-cn-shanghai.aliyuncs.com/pai_caffe_predict_proto-1.0-py2.py3-none-any.whl

示例代码如下所示:

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import requests
  4. from pai_caffe_predict_proto import caffe_predict_pb2
  5. # build request
  6. request = caffe_predict_pb2.PredictRequest()
  7. request.input_name.extend(['data'])
  8. array_proto = caffe_predict_pb2.ArrayProto()
  9. array_proto.shape.dim.extend([1, 3, 227, 227])
  10. array_proto.data.extend([1.0]*3*227*227)
  11. request.input_data.extend([array_proto])
  12. # 将pb序列化成string进行传输
  13. data = request.SerializeToString()
  14. # 该API需要上海vpc内访问
  15. url = 'http://pai-eas-vpc.cn-shanghai.aliyuncs.com/api/predict/caffenet_serving_example'
  16. s = requests.Session()
  17. resp = s.post(url, data=data)
  18. if resp.status_code != 200:
  19. print resp.content
  20. else:
  21. response = caffe_predict_pb2.PredictResponse()
  22. response.ParseFromString(resp.content)
  23. print(response)

3. 其它语言版本使用方法

除了python外其它语言的客户端,用户需要根据proto文件自行生成预测的request代码文件,创建caffe.proto,文件内容为:

  1. syntax = "proto2";
  2. package caffe.eas;
  3. option java_package = "com.aliyun.openservices.eas.predict.proto";
  4. option java_outer_classname = "CaffePredictProtos";
  5. message ArrayShape {
  6. repeated int64 dim = 1 [packed = true];
  7. }
  8. message ArrayProto {
  9. optional ArrayShape shape = 1;
  10. repeated float data = 2 [packed = true];
  11. }
  12. message PredictRequest {
  13. repeated string input_name = 1;
  14. repeated ArrayProto input_data = 2;
  15. repeated string output_filter = 3;
  16. }
  17. message PredictResponse {
  18. repeated string output_name = 1;
  19. repeated ArrayProto output_data = 2;
  20. }

其中protobuf的详细用法参考:https://developers.google.com/protocol-buffers/ , PredictRequest定义caffe服务的输入格式,PredictResponse定义服务的输出格式。

安装protoc

执行下面的脚本可安装protoc

  1. #/bin/bash
  2. PROTOC_ZIP=protoc-3.3.0-linux-x86_64.zip
  3. curl -OL https://github.com/google/protobuf/releases/download/v3.3.0/$PROTOC_ZIP
  4. unzip -o $PROTOC_ZIP -d ./ bin/protoc
  5. rm -f $PROTOC_ZIP

生成Request代码文件

  • Java版本:
  1. $ bin/protoc --java_out=./ caffe.proto

执行完成后在当前目录下生成com/aliyun/openservices/eas/predict/proto/CaffePredictProtos.java,在项目中导入该文件即可。

  • Python版本:
  1. $ bin/protoc --python_out=./ caffe.proto

执行完成后在当前目前下生成caffe_pb2.py,直接import即可。

  • C++版本
  1. $ bin/protoc --cpp_out=./ caffe.proto

执行完成后在当前目录下生成caffe.pb.cc和caffe.pb.h,在code中include caffe.pb.h并将caffe.pb.cc加入compile列表即可。