このトピックでは、ユニバーサルプロセッサに基づくCaffeサービスのリクエストを構築する方法について説明します。
入力データに関する注意事項
Elastic Algorithm Service (EAS) は、Caffeモデルをサービスとして展開するための組み込みのCaffeプロセッサを提供します。 パフォーマンスを保証するには、入力データと出力データがプロトコルバッファ形式であることを確認する必要があります。
例
パブリックテストモデルは、中国 (上海) リージョンでサービスとして展開されます。 サービス名はcaffenet_serving_exampleです。 このサービスには、このリージョンのVPCのすべてのユーザーがアクセスできます。 アクセストークンが指定されていません。 http://pai-eas-vpc.cn-shanghai.aliyuncs.com/api/predict/caffenet_serving_example エンドポイントにリクエストを送信して、サービスを呼び出すことができます。 次のセクションでは、サービスを呼び出す方法について説明します。
モデル情報を取得します。
Caffeモデルファイルには、モデルの各レイヤーの情報が格納されます。 ファイルを開いて関連情報を表示できます。 この例では、モデルファイルに次の内容が含まれています。
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パラメーターがInputに設定されているレイヤーは、モデルの入力を定義します。 典型的には、それは第1の層である。 最後のレイヤーはモデルの出力を定義します。 モデルの入力形状は [10、3、227、227] です。 最初のディメンションはbatch_sizeです。 リクエストにイメージが1つしか含まれていない場合、batch_sizeは1に設定されます。 入力を作成するときは、shapeの値に関係なく、1次元のベクトルにフラット化する必要があります。 この例では、1 × 3 × 227 × 227の1次元ベクトルを用いる。 リクエストで指定された入力シェイプがモデルの入力シェイプと一致しない場合、リクエストは失敗します。
プロトコルバッファをインストールし、サービスを呼び出します。 このトピックでは、Pythonクライアントを使用してCaffeサービスを呼び出す方法について説明します。
EASは、Pythonクライアント用のプロトコルバッファパッケージを提供します。 次のコマンドを実行してインストールできます。
$ 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]) # Serialize data in the Protocol Buffers format to a string and transfer the string. data = request.SerializeToString() # The API for prediction must be called from a VPC in the China (Shanghai) region. 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はサービスの出力形式を定義します。 プロトコルバッファの詳細については、「プロトコルバッファ」をご参照ください。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
$ 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.ccおよびcaffe.pb.hを含む要求コードファイルが現在のディレクトリに生成される。
include caffe.pb.hコマンドをコードに追加し、caffe.pb.ccをコンパイルリストに追加します。