【发布时间】: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