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

时间:2018-03-30 09:15:45

标签: python tensorflow tensorflow-serving serving

我已经阅读了basicadvanced张量流服务教程,但我仍然不清楚如何在tensorflow服务中为以下内容提供支持:

  1. 用Python构建的模型(如xgboost或scikit-learn)
  2. 内置R的模型(如xgboost或lightgbm)
  3. 考虑使用tf.contrib中提供的TFBT,但根据this,与{x}相比,TensorFlow Boosted Trees (TFBT)需要更长时间才能进行训练,并且观察到它的精确度更低。

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

3 个答案:

答案 0 :(得分:2)

Tensorflow documentation提到:

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

Tensorflow服务paper也提到了

“它在ML平台类型方面非常灵活 支持”

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

一个人可能要使用许多模型平台。 XGBoost,LightGBM,SkLearn,pytorch .....在本文档中,我将仅访问XGBoost。其他模型平台也需要讨论类似的问题。

正在加载

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

docs提到了如何创建自己的可服务对象。有一个code中的哈希表加载器示例。 我想您需要为XGBoost写类似的东西。 XGBoost具有c ++ apixgboost load model in c++ (python -> c++ prediction scores mismatch)中有一些示例。 因此,至少在理论上这是可能的。 但是,您需要为此编写新代码。您需要为此加载XGBoost库。您要么需要在编译时带XGBoost,要么在运行时dlopen它的库。 您至少需要派生tensorflow / serving代码并自行维护。这本身可能意味着无限期地维护您的叉子。

我认为SimpleLoaderSourceAdapter可能足以作为启动器,但是可服务对象/张量流必须创建自己的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。因此,您需要添加一个名为XGBoost的新model_platform并相应地更改ModelConfig的原型文件。

Tensorflow服务的“创建新的可服务对象” documentation具有直接调用ConnectSourceToTarget函数的示例代码。但是,我不确定在您的应用程序中编写此代码的最佳位置是什么,或者如前所述,尝试在tensorflow服务中尝试使用现有的静态配置加载功能到底有多可取。

预测

我们已经讨论了一些在tensorflow / serving运行时加载模型的设置。我确定我还有很多其他事情想念,但我认为故事并没有完成。

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

我完全了解gRPC服务器。我敢肯定,还有很多设置需要您执行。 希望HTTP路径会更简单,tensorflow的HttpRestApiHandler使用了TensorflowPredictor对象来调用预报。

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

我想您还需要以某种方式扩展HttpRestApiHandler,以在模型为XBoost模型时调用XGBoostPredictor。并且还以某种方式增加了区分TensorFlowPredictor或XBoostPreditor的能力。对我来说,一个明显的方法尚不清楚。我将非常有兴趣学习更好的方法。 Tensorflow服务还有Life of a TensorFlow Serving inference request个文档,可能会有所帮助。

在此讨论中,我们没有讨论过集成到张量流服务的debuggabilitybatch processing功能中。当然,这些还需要深入理解和其他工作才能与非张量流模型集成。

结论

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

作为起点,需要仔细理解serveables/tensorflow的示例,并期望以类似的复杂度托管另一个模型平台。

除了实现的复杂性,我将非常谨慎地维护要编写的新软件。明智的做法是,让组织中的所有库无限期拥有您的fork,或者与上游社区合作以扩展tensorflow服务。上游已经存在一些先前的问题:1694768637

Google ML平台has the ability to serve SKLearn and XGBoost模型以及TensorFlow模型。他们的paper还说:

“说真的,Google使用TensorFlow- Serving某些专有 非TensorFlow机器学习框架以及TensorFlow。 “

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

答案 1 :(得分:1)

https://quickstart.pipeline.ai是python,tensorflow,c,xgboost等所有ml和ai模型的通用平台。

答案 2 :(得分:0)

我知道您的问题与 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 模型提供服务。