Je dois utiliser le modèle catboost dans certains langages de programmation (golang et python). La meilleure option (pour les performances et la compatibilité) consiste à utiliser une bibliothèque d'évaluation, qui peut être une API C ou C++. J'ai compilé l'API C en suivant la documentation officielle, mais elle présente de nombreux problèmes qui doivent être résolus pour fonctionner.
Voici les problèmes que nous avons rencontrés en essayant de créer une bibliothèque d'évaluation en 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);
Solution :
modelhandle
comme : modelcalcerhandle *modelhandle = modelcalcercreate();
Après avoir effectué cette modification, le programme c peut être compilé, mais nous obtenons une nouvelle erreur :
[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;
et
if (!CalcModelPredictionSingle( modelHandle, &floatFeatures, 3, &catFeatures, 4, result, 1)) //We remove `&` { printf("CalcModelPrediction error message: %s\n", GetErrorString()); }
J'ajouterai la solution complète dans les commentaires, des corrections de code à la façon de compiler le code C.
Voici la solution complète :
git 克隆 https://github.com/catboost/catboost.git
Ouvrez le répertoire catboost à partir de votre copie locale du référentiel catboost.
Construisez la bibliothèque d'évaluation (j'ai choisi la bibliothèque partagée, mais vous pouvez choisir de quelle bibliothèque vous avez besoin). Dans mon cas j'ai dû changer le paramètre --target-platform
, j'utilise mac m1 et macos ventura 13.1, la version clang est 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); }
Considérez :
setpredictiontype
sur 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/
Important : Assurez-vous qu'aucun message d'avertissement ou d'erreur ne s'affiche.
Important : Assurez-vous que le fichier du modèle catboost se trouve dans le même chemin que program.out
.
./program.out
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!