使用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

输入参数

对应创建服务时JSON配置文件中的model_entry字段,关于该字段的更多信息请参见JSON部署参数说明。您可以传入一个文件名(例如randomforest.pmml)或目录(例如./model)。

model_config

输入参数

对应创建服务时配置文件中的model_config字段,表示自定义的模型配置信息。关于该字段的更多信息请参见JSON部署参数说明

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

使用示例

以下是一个简单的使用示例。在线预测代码未加载任何模型数据,将用户输入原样直接返回给客户端。

  1. 编写预测代码。

    #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;
        }
    }
  2. 通过如下的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)
  3. 部署为EAS服务。服务部署所需的JSON配置文件中关于Processor的配置项如下所示。其中,processor_entry表示Processor的主文件,即上一步的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
    	}
    }