すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:CまたはC ++ を使用してカスタムプロセッサを開発する

最終更新日:Jul 22, 2024

このトピックでは、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)