Saya perlu menggunakan model catboost dalam beberapa bahasa pengaturcaraan (golang dan python). Pilihan terbaik (untuk prestasi dan keserasian) ialah menggunakan perpustakaan penilaian, yang boleh menjadi API C atau C++. Saya menyusun API C mengikut dokumentasi rasmi, tetapi ia mempunyai banyak isu yang perlu diselesaikan untuk berfungsi.
Ini adalah masalah yang kami hadapi semasa cuba membuat perpustakaan penilaian dalam c:
1.
error: variable has incomplete type 'modelcalcerhandle' (aka 'void') modelcalcerhandle modelhandle;
c_wrapper.c:16:13: warning: incompatible pointer types passing 'float (*)[3]' to parameter of type 'const float **' [-wincompatible-pointer-types] &floatfeatures, 3, ^~~~~~~~~~~~~~ /users/eli/workspace/test_c_api/catboost/catboost/libs/model_interface/c_api.h:151:19: note: passing argument to parameter 'floatfeatures' here const float** floatfeatures, size_t floatfeaturessize, ^ c_wrapper.c:17:13: warning: incompatible pointer types passing 'char *(*)[4]' to parameter of type 'const char ***' [-wincompatible-pointer-types] &catfeatures, 4, ^~~~~~~~~~~~ /users/eli/workspace/test_c_api/catboost/catboost/libs/model_interface/c_api.h:152:19: note: passing argument to parameter 'catfeatures' here const char*** catfeatures, size_t catfeaturessize, ^ c_wrapper.c:18:13: warning: incompatible pointer types passing 'double (*)[1]' to parameter of type 'double *' [-wincompatible-pointer-types] &result, 1 ^~~~~~~ /users/eli/workspace/test_c_api/catboost/catboost/libs/model_interface/c_api.h:153:13: note: passing argument to parameter 'result' here double* result, size_t resultsize);
Penyelesaian:
modelhandle
sebagai: modelcalcerhandle *modelhandle = modelcalcercreate();
Selepas membuat perubahan ini, program c boleh disusun, tetapi kami mendapat ralat baharu:
[1] 6489 segmentation fault ./program
float floatfeaturesraw[100]; const float *floatfeatures = floatfeaturesraw; const char *catfeaturesraw[2] = {"1", "2"}; const char **catfeatures = catfeaturesraw; double resultraw[1]; double *result = resultraw;
dan
if (!CalcModelPredictionSingle( modelHandle, &floatFeatures, 3, &catFeatures, 4, result, 1)) //We remove `&` { printf("CalcModelPrediction error message: %s\n", GetErrorString()); }
Saya akan menambah penyelesaian lengkap dalam komen, dari pembetulan kod hingga cara menyusun kod c.
Ini adalah penyelesaian lengkapnya:
git 克隆 https://github.com/catboost/catboost.git
Buka direktori catboost daripada salinan tempatan anda bagi repositori catboost.
Bina perpustakaan penilaian (saya memilih perpustakaan kongsi, tetapi anda boleh memilih perpustakaan yang anda perlukan). Dalam kes saya, saya terpaksa menukar parameter --target-platform
, saya menggunakan mac m1 dan macos ventura 13.1, versi clang ialah 14.0.0:
./ya make -r catboost/libs/model_interface --target-platform clang14-darwin-arm64
#include <stdio.h> #include <c_api.h> int main() { float floatfeaturesraw[3] = {0, 89, 1}; const float *floatfeatures = floatfeaturesraw; const char *catfeaturesraw[4] = {"others", "443_https", "6", "24"}; const char **catfeatures = catfeaturesraw; double resultraw[4]; double *result = resultraw; modelcalcerhandle *modelhandle = modelcalcercreate(); if (!loadfullmodelfromfile(modelhandle, "catboost_model")) { printf("loadfullmodelfromfile error message: %s\n", geterrorstring()); } setpredictiontype(modelhandle, 3); if (!calcmodelpredictionsingle( modelhandle, floatfeatures, 3, catfeatures, 4, result, 4)) { printf("calcmodelprediction error message: %s\n", geterrorstring()); } printf("%f\n", result[0]); printf("%f\n", result[1]); printf("%f\n", result[2]); printf("%f\n", result[3]); modelcalcerdelete(modelhandle); }
Pertimbangkan:
setpredictiontype
kepada apt_probabilityresult[4]
. calcmodelpredictionsingle
. gcc -v -o program.out c_code.c -l catboostmodel -i /path/to/catboost/repo/catboost/catboost/libs/model_interface/ -l /path/to/catboost/repo/catboost/catboost/libs/model_interface/
Penting: Pastikan tiada amaran atau mesej ralat dipaparkan.
Penting: Pastikan fail model catboost berada di laluan yang sama seperti program.out
.
./program.out
Atas ialah kandungan terperinci Bagaimana untuk membina API perpustakaan penilaian Catboost C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!