我有一些应用于 json 文件的 python3 代码,代码中有一些神经网络和随机森林。我将代码放入 Docker 容器中,但注意到这些 ML 任务在不使用 Docker 的情况下比使用 Docker 运行得更快。在 Docker 中,我使用 Flask 加载 json 文件并运行代码。当然,我在本地和 Docker 内部使用了相同版本的 python 模块,这些是:
此外,Flask 是
起初,我认为 theano 在有 Docker 的情况下可能会使用不同的资源,但它同时运行单 CPU 和单线程。它也没有使用我的 GPU。当我意识到我的随机森林在 Docker 中运行速度也变慢时,我意识到这可能不是 theano。这是我执行的一系列测试(我为每个测试做了几次测试,我报告了平均时间,因为这些测试是稳定的)
没有 Docker,没有 Flask:
Docker(CPU = 1)+ Flask(调试模式= True):
Docker(CPU = 2)+ Flask(调试模式= True):
Docker(CPU = 2)+ Flask(调试模式= False):
Docker (cpus=2)(没有 Flask,只是调用本地完成的 json 文件):
Flask(调试模式 = True)(无 Docker 容器):
我猜 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 问题
在使用
对 CPU 进行推理时,我遇到了非常类似的问题即使很困难,我的设置也略有不同,我认为这会对您有所帮助。
我在gunicorn设置中设置了
workers=1
和threads=1
。当向 Flask 端点发送并发请求时,推理时间变得非常糟糕。
事实证明,
pytorch
从 Docker 中启动了尽可能多的线程,并且它们彼此严重阻塞。
另请参阅:https://opendatascience.com/model-performance-optimization-with-torchserve/
我的解决方案是设置
。torch.set_num_threads(1)
请检查您是否也有这个问题。
遇到类似的问题,在 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