如何使用 tensorflow-serving 发布自定义(非 tensorflow)模型?
Posted
技术标签:
【中文标题】如何使用 tensorflow-serving 发布自定义(非 tensorflow)模型?【英文标题】:How to publish custom (non-tensorflow) models using tensorflow-serving? 【发布时间】:2018-09-09 07:57:28 【问题描述】:我已阅读 basic 和 advanced tensorflow-serving 教程,但我仍然不清楚如何为以下内容构建 tensorflow-serving 支持:
-
用 Python 构建的模型(如 xgboost 或 scikit-learn)
R 中构建的模型(如 xgboost 或 lightgbm)
考虑使用tf.contrib
中提供的 TFBT,但根据this,TensorFlow Boosted Trees (TFBT) 与 xgboost 相比需要更长的训练时间,并观察到它的精度更差。
任何帮助或建议将不胜感激......
【问题讨论】:
你能在 tensorflow 服务中添加对 xgboost 模型的支持吗?如果是,请帮助我。 我已经实现了 XGBoost Serving,它是 TensorFlow Serving 的一个分支。它支持服务 XGBoost 模型和 XGBoost && FM 模型。您可以阅读 README 以了解更多详细信息,并在几分钟内尝试一下。如果您遇到任何问题,请提交问题或直接给我发电子邮件。 【参考方案1】: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 年写的,谁知道自那以后还有什么变化。
【讨论】:
【参考方案2】:我知道您的问题是关于 tensorflow 服务的,但以防万一您从未听说过,还有一个名为 simple-tensorflow-serving 的解决方案。他们在site 上说:
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 模型提供服务。
【讨论】:
【参考方案3】:有一个社区项目使用 TF Serving 为 XGBoost 模型提供服务。这是一个很好的参考。
https://github.com/iqiyi/xgboost-serving
【讨论】:
以上是关于如何使用 tensorflow-serving 发布自定义(非 tensorflow)模型?的主要内容,如果未能解决你的问题,请参考以下文章
使用docker+tensorflow-serving进行模型热部署