如何使用张量流服务发布自定义(非张量流)模型



我已经阅读了基本和高级的张量流服务教程,但我仍然不清楚如何在张量流服务中为以下内容构建支持:

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

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

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

Tensorflow 文档提到:

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

Tensorflow 服务论文还提到

"就ML平台的类型而言,它非常灵活。 支持">

经过一些阅读,我发现在实践中为定制(非ternsorflow)模型服务是相当复杂的。为了在张量流服务库中实现灵活性,采用的复杂性。 这根本不是对谷歌张量流服务的diss,也不是对他们的文档的负面评论。我正在简要调查托管另一个模型平台需要什么,我想分享我的发现并从社区获得一些反馈。 我绝不是不同模型平台的专家,也不是张量流服务方面的专家。我没有尝试在代码中实现任何这些。我敢肯定,一旦你真正深入研究了实现,就会发现我的解释有错误。

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

装载

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

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

我认为 SimpleLoaderSourceAdapter 可能足以作为入门器,但是 servables/tensorflow 必须在这里创建自己的 . 因此,您可能需要为新模型编写自己的加载程序和源适配器。

使服务器核心加载模型

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

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

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

预测

我们已经讨论了在 tensorflow/serve 运行时中加载模型的一些设置。我确信我错过了许多其他事情,但我不认为故事在那里完成。

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

我完全掩盖了 gRPC 服务器。我相信您还需要在那里进行更多设置。 希望HTTP路径更简单,tensorflow服务有这个HttpRestApiHandler,它使用TensorflowPredictor对象来调用predicton。

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

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

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

结论

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

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

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

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

"严肃地说,谷歌使用TensorFlow-为一些专有服务。 非TensorFlow机器学习框架以及TensorFlow。">

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

我知道你的问题是关于张量流服务的,但以防万一你从未听说过它,还有这个解决方案称为简单张量流服务。他们在他们的网站上说:

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模型。

相关内容

  • 没有找到相关文章

最新更新