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

标签 python tensorflow tensorflow-serving serving

我已阅读 basicadvanced tensorflow-serving 教程,但我仍然不清楚如何在 tensorflow-serving 中为以下内容建立支持:

  • 用 Python 构建的模型(如 xgboost 或 scikit-learn)
  • 内置 R 的模型(如 xgboost 或 lightgbm)

  • 考虑使用 tf.contrib 中提供的 TFBT ,但根据 this , TensorFlow Boosted Trees (TFBT)与 xgboost 相比,训练时间要长得多,并观察到它的精度更差。

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

    最佳答案

    Tensorflow documentation提到:

    Any C++ class can be a servable, e.g. int, std::map<string, int> or any class defined in your binary -- let us call it YourServable.


    Tensorflow 服务 paper还提到

    "It is extremely flexible in terms of the types of ML platforms it supports"


    经过一些阅读,我发现在实践中为自定义(非 ternsorflow)模型提供服务是相当复杂的。由于 tensorflow 服务库的灵活性优势,采用复杂度较高。这根本不是对 Google tensorflow 服务的 diss,也不是对其文档的负面评论。我正在简要调查托管另一个模型平台需要什么,我想分享我的发现并从社区获得一些反馈。我绝不是不同模型平台或 tensorflow 服务的专家。我没有尝试在代码中实现任何这些。我敢肯定,一旦您真正深入实现,就会在我的解释中发现错误。
    人们可能想要使用许多模型平台。 XGBoost、LightGBM、SkLearn、pytorch……在本文档中,我将仅访问 XGBoost。其他模型平台也需要讨论一堆类似的问题。
    加载中
    模型需要存在于某个路径中的某个文件中,并且需要加载到 tensorflow/serving 运行时。
    docs提到如何创建自己的 servable。有一个来自 code 的哈希表加载器示例。 .
    我想您需要为 XGBoost 编写类似的内容。 XGBoost 有一个 c++ apixgboost load model in c++ (python -> c++ prediction scores mismatch) 中有一些例子.
    所以至少在理论上这是可能的。
    但是,您需要为此编写新代码。您需要为此加载 XGBoost 库。您需要在编译时引入 XGBoost,或者在运行时 dlopen 其库。
    你至少需要 fork tensorflow/serving 代码并自己维护它。这本身可能意味着基本上无限期地维护你的 fork 。
    我认为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 的原型(prototype)文件。
    Tensorflow 服务的“创建一个新的 Servable”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可能有帮助的文档。
    在本次讨论中,我们还没有谈到集成到 debuggability 中。或 batch processing tensorflow 服务的特点。当然,这些还需要深入理解和额外的工作才能与非 tensorflow 模型集成。
    结论
    我认为如果有人有一个通过 tensorflow/serving 为非 tensorflow 模型提供服务的开源示例,那将是非常有值(value)的。我同意他们论文中的说法,即 tensorflow 服务非常灵活。用于加载、版本的非 tensorflow 特定基类
    管理、批处理非常通用且灵活。然而,这种极端的灵活性也带来了采用新 ML 平台的复杂性成本。
    作为起点,需要仔细理解 serveables/tensorflow 的示例。并期望托管另一个模型平台具有类似的复杂性。
    撇开实现的复杂性不谈,我会非常谨慎地维护您将要编写的新软件。期望在您的组织中无限期地拥有您的所有库的分支,或者与上游社区合作以扩展 tensorflow 服务是明智的。上游已经存在一些先前的问题:1694 , 768 , 637 .
    谷歌机器学习平台 has the ability to serve SKLearn and XGBoost除了 TensorFlow 模型之外的模型。他们的 paper还说:

    "In seriousness, Google uses TensorFlow- Serving for some proprietary non-TensorFlow machine learning frameworks as well as TensorFlow. "


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

    关于python - 如何使用 tensorflow-serving 发布自定义(非 tensorflow)模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49571655/

    相关文章:

    docker - docker如何运行tensorflow-serving及其模型?

    python - 解析从 URL 读取的 JSON 时出现问题

    tensorflow - 了解更高维度的密集层的输出

    java - 如何从 Java 中的示例对象创建张量?

    python - tensorflow 语音_命令错误: Unsuccessful TensorSliceReader constructor

    python - 使用中间层作为输入和输出的 keras 模型

    json - 向 Sagemaker 上的 tensorflow 服务模型提供输入时出错。 {'error' : "Missing ' inputs' or 'instances' key"}

    python - 如何使用 Tkinter 根据数据库查询动态标记我的按钮

    python - "Got KeyError when attempting to get a value for field ` 用户名 ` on serializer ` UserCreateSerializer`

    python - Flask 重定向返回 200 而不是 302