Tensorflow文档提到:
任何 C++ 类都可以是可服务的,例如int
,std::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 服务。上游已经有一些先前的问题:1694、768、637。
除了 TensorFlow 模型之外,Google ML 平台还能够提供 SKLearn 和 XGBoost模型。他们的论文 还说:
“说真的,谷歌将 TensorFlow-Serving 用于一些专有的非 TensorFlow 机器学习框架以及 TensorFlow。”
因此,类似的扩展可能已经在 tensorflow 服务之上实现。另一方面,这篇论文是在 2017 年写的,谁知道自那以后还有什么变化。