Tensorflow documentation 提到:
任何 C++ 类都可以是可服务的,例如int, std::map<string, int>
或者在你的二进制文件中定义的任何类——让我们称之为YourServable。
Tensorflow 服务 paper 也提到了
“它在 ML 平台的类型方面非常灵活
支持”
经过阅读,我发现在实践中为自定义(非 ternsorflow)模型提供服务是相当复杂的。由于 tensorflow 服务库的灵活性,采用复杂性是有好处的。这根本不是对 Google tensorflow 服务的diss,也不是对其文档的负面评论。我正在简要调查托管另一个模型平台需要什么,我想分享我的发现并从社区获得一些反馈。我绝不是不同模型平台的专家,也不是 tensorflow 服务方面的专家。我没有尝试在代码中实现任何这些。我敢肯定,一旦您真正深入了解实现,就会发现我的解释中有错误。
人们可能想要使用许多模型平台。 XGBoost、LightGBM、SkLearn、pytorch……在本文档中,我只会访问 XGBoost。其他模型平台也需要讨论许多类似的问题。
加载中
模型需要存在于某个路径中的某个文件中,并且需要加载到 tensorflow/serving 运行时。
docs 提到了如何创建自己的 servable。有一个来自code 的哈希表加载器示例。
我想你需要为 XGBoost 编写类似的东西。 XGBoost 有一个 c++ api,xgboost load model in c++ (python -> c++ prediction scores mismatch) 中有一些例子。
所以至少理论上这是可能的。
但是,您需要为此编写新代码。您需要为此加载 XGBoost 库。您要么需要在编译时引入 XGBoost,要么在运行时 dlopen 它的库。
您至少需要 fork tensorflow/serving 代码并自己维护它。这本身可能意味着基本上无限期地维护你的分叉。
我认为 SimpleLoaderSourceAdapter 可能足以作为初学者,但是 servables/tensorflow 必须创建自己的 here 。
因此,您可能需要为新模型编写自己的加载器和源适配器。
让 ServerCore 加载你的模型
拥有可加载的模型是不够的。您的模型也应该由 tensorflow/serving 运行时动态或静态加载。有 various ways 可以将您的模型字节放入 tensorflow/serving。一个简单的方法是让文件系统中的模型已经在一个常规文件中,并通过ModelConfig 静态加载您的模型。在初始化时 ServerCode iterates over these ModelConfigList entries and reads loads 那些模型。
ModelConfig 对象有一个model_platform 字段,在撰写本文时,开源版本中的only tensorflow is supported。所以你需要添加一个新的 model_platform 比如说 XGBoost 并相应地更改 ModelConfig 的 proto 文件。
Tensorflow 服务的“创建一个新的 Servable”documentation 具有直接调用 ConnectSourceToTarget 函数的示例代码。但是,我不确定在您的应用程序中编写此代码的最佳位置是哪里,或者尝试在 tensorflow 服务中使用现有的静态配置加载功能(如前所述)会有多可取。
预测
我们已经讨论了将模型加载到 tensorflow/serving 运行时的一些设置。我确信还有很多其他的事情我错过了,但我认为故事还没有结束。
您将如何使用您的模型进行预测?
我完全掩盖了 gRPC 服务器。我相信你需要做更多的设置。
希望 HTTP 路径更简单,张量流服务有这个 HttpRestApiHandler,它使用 TensorflowPredictor 对象来调用预测。
第一次添加 XBoost 模型平台时应该期望编写一个 XGBoostPredictor 类是合理的。这将包含 XGBoost 特定的预测函数。与需要编写自定义加载器以从文件中读取 XGBoost 模型相比,这并没有太大区别。
我想您还需要以某种方式扩展 HttpRestApiHandler 以在模型是 XBoost 模型时调用您的 XGBoostPredictor。并且还以某种方式增加了区分 TensorFlowPredictor 或 XBoostPredictor 的能力。我不清楚一个明显的方法。我很想学习更好的方法。 Tensorflow 服务也有 Life of a TensorFlow Serving inference request 可能有用的文档。
在本次讨论中,我们没有讨论集成到 tensorflow 服务的 debuggability 或 batch processing 功能中。当然,这些也需要深入理解和额外的工作才能与非张量流模型集成。
结论
我认为,如果有人有一个通过 tensorflow/serving 为非 tensorflow 模型提供服务的开源示例,那将是非常有价值的。我同意他们论文中的说法,即 tensorflow 服务非常灵活。用于加载的非 tensorflow 特定基类,版本
管理,批处理非常通用且灵活。然而,这种极端的灵活性也带来了采用新机器学习平台的复杂性成本。
首先,需要仔细理解serveables/tensorflow 的示例,并期望托管另一个模型平台具有相似的复杂性。
抛开实现复杂性不谈,我会非常谨慎地维护您要编写的新软件。谨慎的做法是期望无限期地拥有您组织中所有库的分支,或者与上游社区合作以扩展 tensorflow 服务。上游已经有一些先前的问题:1694、768、637。
Google ML 平台 has the ability to serve SKLearn and XGBoost 模型以及 TensorFlow 模型。他们的paper 还说:
“说真的,谷歌使用 TensorFlow-Serving 来处理一些专有的
非 TensorFlow 机器学习框架以及 TensorFlow。 "
因此,类似的扩展可能已经在 tensorflow 服务之上实现。另一方面,这篇论文是在 2017 年写的,谁知道自那以后还有什么变化。