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

Bagaimana untuk membina API perpustakaan penilaian Catboost C?

WBOY
Lepaskan: 2024-02-06 08:15:08
ke hadapan
629 orang telah melayarinya

如何构建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;
Salin selepas log masuk
  • 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);
    Salin selepas log masuk

    Penyelesaian:

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

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

    [1]    6489 segmentation fault  ./program
    Salin selepas log masuk
  • 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;
    Salin selepas log masuk

    dan

    if (!CalcModelPredictionSingle(
            modelHandle,
            &floatFeatures, 3,
            &catFeatures, 4,
            result, 1)) //We remove `&`
    {
       printf("CalcModelPrediction error message: %s\n", GetErrorString());
    }
    Salin selepas log masuk

    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

  • 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
    Salin selepas log masuk
  • 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);
    }
    Salin selepas log masuk

    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.
  • 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/
    Salin selepas log masuk

    Penting: Pastikan tiada amaran atau mesej ralat dipaparkan.

  • Kini anda boleh menjalankannya:
  • Penting: Pastikan fail model catboost berada di laluan yang sama seperti program.out.

    ./program.out
    Salin selepas log masuk

    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!

    sumber:stackoverflow.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan