C または C++ のカスタムプロセッサは、initialize() 関数と process() 関数を定義することで、モデルのロードとリクエスト予測ロジックを実装します。
クイックスタート
pai-prediction-example プロジェクトをダウンロードします。このプロジェクトには、次の 2 つのカスタムプロセッサが含まれています:
-
echo:ユーザーの入力とモデル内のファイルリストをそのまま返します。
-
image_classification:mnist 画像分類。mnist の jpg 画像を入力として受け取り、画像の分類カテゴリを返します。
コンパイル方法はプロジェクトの README ファイルに記載されています。各プロセッサのローカルでのデバッグ方法は、それぞれのディレクトリにある README ファイルに記載されています。
インターフェイス定義
カスタムプロセッサは、initialize() と process() という 2 つの C 関数をエクスポートする必要があります。どちらも必須であり、EAS はサービスライフサイクルの異なる時点でこれらの関数を呼び出します。
| パラメーター | 方向 | 説明 |
|---|---|---|
model_entry |
入力 | デプロイメント設定ファイルの model_entry フィールドに対応し、モデルパッケージのエントリファイルを示します。このフィールドの詳細については、「JSON デプロイメント」をご参照ください。ファイル名 (例:randomforest.pmml) またはディレクトリ (例:./model) を渡すことができます。 |
model_config |
入力 | デプロイメント設定ファイルの model_config フィールドに対応し、カスタムモデルの設定情報を示します。このフィールドの詳細については、「JSON デプロイメント」をご参照ください。 |
state |
出力 | モデルのロードステータス。成功した場合は 0 に設定します。それ以外の値はロードの失敗を示します。 |
| 戻り値 | メモリにロードされたモデルへのポインター。EAS は、後続のすべての process() 呼び出しに、このポインターを model_buf として渡します。 |
|
| パラメーター | 方向 | 説明 |
|---|---|---|
model_buf |
入力 | initialize() によって返されるモデルのメモリアドレス。 |
input_data |
入力 | リクエストペイロード。文字列またはバイナリデータです。 |
input_size |
入力 | 入力データの長さ。 |
output_data |
出力 | プロセッサによって返されるデータ。メモリはヒープ上に割り当てる必要があります。メモリの解放はモデル側で行う必要があります。 |
output_size |
出力 | 出力データの長さ。 |
| 戻り値 | 応答の HTTP ステータスコード。成功した場合は 0 または 200 を返します。 |
|
HTTP ステータスコードとして認識されない戻り値は、自動的に HTTP 400 に変換されます。エラーを返す場合は、常に標準の HTTP ステータスコード (例:400または500) を使用してください。
使用例
以下に簡単な使用例を示します。このオンライン予測コードは、モデルデータをロードせず、ユーザーの入力をそのままクライアントに返します。
-
予測コードを記述します。
#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 (input_size == 0) { const char *errmsg = "input data should not be empty"; *output_data = strdup(errmsg); *output_size = strlen(errmsg); return 400; } *output_data = strdup((char *)input_data); *output_size = input_size; 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) -
EAS にサービスをデプロイします。JSON デプロイメント設定には、次のプロセッサ関連のフィールドを含める必要があります。
processor_entryはメインのプロセッサファイルを指定します。これは、前のステップで生成された .so ファイルです。{ "name": "test_echo", "model_path": "http://*****.oss-cn-shanghai.aliyuncs.com/****/saved_model.tar.gz", "processor_path": "oss://path/to/echo_processor_release.tar.gz", "processor_entry": "libpredictor.so", "processor_type": "cpp", "metadata": { "instance": 1 } }