代码之家  ›  专栏  ›  技术社区  ›  Greg

是否可以在Python中训练XGBOOST模型并部署它在C/C++中运行?

  •  1
  • Greg  · 技术社区  · 7 年前

    不同语言api之间有多大的交叉兼容性?

    例如,是否可以在Python中训练和保存模型并在C/C++或其他语言中运行它?

    我会亲自尝试,但是我在非python语言方面的技能非常有限。

    3 回复  |  直到 7 年前
        1
  •  0
  •   00__00__00    7 年前

    您可以考虑使用

    model.get_booster().dump_model('xgb_model.txt', with_stats=True)
    

    然后,经过一些解析,您可以轻松地重新生成 .predict() 在C/C++中的功能。其余的我不知道xgboost到c的本地移植

        2
  •  1
  •   Jonas Rembser    6 年前

    可以将模型转储到文本文件中,如下所示:

    model.get_booster().dump_model('xgb_model.txt')
    

    然后你应该解析文本转储并在C++中重现预测函数。

    我在一个我称之为 快速森林 ,如果要节省一些时间并确保使用快速实现:

    https://github.com/guitargeek/XGBoost-FastForest

    图书馆的使命是:

    • 容易的 :部署xgboost模型应该尽可能轻松
    • 快的 :由于用于存储树的数组数据结构的高效结构,此库在您的CPU和内存上非常简单(在预测方面大约比XGBoost快3到5倍)
    • 保险柜 :fastforest对象是不可变的,因此在多线程环境中是一个很好的选择。
    • 便携式 FastForest除了C++标准库之外没有依赖性。

    下面是一个小的使用示例,加载之前转储的模型,并假设该模型需要5个功能:

    std::vector<std::string> features{"f0",  "f1",  "f2",  "f3",  "f4"};
    FastForest fastForest("xgb_model.txt", features);
    
    std::vector<float> input{0.0, 0.2, 0.4, 0.6, 0.8};
    float output = fastForest(input.data());
    

    创建fastforest时,必须告诉它要按哪个顺序传递功能,因为文本文件不存储功能的顺序。

    还要注意的是,FastForest并没有为您进行逻辑转换,因此为了复制 predict_proba() 您需要应用逻辑转换:

    float proba = 1./(1. + std::exp(-output));
    
        3
  •  0
  •   Olivier Cruchant    6 年前

    这个 treelite 包装( research paper , documentation )支持将基于树的模型(包括xgboost)编译为优化的c代码,使推理比使用本机模型库快得多。