Topik ini menjelaskan cara mengembangkan prosesor kustom menggunakan C atau C++.
Demo mulai cepat
Unduh proyek pai-prediction-example. Proyek ini mencakup dua prosesor kustom berikut:
echo: Saat permintaan diterima, prosesor ini mengembalikan input pengguna tanpa perubahan serta daftar file dalam model.
image_classification: Prosesor ini digunakan untuk klasifikasi MNIST. Jika gambar MNIST dalam format JPG dimasukkan, kategori gambar akan dikembalikan.
Untuk informasi lebih lanjut tentang kompilasi, lihat file README di proyek tersebut. Untuk informasi lebih lanjut tentang debugging lokal setiap prosesor, lihat file README di direktori yang sesuai.
Definisi antarmuka
Untuk mengembangkan prosesor kustom menggunakan C atau C++, Anda harus mendefinisikan fungsi initialize() dan process(). Fungsi initialize() digunakan untuk memuat model selama inisialisasi layanan. Fungsi process() digunakan untuk memproses permintaan klien dan mengembalikan hasil. Blok kode berikut memberikan contoh deklarasi kedua fungsi tersebut:
void *initialize(const char *model_entry, const char *model_config, int *state)Parameter | Tipe | Deskripsi |
model_entry | Parameter masukan | File entri dari paket model. Parameter ini sesuai dengan bidang model_entry dalam file konfigurasi JSON saat layanan dibuat. Untuk informasi lebih lanjut tentang bidang model_entry, lihat Parameter untuk penyebaran JSON. Anda dapat menentukan nama file seperti randomforest.pmml, atau direktori seperti ./model. |
model_config | Parameter masukan | Informasi konfigurasi kustom model. Parameter ini sesuai dengan bidang model_config dalam file konfigurasi saat layanan dibuat. Untuk informasi lebih lanjut tentang bidang model_config, lihat Parameter untuk penyebaran JSON. |
state | Parameter keluaran | Status pemuatan model. Jika nilainya 0, model dimuat. Jika tidak, model gagal dimuat. |
Nilai yang dikembalikan | Alamat memori model, yang mendukung semua tipe. Model ditentukan dalam variabel model. | |
int process(void *model_buf, const void *input_data, int input_size,void **output_data, int *output_size)Parameter | Tipe | Deskripsi |
model_buf | Parameter masukan | Alamat memori model yang dikembalikan oleh fungsi initialize(). |
input_data | Parameter masukan | Data yang Anda masukkan, yang bisa berupa string atau bertipe BINARY. |
input_size | Parameter masukan | Panjang data yang Anda masukkan. |
output_data | Parameter keluaran | Data yang dikembalikan oleh prosesor. Memori heap harus dialokasikan untuk data tersebut. Model melepaskan memori sesuai konfigurasi. |
output_size | Parameter keluaran | Panjang data yang dikembalikan oleh prosesor. |
Nilai yang dikembalikan | Jika 0 atau 200 dikembalikan, permintaan berhasil. Kode kesalahan HTTP dapat dikembalikan. Jika kode status HTTP yang tidak terdefinisi dikembalikan, itu secara otomatis diubah menjadi http 400 error. | |
Kode contoh
Dalam kode contoh berikut, tidak ada data model yang dimuat. Layanan prediksi mengembalikan permintaan pengguna ke klien.
Tulis kode uji.
#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 = "data masukan tidak boleh kosong"; *output_data = strdup(errmsg); *output_size = strlen(errmsg); return 400; } *output_data = strdup((char *)input_data); *output_size = input_size; return 200; } }Kompilasi data masukan sebagai file SO berdasarkan Makefile berikut:
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)Sebarkan layanan EAS. Untuk informasi tentang parameter konfigurasi terkait prosesor dalam file konfigurasi JSON yang diperlukan untuk penyebaran layanan, lihat kode contoh berikut. processor_entry menunjukkan file utama (SO file) dari prosesor.
{ "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 } }