首頁  >  文章  >  後端開發  >  如何建構Catboost C評估庫API?

如何建構Catboost C評估庫API?

WBOY
WBOY轉載
2024-02-06 08:15:08599瀏覽

如何构建Catboost C评估库API?

問題內容

我必須在某些程式語言(golang 和 python)中使用 catboost 模型。最好的選擇(為了效能和相容性)是使用評估庫,它可以是 c 或 c api。我按照官方文件編譯了c api,但它有很多問題需要解決才能運作。

這些是我們在嘗試用 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);

解決方案:

  1. 我們透過將 modelhandle 變數重新定義為以下方式解決了問題 #1:
modelcalcerhandle *modelhandle = modelcalcercreate();

進行此更改後,可以編譯 c 程序,但我們收到了一個新錯誤:

[1]    6489 segmentation fault  ./program
  1. 分段錯誤與問題 #2 中列出的警告有關。我們必須重新定義變數來解決它:
float floatfeaturesraw[100];
const float *floatfeatures = floatfeaturesraw;
const char *catfeaturesraw[2] = {"1", "2"};
const char **catfeatures = catfeaturesraw;
double resultraw[1];
double *result = resultraw;

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

我將在評論中添加完整的解決方案,從程式碼修復到如何編譯 c 程式碼。


正確答案


這是完整的解決方案:

  1. 複製 catboost 儲存庫:

git 複製 https://github.com/catboost/catboost.git

  1. #從 catboost 儲存庫的本機副本中開啟 catboost 目錄。

  2. 建立評估庫(我選擇了共享庫,但您可以選擇您需要的庫)。就我而言,我必須更改 --target-platform 參數,我使用的是 mac m1 和 macos ventura 13.1,clang 版本是 14.0.0:

./ya make -r catboost/libs/model_interface --target-platform clang14-darwin-arm64
  1. 建立 c 檔案。修復了 c 範例程式碼:
#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);
}

考慮:

  • 我已將 setpredictiontype 設為 apt_probability
  • 我們的模型預測多個類別,因此 result[4]
  • 我們一次只需要預測一筆記錄,因此我們使用 calcmodelpredictionsingle 方法。
  1. 編譯 c 程式碼:
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/

重要提示:確保未顯示任何警告或錯誤訊息。

  1. 現在您可以運行它:

重要提示:確保 catboost 模型檔案與 program.out 位於相同路徑。

./program.out

以上是如何建構Catboost C評估庫API?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除