日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用C或C++開發自定義Processor

本文為您介紹如何使用CC++開發自定義Processor。

快速上手Demo

下載EAS預測服務示例,該項目包含兩個自定義Processor,其中:

  • echo:請求時將用戶輸入原樣返回,同時返回模型中的文件列表。

  • image_classificationmnist文本分類,輸入mnist jpg圖片,返回圖片分類類別。

編譯方法請參見項目下的README文件,每個Processor的本地調試方法請參見各目錄下的README文件。

接口定義

使用CC++開發自定義Processor,需要定義initialize()process()函數,分別用于服務初始化時加載模型和處理客戶端請求并返回結果。兩個函數的聲明如下。

void *initialize(const char *model_entry, const char *model_config, int *state)

參數

類型

描述

model_entry

輸入參數

對應創建服務時配置文件中的model_entry字段,關于該字段的更多信息請參見創建服務。您可以傳入一個文件名(例如randomforest.pmml)或目錄(例如./model)。

model_config

輸入參數

對應創建服務時配置文件中的model_config字段,表示自定義的模型配置信息。關于該字段的更多信息請參見創建服務

state

輸出參數

模型加載狀態。如果為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

輸出參數

Processor返回的數據,需要在堆為其分配內存,模型負責釋放該內存。

output_size

輸出參數

Processor返回的數據長度。

返回值

返回0200表示成功,可以直接返回HTTP錯誤碼。如果返回不識別的HTTP錯誤碼,則自動轉換為http 400 error

代碼示例

以下是一個簡單的示例,未加載任何模型數據,預測服務將用戶請求直接返回給客戶端。

#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;
    }
}

Processor未讀取任何模型信息,將用戶輸入原樣輸出,可以通過如下的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)