【问题标题】:Python code in docker NOT using all available CPU cores (uses only one)docker 中的 Python 代码未使用所有可用的 CPU 内核(仅使用一个)
【发布时间】:2020-07-05 17:35:27
【问题描述】:

我正在使用 AWS Batch 运行一个 python 脚本,其中包含几个并行运行的模块(在 AWS ECR 上的 docker 容器中)。当我在 Linux 16 核机器上手动调用脚本时,我看到 16 个 python 进程并行执行代码。

为了进一步加快运行速度,我想使用 AWS Batch 通过自动缩放到 64 个内核来运行相同的脚本。但是,这种方法只是启动了一个 python 进程——这显然比我最初的方法慢。

其他细节: 我正在运行的并行 python 方法是 pairwise_distances(基于 joblib 库构建) 我在 Windows 10 机器上构建了 docker 映像,将其推送到 ECR 并使用 AWS Batch 调用它的运行。

我是否遗漏了调用 python 并行后端的关键内容,或者是否有任何我未配置的 docker 配置设置。非常感谢您提前提供的帮助。

示例 Python 代码:script.py

import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import pairwise_distances

X = pd.DataFrame(np.random.randint(0,100,size=(1000, 4)), columns=list('ABCD'))
Y = pd.DataFrame(np.random.randint(0,100,size=(10000, 4)), columns=list('ABCD'))

output = pd.DataFrame(
    pairwise_distances(X.to_numpy(),Y.to_numpy(), metric= lambda u, v: round((np.sum( np.minimum(u,v), axis = 0)/np.sum(u,axis= 0))*100,2) , n_jobs=-1),
    columns = Y.index,
    index = X.index
)

pd.DataFrame.to_csv(output, 'outputData.csv', sep=',', na_rep='', index=False)

Dockerfile:

python:3.7
ADD script.py /
COPY requirements.txt /tmp/
RUN pip install -r /tmp/requirements.txt
CMD ["python", "./script.py"]

requirements.txt:

pandas
numpy
sklearn
joblib

【问题讨论】:

  • 您能否提取minimal reproducible example 并将其作为您问题的一部分提供?这样,人们就不必依赖您的解释。作为这里的新用户,也可以使用tour 并阅读How to Ask
  • 添加到描述中。谢谢。

标签: python docker parallel-processing joblib pairwise-distance


【解决方案1】:

如果您将要并行化的代码包装在 joblib.Parallel() context manager 中,会有什么不同吗?

X = pd.DataFrame(np.random.randint(0, 100, size=(1000, 4)), columns=list("ABCD"))
Y = pd.DataFrame(np.random.randint(0, 100, size=(10000, 4)), columns=list("ABCD"))

with joblib.Parallel(n_jobs=-1):
    distances = pairwise_distances(
        X.to_numpy(),
        Y.to_numpy(),
        metric=lambda u, v: round(
            (np.sum(np.minimum(u, v), axis=0) / np.sum(u, axis=0)) * 100, 2
        ),
        n_jobs=-1,
    )

output = pd.DataFrame(distances, columns=Y.index, index=X.index)
# ...

【讨论】:

  • 谢谢。我试过你的建议。但是,仍然只使用一个 CPU。我认为问题在于 docker 无法访问 EC2 机器上的多个内核。
猜你喜欢
  • 2017-11-22
  • 2020-01-07
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2018-10-22
  • 2018-12-15
相关资源
最近更新 更多