このトピックでは、CまたはC ++ を使用してカスタムプロセッサを開発する方法について説明します。
クイックスタートデモ
pai-prediction-exampleプロジェクトをダウンロードします。 このプロジェクトには、次の2つのカスタムプロセッサが含まれます。
echo: リクエストを受信すると、このプロセッサは変更なしでユーザー入力とモデル内のファイルのリストを返します。
image_classification: このプロセッサはMNIST分類に使用されます。 JPG形式のMNISTイメージが入力された場合、イメージカテゴリが返されます。
コンパイルの詳細については、プロジェクトのREADMEファイルを参照してください。 各プロセッサのオンプレミスデバッグの詳細については、対応するディレクトリのREADMEファイルを参照してください。
インターフェイスの定義
CまたはC ++ を使用してカスタムプロセッサを開発するには、initialize() およびProcess() 関数を定義する必要があります。 initialize() 関数は、サービスの初期化中にモデルをロードするために使用されます。 Process() 関数は、クライアント要求を処理して結果を返すために使用されます。 次のコードブロックは、2つの関数の宣言の例を示しています。
void * initialize(const char * model_entry, const char * model_config, int * state)
パラメーター | データ型 | 説明 |
model_entry | 入力パラメーター | モデルパッケージのエントリファイル。 このパラメーターは、サービスの作成時に構成ファイルのmodel_entryフィールドに対応します。 model_entryフィールドの詳細については、「サービスの作成」をご参照ください。 などのファイル名を指定できます。randomforest.pmmlのようなディレクトリ、または. /モデル. |
model_config | 入力パラメーター | モデルのカスタム構成情報。 このパラメーターは、サービスの作成時に設定ファイルのmodel_configフィールドに対応します。 model_configフィールドの詳細については、「サービスの作成」をご参照ください。 |
です。 | 出力パラメータ | モデルの読み込みのステータス。 値が0の場合、モデルが読み込まれます。 そうしないと、モデルの読み込みに失敗します。 |
返された値 | すべてのタイプをサポートするモデルのメモリアドレス。 モデルはmodel変数で指定されます。 |
int process(void * model_buf, const void * input_data, int input_size,void **output_data, int * output_size)
パラメーター | データ型 | 説明 |
model_buf | 入力パラメーター | initialize() 関数によって返されるモデルメモリアドレス。 |
input_data | 入力パラメーター | 入力するデータ。文字列またはBINARY型のデータです。 |
input_size | 入力パラメーター | 入力したデータの長さ。 |
output_data | 出力パラメータ | プロセッサによって返されるデータ。 データにヒープメモリを割り当てる必要があります。 モデルは、構成されたメモリを解放する。 |
output_size | 出力パラメータ | プロセッサによって返されるデータの長さ。 |
返された値 | 0または200が返された場合、要求は成功です。 HTTPエラーコードを返すことができます。 未定義のHTTPステータスコードが返されると、自動的にhttp 400エラーに変換されます。 |
サンプルコード
次のサンプルコードでは、モデルデータは読み込まれません。 予測サービスは、ユーザ要求をクライアントに返す。
#include <stdio.h>
#include <string.h>
extern "C" {
void *initialize(const char *model_entry, const char *model_config, int *state)
{
*state = 0;
return NULL;
}
int process(void *model_buf, const void *input_data, int input_size,
void **output_data, int *output_size)
{
if (inputSize == 0) {
const char *errmsg = "input data should not be empty";
*outputData = strndup(errmsg, strlen(errmsg));
*outputSize = strlen(errmsg);
return 400;
}
*outputData = strndup((char *)inputData, inputSize);
*outputSize = inputSize;
return 200;
}
}
次のサンプルコードでは、プロセッサはモデル情報を読み取らず、変更なしでユーザー入力データを返します。 入力データは、次のMakefileに基づいてSOファイルとしてコンパイルできます。
CC=g++
CCFLAGS=-I./ -D_GNU_SOURCE -Wall -g -fPIC
LDFLAGS= -shared -Wl,-rpath=./
OBJS=processor.o
TARGET=libpredictor.so
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(LDFLAGS) -L./
%.o: %.cc
$(CC) $(CCFLAGS) -c $< -o $@
clean:
rm -f $(TARGET) $(OBJS)