Prosesor kustom C atau C++ mengimplementasikan logika pemuatan model dan prediksi permintaan dengan mendefinisikan fungsi initialize() dan process().
Demo quick start
Unduh proyek pai-prediction-example. Proyek ini berisi dua prosesor kustom:
-
echo: Mengembalikan input pengguna apa adanya bersama dengan daftar file dalam model.
-
image_classification: klasifikasi gambar mnist menggunakan gambar mnist jpg sebagai input, mengembalikan kategori hasil klasifikasi.
Metode kompilasi dijelaskan dalam file README proyek. Panduan debugging lokal untuk setiap prosesor tersedia dalam file README di direktori masing-masing.
Definisi antarmuka
Prosesor kustom harus mengekspor tepat dua fungsi C: initialize() dan process(). Keduanya wajib—EAS memanggilnya pada titik berbeda dalam siklus hidup layanan.
| Parameter | Arah | Deskripsi |
|---|---|---|
model_entry |
Input | Bersesuaian dengan bidang model_entry dalam file konfigurasi deployment, yang menunjukkan file entri dari paket model. Untuk informasi lebih lanjut tentang bidang ini, lihat deployment JSON. Anda dapat memberikan nama file (misalnya, randomforest.pmml) atau direktori (misalnya, ./model). |
model_config |
Input | Bersesuaian dengan bidang model_config dalam file konfigurasi deployment, yang menunjukkan informasi konfigurasi model kustom. Untuk informasi lebih lanjut tentang bidang ini, lihat deployment JSON. |
state |
Output | Status pemuatan model. Diatur ke 0 jika berhasil; nilai lain menandakan kegagalan pemuatan. |
| Nilai kembalian | Pointer ke model yang dimuat di memori. EAS meneruskan pointer ini ke setiap pemanggilan process() berikutnya sebagai model_buf. |
|
| Parameter | Arah | Deskripsi |
|---|---|---|
model_buf |
Input | Alamat memori model yang dikembalikan oleh initialize(). |
input_data |
Input | Muatan permintaan. Dapat berupa string atau data biner. |
input_size |
Input | Panjang data input. |
output_data |
Output | Data yang dikembalikan oleh prosesor. Anda harus mengalokasikan memori di heap. Model bertanggung jawab untuk melepaskan memori tersebut. |
output_size |
Output | Panjang data output. |
| Nilai kembalian | Kode status HTTP untuk respons. Kembalikan 0 atau 200 untuk keberhasilan. |
|
Nilai kembalian yang bukan merupakan kode status HTTP yang dikenali akan secara otomatis dikonversi menjadi HTTP 400. Selalu gunakan kode status HTTP standar (misalnya,400atau500) saat mengembalikan error.
Contoh penggunaan
Berikut contoh penggunaan sederhana. Kode prediksi online tidak memuat data model apa pun dan mengembalikan input pengguna ke klien apa adanya.
-
Tulis kode prediksi.
#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; } } -
Kompilasi kode menjadi file .so menggunakan 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) -
Terapkan layanan di EAS. Konfigurasi deployment JSON harus mencakup bidang terkait prosesor berikut.
processor_entrymenentukan file prosesor utama, yaitu file .so yang dihasilkan pada langkah sebelumnya.{ "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 } }