6

我已经阅读了基本高级tensorflow-serving 教程,但我仍然不清楚如何在 tensorflow-serving 中为以下内容构建支持:

  1. 用 Python 构建的模型(如 xgboost 或 scikit-learn)
  2. R 中内置的模型(如 xgboost 或 lightgbm)

考虑使用 TFBT tf.contrib,但据此 TensorFlow Boosted Trees (TFBT)与 xgboost 相比需要更长的训练时间,并且观察到它的精度更差。

任何帮助或建议将不胜感激......

4

3 回答 3

3

Tensorflow文档提到:

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

TensorFlow 服务论文还提到

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

经过一番阅读,我发现在实践中为自定义(非 ternsorflow)模型提供服务是相当复杂的。由于 tensorflow 服务库的灵活性,采用复杂性是有好处的。这根本不是对 Google tensorflow 服务的diss,也不是对其文档的负面评论。我正在简要调查托管另一个模型平台需要什么,我想分享我的发现并从社区获得一些反馈。我绝不是不同模型平台的专家,也不是 tensorflow 服务方面的专家。我没有尝试在代码中实现任何这些。我敢肯定,一旦您真正深入实施,就会在我的解释中发现错误。

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

正在加载

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

文档提到了如何创建自己的 servable 。代码中有一个哈希表加载器的示例。我想你需要为 XGBoost 编写类似的东西。XGBoost 有一个 c++ api,并且在 c++ 中的 xgboost 负载模型中有一些示例(python -> c++ 预测分数不匹配)。所以至少理论上这是可能的。但是,您需要为此编写新代码。您需要为此加载 XGBoost 库。您要么需要在编译时引入 XGBoost,要么在运行时 dlopen 它的库。您至少需要 fork tensorflow/serving 代码并自己维护它。这本身可能意味着基本上无限期地维护你的分叉。

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

让 ServerCore 加载你的模型

拥有可加载的模型是不够的。您的模型也应该由 tensorflow/serving 运行时动态或静态加载。有多种方法可以让你的模型字节进入 tensorflow/serving。一种简单的方法是将文件系统中的模型放在常规文件中,然后通过ModelConfig静态加载模型。在初始化时,ServerCode遍历这些 ModelConfigList 条目并读取加载这些模型。

ModelConfig对象有一个model_platform字段,在撰写本文 时,开源版本仅支持 tensorflow 。所以你需要添加一个新的 model_platform 比如说 XGBoost 并相应地更改 ModelConfig 的原型文件。

Tensorflow serving 的“创建一个新的 Servable”文档有直接调用该ConnectSourceToTarget函数的示例代码。但是,我不确定在您的应用程序中编写此代码的最佳位置是哪里,或者尝试在 tensorflow 服务中使用现有的静态配置加载功能(如前所述)会有多可取。

预测

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

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

我完全掩盖了 gRPC 服务器。我相信你需要做更多的设置。希望 HTTP 路径更简单,张量流服务有这个HttpRestApiHandler ,它使用一个TensorflowPredictor对象来调用预测。

第一次添加 XBoost 模型平台时应该期望编写一个 XGBoostPredictor 类是合理的。这将包含 XGBoost 特定的预测函数。与需要编写自定义加载器以从文件中读取 XGBoost 模型相比,这并没有太大区别。

我想您还需要以某种方式扩展 HttpRestApiHandler 以在模型是 XBoost 模型时调用您的 XGBoostPredictor。并且还以某种方式增加了区分 TensorFlowPredictor 或 XBoostPredictor 的能力。我不清楚一个明显的方法。我很想学习更好的方法。TensorFlow Serving也有Life of a TensorFlow Serving 推理请求 文档,可能会有所帮助。

在本次讨论中,我们没有讨论集成到 tensorflow 服务的可调试性批处理功能中。当然,这些还需要深入理解和额外的工作才能与非张量流模型集成。

结论

我认为如果有人有一个开源示例通过 tensorflow/serving 为非 tensorflow 模型提供服务,那将是非常有价值的。我同意他们论文中的说法,即 tensorflow 服务非常灵活。用于加载、版本管理、批处理的非 tensorflow 特定基类非常通用且灵活。然而,这种极端的灵活性也带来了采用新机器学习平台的复杂性成本。

作为起点,需要仔细理解可服务/张量流的示例,并期望托管另一个模型平台具有类似的复杂性。

抛开实现的复杂性不谈,我会非常谨慎地维护您将要编写的新软件。谨慎的做法是期望无限期地拥有您组织中所有库的分支,或者与上游社区合作以扩展 tensorflow 服务。上游已经有一些先前的问题:1694768637

除了 TensorFlow 模型之外,Google ML 平台还能够提供 SKLearn 和 XGBoost模型。他们的论文 还说:

“说真的,谷歌将 TensorFlow-Serving 用于一些专有的非 TensorFlow 机器学习框架以及 TensorFlow。”

因此,类似的扩展可能已经在 tensorflow 服务之上实现。另一方面,这篇论文是在 2017 年写的,谁知道自那以后还有什么变化。

于 2020-07-21T18:16:03.233 回答
0

我知道您的问题是关于 tensorflow 服务的,但以防万一您从未听说过,还有一个名为 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 模型提供服务。

于 2021-01-14T18:49:48.237 回答
0

有一个社区项目使用 TF Serving 为 XGBoost 模型提供服务。这是一个很好的参考。

https://github.com/iqiyi/xgboost-serving

于 2022-02-08T03:52:25.850 回答