【问题标题】:Serve Deep learning Model with Celery or RESTful API?使用 Celery 或 RESTful API 提供深度学习模型?
【发布时间】:2020-02-18 21:21:14
【问题描述】:

我正在开发一个使用 celery 进行任务分配和管理的网络应用程序。 Web 应用程序还使用机器学习和深度学习算法进行预测。这些预测模型作为单独的应用程序部署在单独的服务器上,并且它们的预测功能作为单独的任务与 celery 集成。

例如,X(用户)想知道股票价格的预测并向 Web 应用程序提交查询。 Web 应用程序将使用 X 的查询负载启动 celery 任务。此 Celery 任务在执行某些操作后将任务提交给机器学习/深度学习的 celery 正在工作的其他服务器,并开始等待其他服务器任务完成并收到响应。

与我们使用 Flask 为机器学习预测模型部署 RESTful 端点时相比,这将我们的性能提高了 10 倍。对于深度学习,我们需要迁移到 Tensorflow 并将其与 celery 集成。经过深入研究,得出的结论是使用 Tensorflow Serving 并在机器学习服务器上的 celery 任务中调用预测函数。

其他方法是使用 Sanic 将 TensorFlow 模型部署为单独的端点,而不是 Web 应用程序的 celery 直接向其他服务器 celery 提交任务,现在它将直接执行并调用 RESTful API 端点也是异步的。

您有什么建议,在这种情况下什么最适合我们?与 RESTful API 相比,celery 可以提供什么好处,反之亦然?

【问题讨论】:

    标签: rest tensorflow deep-learning celery


    【解决方案1】:

    对于云应用程序中(大部分)串行请求的在线处理,使用 Celery 将批次排队以进行推理似乎不是一个好的设计选择,使用 Flask 或其任何组合也不是。 Tensorflow serving 是一种为您处理动态批处理的高性能解决方案,无需将任务放在队列中,然后将其发送到 tf-serving 仅在处理之前再次排队。

    无耻插件:还有一个名为 virtex 的包,它建立在 asyncio 之上,它提供了一个服务解决方案,它完全不知道你的计算是如何实现的。它非常易于使用且性能卓越。服务器在单个进程中运行,事件循环处理请求。使用这个框架,您可以使用三个回调函数定义您的请求处理(这相当于将您的推理代码重构为三个签名受到轻微约束的函数),并且 virtex 引擎在其事件循环中将它们链接在一起。 virtex 客户端可以以捆绑或串行方式发送请求。对于需要低延迟的在线应用程序,其中请求/模型输入比率大约为 1,它是我测试过的性能最高的 http 服务解决方案(它已针对 Resnet50V2 和 BERT-base 的 tf-serving 和 bert-serving 进行了基准测试,分别)。

    【讨论】:

      【解决方案2】:

      这实际上取决于模型的性能特征和您的应用程序的延迟要求。一般来说,如果您需要低延迟,请选择 REST API 方法;如果您需要灵活性和易于实现的快速概念验证,请选择 celery 任务方法。

      另外,我建议尝试一下BentoML,它是一个高性能和灵活的模型服务框架。基本上,它为您提供了一种打包 ML 模型的方法,然后将模型轻松地分发为 REST API 服务容器、CLI 工具、PyPI 包或 Spark UDF。在您的情况下,工程团队可以更轻松地试验这些不同的部署方法,并确定哪种方法最适合您的特定用例。

      免责声明:我是 BentoML 项目的作者

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-27
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2018-02-03
        • 2017-10-22
        • 2015-12-31
        相关资源
        最近更新 更多