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

bab*_*alu 5 python serving tensorflow tensorflow-serving

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

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

考虑使用 TFBT 可用tf.contrib,但根据thisTensorFlow Boosted Trees (TFBT)需要更长的时间以培训相比xgboost,并指出它有精度差。

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

Hak*_*aba 5

Tensorflow文档提到:

\n
\n

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

\n
\n

Tensorflow 服务论文还提到

\n
\n

“它在支持的机器学习平台类型方面非常灵活\n”

\n
\n

经过一番阅读后,我发现在实践中服务自定义(非 ternsorflow)模型非常复杂。张量流服务库的灵活性带来了采用的复杂性。这根本不是对 Google Tensorflow 服务的不满,也不是对其文档的负面评论。我正在简要调查托管另一个模型平台需要什么,我想分享我的发现并从社区获得一些反馈。我绝不是不同模型平台或张量流服务方面的专家。我还没有尝试在代码中实现这些。我确信,一旦您真正深入实施,就会在我的解释中发现错误。

\n

人们可能想要使用许多模型平台。XGBoost、LightGBM、SkLearn、pytorch\xe2\x80\xa6.. 在本文档中我将仅访问 XGBoost。对于其他模型平台也需要讨论一系列类似的问题。

\n

加载中

\n

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

\n

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

\n

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

\n

让 ServerCore 加载您的模型

\n

拥有可加载的模型是不够的。您的模型还应该由tensorflow/serving运行时动态或静态加载。有多种方法可以将模型字节放入张量流/服务中。一种简单的方法是将文件系统中的模型放在常规文件中,并通过 ModelConfig 静态加载模型。在初始化时,ServerCode迭代这些 ModelConfigList 条目并读取负载这些模型。

\n

ModelConfig 对象有一个model_platform字段,在撰写本文时仅支持张量流 开源版本因此,您需要添加一个新的 model_platform(例如 XGBoost)并相应地更改 ModelConfig 的 proto 文件。

\n

Tensorflow 服务的“创建新的 Servable”文档包含直接调用该函数的示例代码ConnectSourceToTarget。但是,我不确定在应用程序中编写此代码的最佳位置,或者尝试使用张量流服务中现有的静态配置加载功能(如前所述)的效果如何。

\n

预测

\n

我们已经讨论了将模型加载到 Tensorflow/serving 运行时中的一些设置。我确信我还错过了很多其他事情,但我认为故事还没有结束。

\n

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

\n

我完全掩盖了 gRPC 服务器。我确信您还需要进行更多设置。 \n希望 HTTP 路径会更简单,tensorflow 服务具有此HttpRestApiHandler ,它使用TensorflowPredictor对象来调用预测。

\n

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

\n

我想当模型是 XBoost 模型时,您还需要以某种方式扩展 HttpRestApiHandler 来调用 XGBoostPredictor。并且还以某种方式添加了区分 TensorFlowPredictor 或 XBoostPeditor 的能力。我不清楚一种明显的方法。我非常有兴趣学习更好的方法。Tensorflow 服务还具有TensorFlow Serving 推理请求的生命周期 文档,可能会有所帮助。

\n

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

\n

结论

\n

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

\n

作为起点,我们需要仔细理解Serables/tensorflow的示例的示例,并期望托管另一个模型平台具有类似的复杂性。

\n

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

\n

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

\n
\n

“说实话,Google 将 TensorFlow-Serving 用于一些专有的\n非 TensorFlow 机器学习框架以及 TensorFlow。”

\n
\n

因此,类似的扩展可能已经在张量流服务之上实现了。另一方面,这篇论文是 2017 年写的,谁知道此后还发生了什么变化。

\n