使用 Celery 或 RESTful API 服务深度学习模型?
Serve Deep learning Model with Celery or RESTful API?
我正在开发一个 Web 应用程序,它使用 celery 进行任务分配和管理。 Web 应用程序还使用机器学习和深度学习算法进行预测。这些预测模型作为单独的应用程序部署在单独的服务器上,并且它们的预测功能作为单独的 任务 与 celery 集成。
例如,X(用户)想知道股票价格的预测并向网络应用程序提交查询。 Web 应用程序将使用 X 的查询负载启动 celery 任务。此 Celery 任务在执行某些操作后将任务提交给机器学习/深度学习的 celery 正在工作的其他服务器,并开始等待其他服务器任务完成并接收响应。
与我们为机器学习预测模型部署 RESTful 端点时相比,这将我们的性能提高了 10 倍烧瓶。对于深度学习,我们需要移动到 Tensorflow 并将其与 celery 集成。经过深入研究,得出的结论是使用 Tensorflow Serving 并在机器学习服务器上的 celery 任务中调用预测函数。
其他方法,是使用 Sanic 将 TensorFlow 模型部署为单独的端点,而不是 Web 应用程序的 celery 直接向其他服务器 celery 提交任务,现在它将直接执行和调用RESTful API 也将是异步的端点。
你有什么建议,在这种情况下什么最适合我们?芹菜比 RESTful API 有什么好处,反之亦然?
对于云应用程序中(大部分)串行请求的在线处理,使用 Celery 对批次进行排队以进行推理似乎不是一个好的设计选择,使用 Flask 或它们的任何组合也不是。 Tensorflow serving 是一种为您处理动态批处理的高性能解决方案,无需将任务放在队列中,然后将其发送到 tf-serving 仅在处理之前再次排队。
无耻的插件:还有另一个名为 virtex 的包,它建立在 asyncio 之上,它提供了一个服务解决方案,它完全不知道你的计算是如何实现的。它非常易于使用且性能高。服务器在具有事件循环处理请求的单个进程中运行。使用此框架,您可以使用三个回调函数定义您的请求处理(这相当于将您的推理代码重构为三个其签名受到适度约束的函数),并且 Virtex 引擎在其事件循环中将它们链接在一起。 Virtex 客户端可以以捆绑或串行方式发送请求。对于需要低延迟的在线应用程序,其中 request/model-input 比率大约为 1,它是我测试过的性能最高的 http 服务解决方案(它已经针对 Resnet50V2 和 BERT-base 的 tf-serving 和 bert-serving 进行了基准测试,分别)。
我正在开发一个 Web 应用程序,它使用 celery 进行任务分配和管理。 Web 应用程序还使用机器学习和深度学习算法进行预测。这些预测模型作为单独的应用程序部署在单独的服务器上,并且它们的预测功能作为单独的 任务 与 celery 集成。
例如,X(用户)想知道股票价格的预测并向网络应用程序提交查询。 Web 应用程序将使用 X 的查询负载启动 celery 任务。此 Celery 任务在执行某些操作后将任务提交给机器学习/深度学习的 celery 正在工作的其他服务器,并开始等待其他服务器任务完成并接收响应。
与我们为机器学习预测模型部署 RESTful 端点时相比,这将我们的性能提高了 10 倍烧瓶。对于深度学习,我们需要移动到 Tensorflow 并将其与 celery 集成。经过深入研究,得出的结论是使用 Tensorflow Serving 并在机器学习服务器上的 celery 任务中调用预测函数。
其他方法,是使用 Sanic 将 TensorFlow 模型部署为单独的端点,而不是 Web 应用程序的 celery 直接向其他服务器 celery 提交任务,现在它将直接执行和调用RESTful API 也将是异步的端点。
你有什么建议,在这种情况下什么最适合我们?芹菜比 RESTful API 有什么好处,反之亦然?
对于云应用程序中(大部分)串行请求的在线处理,使用 Celery 对批次进行排队以进行推理似乎不是一个好的设计选择,使用 Flask 或它们的任何组合也不是。 Tensorflow serving 是一种为您处理动态批处理的高性能解决方案,无需将任务放在队列中,然后将其发送到 tf-serving 仅在处理之前再次排队。
无耻的插件:还有另一个名为 virtex 的包,它建立在 asyncio 之上,它提供了一个服务解决方案,它完全不知道你的计算是如何实现的。它非常易于使用且性能高。服务器在具有事件循环处理请求的单个进程中运行。使用此框架,您可以使用三个回调函数定义您的请求处理(这相当于将您的推理代码重构为三个其签名受到适度约束的函数),并且 Virtex 引擎在其事件循环中将它们链接在一起。 Virtex 客户端可以以捆绑或串行方式发送请求。对于需要低延迟的在线应用程序,其中 request/model-input 比率大约为 1,它是我测试过的性能最高的 http 服务解决方案(它已经针对 Resnet50V2 和 BERT-base 的 tf-serving 和 bert-serving 进行了基准测试,分别)。