【问题标题】:Performance issues with machine learning using Docker and Flask使用 Docker 和 Flask 进行机器学习的性能问题
【发布时间】:2018-11-01 01:01:27
【问题描述】:

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

  • theano 0.8.2
  • keras 2.0.5
  • scikit-learn 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.25 秒

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

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

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

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

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

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

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

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

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

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

我猜 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 问题

【问题讨论】:

  • 1. Docker 总是会带来一些开销,大多数时候应用程序在 docker 中至少会慢 5-10%。 2. dockerless Flask 和 dockerless pure theano + keras 之间的 2-3 倍差异意味着你在 Flask 上做错了,因为 Flask 不可能带来高达 1.8s 的开销。 3. 你可以看到 CPU 数量和算法时间之间的一些相关性。纯 theano + keras 可能会使用所有 CPU 内核(4 个?),但您将 docker 限制为 1 或 2 个 CPU。 4. 了解您的硬件规格和操作系统对于解决性能问题非常必要。
  • 感谢您的回答。我们在具有不同数量的 CPU(最多 8 个)的其他机器上进行了测试,并且它很快就达到了平稳状态(嗯 8 并不比 2 好)。我们还在 Amazon 集群上进行了尝试,结果相同。

标签: python performance docker machine-learning flask


【解决方案1】:

在使用 CPU 进行推理时,我遇到了非常相似的问题

  • 独角兽
  • 烧瓶
  • Pytorch

即使我的设置很艰难,我认为这会对你有所帮助。

我在 gunicorn-settings 中设置了 workers=1threads=1。当向 Flask 端点发送并发请求时,推理时间变得非常糟糕。

事实证明,pytorch 启动了尽可能多的线程,因为它可以从 Docker 获得,并且它们彼此严重阻塞。 另见:https://opendatascience.com/model-performance-optimization-with-torchserve/

我的解决方案是设置torch.set_num_threads(1)

请检查您是否也有此问题。

【讨论】:

  • 为我的案例工作 torch.set_num_threads(1),我在 Kubernetes 上的 Docker 中使用 Flask-only 部署 Torch 模型。容器在 Mac(6 核)上的 Docker 本地完美运行,在 K8s 上慢了大约 10 倍(6 个 CPU 限制)。谢谢,迈克尔!
猜你喜欢
  • 2019-11-14
  • 2017-11-03
  • 2020-12-10
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2015-02-26
  • 2019-03-08
  • 2020-06-28
相关资源
最近更新 更多