使用Celery或RESTful API服务深度学习模型?

时间:2019-10-22 17:00:18

标签: rest tensorflow deep-learning celery

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

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

与使用Flask为机器学习预测模型部署 RESTful 端点时相比,

这将我们的性能提高了 10倍。对于深度学习,我们需要转到 Tensorflow 并将其与芹菜集成。经过深入研究,得出的结论是在机器学习服务器上的芹菜任务中使用 Tensorflow Serving 并调用预测函数。

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

您有什么建议,在这种情况下最适合我们的是什么?与RESTful API相比,芹菜可以提供什么好处?

2 个答案:

答案 0 :(得分:1)

这实际上取决于模型的性能特征和应用程序的延迟要求。通常,如果您需要低延迟,请使用REST API方法,如果您需要灵活性和易于实现的概念以快速进行概念验证,则请使用celery任务方法。

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

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

答案 1 :(得分:1)

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

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

相关问题