Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk membina API perpustakaan penilaian Catboost C?

Bagaimana untuk membina API perpustakaan penilaian Catboost C?

WBOY
WBOYke hadapan
2024-02-06 08:15:08540semak imbas

如何构建Catboost C评估库API?

Kandungan soalan

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:

  1. Kami menyelesaikan masalah #1 dengan mentakrifkan semula pembolehubah modelhandle sebagai:
modelcalcerhandle *modelhandle = modelcalcercreate();

Selepas membuat perubahan ini, program c boleh disusun, tetapi kami mendapat ralat baharu:

[1]    6489 segmentation fault  ./program
  1. Kesalahan pembahagian adalah berkaitan dengan amaran yang disenaraikan dalam soalan #2. Kita perlu mentakrifkan semula pembolehubah untuk membetulkannya:
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.


Jawapan betul


Ini adalah penyelesaian lengkapnya:

  1. Klon repositori catboost:

git 克隆 https://github.com/catboost/catboost.git

  1. Buka direktori catboost daripada salinan tempatan anda bagi repositori catboost.

  2. 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
  1. Buat fail c. Kod contoh c tetap:
#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:

  • Saya telah menetapkan setpredictiontype kepada apt_probability
  • Model kami meramalkan berbilang kelas, jadi result[4].
  • Kami hanya perlu meramal satu rekod pada satu masa, jadi kami menggunakan kaedah calcmodelpredictionsingle.
  1. Kompil c kod:
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.

  1. Kini anda boleh menjalankannya:

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam