是否可以在 Python 中训练 xgboost 模型并将其部署在 C/C++ 中运行?
Posted
技术标签:
【中文标题】是否可以在 Python 中训练 xgboost 模型并将其部署在 C/C++ 中运行?【英文标题】:Is it possible to train an xgboost model in Python and deploy it Run it in C/C++? 【发布时间】:2018-11-09 22:04:36 【问题描述】:不同语言 API 之间有多少交叉兼容性?
例如,是否可以用 Python 训练和保存模型并用 C/C++ 或任何其他语言运行它?
我会自己尝试一下,但是我在非 Python 语言方面的技能非常有限。
【问题讨论】:
【参考方案1】:您可以将模型转储到文本文件中,如下所示:
model.get_booster().dump_model('xgb_model.txt')
然后你应该解析文本转储并在 C++ 中重现预测函数。
如果您想节省一些时间并确保使用快速实现,我已经在我称为 FastForest 的小库中实现了这一点:
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> input0.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));
【讨论】:
【参考方案2】:treelite
包(research paper、documentation)支持将基于树的模型(包括 XGBoost)编译为优化的 C 代码,从而比使用原生模型库更快地进行推理。
【讨论】:
【参考方案3】:您可以考虑使用将模型转储到文本文件中
model.get_booster().dump_model('xgb_model.txt', with_stats=True)
然后,经过一些解析,您可以轻松地在 C/C++ 中重现 .predict()
函数。对于其余部分,我不知道将 xgboost 本地移植到 C
【讨论】:
以上是关于是否可以在 Python 中训练 xgboost 模型并将其部署在 C/C++ 中运行?的主要内容,如果未能解决你的问题,请参考以下文章