使用 Docker 和 Flask 进行机器学习的性能问题

问题描述 投票:0回答:2

我有一些应用于 json 文件的 python3 代码,代码中有一些神经网络和随机森林。我将代码放入 Docker 容器中,但注意到这些 ML 任务在不使用 Docker 的情况下比使用 Docker 运行得更快。在 Docker 中,我使用 Flask 加载 json 文件并运行代码。当然,我在本地和 Docker 内部使用了相同版本的 python 模块,这些是:

  • theano 0.8.2
  • keras 2.0.5
  • scikit学习0.19.0

此外,Flask 是

  • 0.12

起初,我认为 theano 在有 Docker 的情况下可能会使用不同的资源,但它同时运行单 CPU 和单线程。它也没有使用我的 GPU。当我意识到我的随机森林在 Docker 中运行速度也变慢时,我意识到这可能不是 theano。这是我执行的一系列测试(我为每个测试做了几次测试,我报告了平均时间,因为这些测试是稳定的)

没有 Docker,没有 Flask:

  • 任务 1(theano + keras 代码):1.0s
  • 任务2(theano + keras代码):0.7s
  • 任务 3(scikit-learn 代码):0.25s

Docker(CPU = 1)+ Flask(调试模式= True):

  • T1:6.5秒
  • T2:2.2秒
  • T3:0.58秒

Docker(CPU = 2)+ Flask(调试模式= True):

  • T1:5.5秒
  • T2:1.4秒
  • T3:0.55秒

Docker(CPU = 2)+ Flask(调试模式= False):

  • T1:4.5秒
  • T2:1.2秒
  • T3:0.5秒

Docker (cpus=2)(没有 Flask,只是调用本地完成的 json 文件):

  • T1:2.8秒
  • T2:1.1秒
  • T3:0.5秒

Flask(调试模式 = True)(无 Docker 容器):

  • T1:2.8秒
  • T2:1.5秒
  • T3:0.2秒

我猜 cpu=1 与 cpu=2 只是将一个 cpu 分配给代码,而第二个 cpu 只是接管一些其他工作。显然,当不使用 Flask 或 Docker 时,时间会有所减少,但我仍然无法达到没有 Docker 和 Flask 的速度。有谁猜到为什么会发生这种情况吗?

这是我们如何使用 Flask 运行应用程序的最小代码块

api = Flask(__name__)
pipeline = Pipeline()  # private class calling multiple tasks

@api.route("/", methods=['POST'])
def entry():
    data = request.get_json(force=True)
    data = pipeline.process(data)
    # This calls the different tasks which are timed

if __name__ == "__main__":
    api.run(debug=True, host='0.0.0.0', threaded=False)

PS。如果问题缺少任何内容,请原谅我,这是我的第一个 StackOverflow 问题

python performance docker machine-learning flask
2个回答
2
投票

在使用

对 CPU 进行推理时,我遇到了非常类似的问题
  • 独角兽
  • 烧瓶
  • 火炬

即使很困难,我的设置也略有不同,我认为这会对您有所帮助。

我在gunicorn设置中设置了

workers=1
threads=1
。当向 Flask 端点发送并发请求时,推理时间变得非常糟糕。

事实证明,

pytorch
从 Docker 中启动了尽可能多的线程,并且它们彼此严重阻塞。 另请参阅:https://opendatascience.com/model-performance-optimization-with-torchserve/

我的解决方案是设置

torch.set_num_threads(1)

请检查您是否也有这个问题。


0
投票

遇到类似的问题,在 kubernetes 部署中使用 docker-compose 启动测试容器。 Pod 定义了资源限制,但 docker(Pod 内部)忽略了这些限制并使用了所有节点资源。 pytorch 在节点上产生了尽可能多的可用工作线程,它们互相阻塞,运行时间增加了 6 倍

通过设置环境变量在 docker-compose 中修复OMP_NUM_THREADS=1:

version: '3.3'
services:
  my-service:
    image: myimage/test-my-service:latest
    container_name: test-my-service
    environment:
      - OMP_NUM_THREADS=1
© www.soinside.com 2019 - 2024. All rights reserved.