全部产品
云市场

C/C++开发自定义Processor

更新时间:2019-11-12 15:22:52

1. QuickStart Demo


https://github.com/pai-eas/pai-prediction-example


上述项目包含两个自定义processor的demo:

  • [echo] 请求时将用户输入原样返回,同时返回模型中的文件列表
  • [image_classification] mnist文本分类,输入mnist jpg图片,返回图片分类类别


编译方法见project README,每个processor的本地调试方法见各自目录下的README


2. 接口定义

使用C/C++开发processor,用户需要定义两个函数Load()和Process(),分别用于在服务初始化的时候加载模型和每次收到用户请求时对请求进行相应的处理后返回结果,两个函数的声明如下:


  1. 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变量的内存地址,可为任意类型,由用户自定义


  1. 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返回的数据长度


返回值

返回0或200表示成功,可直接返回http错误码,若返回不识别的http错误码,则自动转换为http 400 error

3. 代码示例

下面是一个简单的示例,未加载任何模型数据,预测服务将用户请求直接返回给客户端。

  1. #include <stdio.h>
  2. #include <string.h>
  3. extern "C" {
  4. void *initialize(const char *model_entry, const char *model_config, int *state)
  5. {
  6. *state = 0;
  7. return NULL;
  8. }
  9. int process(void *model_buf, const void *input_data, int input_size,
  10. void **output_data, int *output_size)
  11. {
  12. if (inputSize == 0) {
  13. const char *errmsg = "input data should not be empty";
  14. *outputData = strndup(errmsg, strlen(errmsg));
  15. *outputSize = strlen(errmsg);
  16. return 400;
  17. }
  18. *outputData = strndup((char *)inputData, inputSize);
  19. *outputSize = inputSize;
  20. return 200;
  21. }
  22. }


该processor未读取任何模型信息,将用户输入原样输出给用户,可通过下面的Makefile编译成一个.so

  1. CC=g++
  2. CCFLAGS=-I./ -D_GNU_SOURCE -Wall -g -fPIC
  3. LDFLAGS= -shared -Wl,-rpath=./
  4. OBJS=processor.o
  5. TARGET=libpredictor.so
  6. all: $(TARGET)
  7. $(TARGET): $(OBJS)
  8. $(CC) -o $(TARGET) $(OBJS) $(LDFLAGS) -L./
  9. %.o: %.cc
  10. $(CC) $(CCFLAGS) -c $< -o $@
  11. clean:
  12. rm -f $(TARGET) $(OBJS)


若有其它依赖的.so,务必在Makefile中添加-rpath选项,指定.so的搜索目录,rpath原理可参考https://en.wikipedia.org/wiki/Rpath