如何使用tensorflow-serving发布自定义(非tensorflow)模型?

7
我已阅读基础高级的tensorflow-serving教程,但仍不清楚如何在tensorflow-serving中构建以下支持:
  1. 使用Python构建的模型(如xgboost或scikit-learn)
  2. 使用R构建的模型(如xgboost或lightgbm)
考虑使用tf.contrib中提供的TFBT,但根据此处TensorFlow Boosted Trees (TFBT)训练时间比xgboost长得多,并且精度较低。
任何帮助或建议将不胜感激...

2
你能否在TensorFlow Serving中添加对XGBoost模型的支持?如果可以,请帮助我。 - prashantas
我已经实现了XGBoost Serving,它是TensorFlow Serving的一个分支。它支持服务XGBoost模型和XGBoost && FM模型。您可以阅读README获取更多详细信息,并在几分钟内尝试它。如果遇到任何问题,请提交问题或直接发送电子邮件给我。 - hzy
2个回答

5

Tensorflow 文档 中提到:

任何 C++ 类都可以成为可服务对象,例如 intstd::map<string, int> 或者在二进制文件中定义的任何类 -- 我们称之为 YourServable

Tensorflow serving 论文 也提到:

"它在支持的 ML 平台类型方面非常灵活"

在阅读了一些资料后,我发现实际上为自定义(非TensorFlow)模型提供服务相当复杂。为了获得TensorFlow Serving库中的灵活性,需要承担一定的采用复杂度。这并不是对Google TensorFlow Serving的负面评价,也不是对其文档的负面评论。我简要调查了托管另一个模型平台所需的条件,并希望与社区分享我的发现并获得一些反馈。我绝不是不同模型平台或TensorFlow Serving的专家。我没有尝试在代码中实现任何这些内容。当您实际深入实施时,我相信您会发现我的解释中存在错误。

有许多模型平台可供使用。XGBoost、LightGBM、SkLearn、pytorch……在本文档中,我只讨论XGBoost。其他模型平台也需要讨论类似的问题。

加载

模型需要存储在某个路径的某个文件中,并且需要加载到TensorFlow/Serving运行时中。

文档中提到了如何创建自己的服务。其中有一个来自代码的哈希表加载器的示例。 我猜你需要为XGBoost编写类似的内容。 XGBoost有一个C++ API,并且在XGBoost在C++中加载模型(Python -> C++预测得分不匹配)中有一些示例。 因此,理论上这至少是可能的。 但是,您需要编写新的代码。您需要加载XGBoost库。您可以在编译时将XGBoost引入,也可以在运行时dlopen其库。 您至少需要fork tensorflow/serving代码并自行维护它。这本身可能意味着您必须无限期地维护自己的fork。

我认为SimpleLoaderSourceAdapter可能足够作为起点,但是servables/tensorflow必须在这里创建自己的适配器。因此,您可能需要为您的新模型编写自己的加载器和源适配器。

让ServerCore加载您的模型

仅仅拥有可加载的模型是不够的。您的模型还应该由 tensorflow/serving 运行时动态或静态加载。有多种方式将您的模型字节加载到 tensorflow/serving 中。一个简单的方法是将模型已经存储在文件系统中的常规文件中,并通过ModelConfig静态地加载您的模型。在初始化时,ServerCode 遍历这些 ModelConfigList 条目并读取加载那些模型。

ModelConfig 对象有一个 model_platform 字段,截至本文撰写时,仅支持在开源版本中使用 tensorflow。因此,您需要添加一个新的 model_platform(例如 XGBoost),并相应地更改 ModelConfig 的 proto 文件。
Tensorflow serving 的“创建新服务”documentation有示例代码,直接调用 ConnectSourceToTarget 函数。然而,我不确定在您的应用程序中编写此代码的最佳位置,或者尝试使用 tensorflow serving 中之前描述的现有静态配置加载功能会更可取多少。

预测

我们已经讨论了一些设置,以便在tensorflow/serving运行时加载您的模型。我确定还有很多其他事情我错过了,但我认为故事并没有结束。

如何使用您的模型进行预测?

我完全忽略了gRPC服务器。我相信您需要进行更多的设置。 希望HTTP路径会更简单,tensorflow serving具有HttpRestApiHandler,它使用TensorflowPredictor对象调用预测。

合理的期望是,在首次添加XBoost模型平台时,您应该能够编写一个XGBoostPredictor类。这将包含特定于XGBoost的预测函数。与需要编写自定义加载器以从文件中读取XGBoost模型相比,这并没有太大的区别。
我猜您还需要以某种方式扩展HttpRestApiHandler,以便在模型为XBoost模型时调用您的XGBoostPredictor。还需要以某种方式添加区分TensorFlowPredictor或XBoostPreditor的能力。显然的方法对我来说并不明显。我非常有兴趣了解更好的方法。Tensorflow serving还有Life of a TensorFlow Serving inference request文档可能会有所帮助。
在这个讨论中,我们没有谈到将调试能力批处理特性集成到tensorflow serving中。当然,这也需要深入的理解和额外的工作来与非tensorflow模型集成。
结论:
我认为,如果有人通过tensorflow/serving提供了一个开源的非tensorflow模型服务示例,那将是非常有价值的。我同意他们论文中的观点,即tensorflow serving非常灵活。用于加载、版本管理和批处理的非tensorflow特定的基础类是相当通用和灵活的。然而,随着极端灵活性的出现,采用新的ML平台也带来了复杂性的代价。
作为起点,需要仔细理解serveables/tensorflow的示例,并期望托管另一个模型平台的类似复杂程度。
除了实现的复杂性之外,我对于维护你即将编写的新软件非常谨慎。明智的做法是预计在您的组织中拥有所有库的分支,或与上游社区合作扩展tensorflow服务。已经存在一些上游问题:1694768637

Google ML平台具备为SKLearn和XGBoost提供服务的能力,除了TensorFlow模型之外。他们的论文还提到:

"说句认真的话,Google不仅在TensorFlow上使用TensorFlow-Serving,而且也用它作为一些专有的非TensorFlow机器学习框架的基础。"

因此,类似的扩展可能已经在TensorFlow serving之上实现了。另一方面,该论文是在2017年撰写的,谁知道自那以后还发生了什么变化。


0

我知道你的问题与TensorFlow Serving有关,但以防万一你从未听说过它,还有这个叫做Simple TensorFlow Serving的解决方案。他们在他们的网站上说:

Simple TensorFlow Serving是用于机器学习模型的通用且易于使用的服务。

  • [x] 支持分布式 TensorFlow 模型
  • [x] 支持通用的 RESTful/HTTP API
  • [x] 支持使用加速 GPU 进行推理
  • [x] 支持 curl 和其他命令行工具
  • [x] 支持任何编程语言的客户端
  • [x] 支持通过模型生成客户端而无需编码
  • [x] 支持使用原始文件进行图像模型的推理
  • [x] 支持详细请求的统计指标
  • [x] 支持同时服务多个模型
  • [x] 支持动态在线和离线模型版本
  • [x] 支持为 TensorFlow 模型加载新的自定义操作
  • [x] 支持可配置基本身份验证的安全认证
  • [x] 支持 TensorFlow/MXNet/PyTorch/Caffe2/CNTK/ONNX/H2o/Scikit-learn/XGBoost/PMML 的多个模型

我还没有测试过它(我现在正在使用 Tensorflow Serving),但我很快就会尝试一下,因为我想提供一个 XGBoost 模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接