多处理未在双处理器 windows 机器上实现完全 CPU 使用
multiprocessing not achieving full CPU usage on dual-processor windows machine
我正在双处理器 windows 机器上工作,并尝试使用多处理库 运行 几个独立的 python 进程。当然,我的目标是最大限度地利用两个 CPU 以加快计算时间。我机器的详细信息如下:
- OS:Windows 10 Pro for Workstations
- 内存:524GB
- 硬盘:三星 SSD PRO 960 (NVMe)
- CPU:Xeon Gold 6154(时间 2)
我使用 Python 3.6 执行主脚本,然后使用多处理库生成 72 个独立于内存的工作程序。最初,我机器的所有 72 个内核都以 100% 使用。但是,大约 5-10 分钟后,我的第二个 CPU 上的所有 36 个内核的使用率都降至 0%,而第一个 CPU 上的 36 个内核仍保持在 100%。我不明白为什么会这样。
关于在双处理器 Windows 机器中使用两个 CPU,我是否遗漏了什么?我怎样才能确保我的机器的全部潜力得到利用?作为旁注,我很好奇如果我使用 Linux OS 是否会有所不同?预先感谢任何愿意为此提供帮助的人。
我的 python 主脚本的表示如下:
import pandas as pd
import netCDF4 as nc
from multiprocessing import Pool
WEATHERDATAPATH = "C:/Users/..../weatherdata/weatherfile_%s.nc4"
OUTPUTPATH = "C:/Users/....outputs/result_%s.nc4"
def calculationFunction(year):
dataset = nc.Dataset(WEATHERDATAPATH%year)
# Read the data
data1 = dataset["windspeed"][:]
data2 = dataset["pressure"][:]
data3 = dataset["temperature"][:]
timeindex = nc.num2date(dataset["time"][:], dataset["time"].units)
# Do computations with the data, primarily relying on NumPy
data1Mean = data1.mean(axis=1)
data2Mean = data2.mean(axis=1)
data3Mean = data3.mean(axis=1)
# Write result to a file
result = pd.DataFrame( {"windspeed":data1Mean,
"pressure":data2Mean,
"temperature":data3Mean,},
index=timeindex )
result.to_csv(OUTPUTPATH%year)
if __name__ == '__main__':
pool = Pool(72)
results = []
for year in range(1900,2016):
results.append( pool.apply_async(calculationFunction, (year, )))
for r in results: r.get()
事实证明问题出在 NumPy 上。正如 this solution 所解释的,NumPy 和其他几个类似的包依赖于 BLAS 库进行数值运算。该库使用多线程来提高性能。但是由于多线程是 CPU-bound,这导致 Numpy 执行的许多操作(在我的原始代码中直到中间才开始,正如我已经指出的那样),被强制到第一个 CPU.
解决方法是关闭BLAS库的多线程特性。我不确定这是否会影响性能,但在这种情况下我认为没问题。幸运的是,这很容易做到,我只需要设置一个环境变量,这是我直接在 python 代码中设置的:
import os
os.environ["OPENBLAS_MAIN_FREE"] = "1"
现在机器在我的整个代码中都满负荷运行:)
我正在双处理器 windows 机器上工作,并尝试使用多处理库 运行 几个独立的 python 进程。当然,我的目标是最大限度地利用两个 CPU 以加快计算时间。我机器的详细信息如下:
- OS:Windows 10 Pro for Workstations
- 内存:524GB
- 硬盘:三星 SSD PRO 960 (NVMe)
- CPU:Xeon Gold 6154(时间 2)
我使用 Python 3.6 执行主脚本,然后使用多处理库生成 72 个独立于内存的工作程序。最初,我机器的所有 72 个内核都以 100% 使用。但是,大约 5-10 分钟后,我的第二个 CPU 上的所有 36 个内核的使用率都降至 0%,而第一个 CPU 上的 36 个内核仍保持在 100%。我不明白为什么会这样。
关于在双处理器 Windows 机器中使用两个 CPU,我是否遗漏了什么?我怎样才能确保我的机器的全部潜力得到利用?作为旁注,我很好奇如果我使用 Linux OS 是否会有所不同?预先感谢任何愿意为此提供帮助的人。
我的 python 主脚本的表示如下:
import pandas as pd
import netCDF4 as nc
from multiprocessing import Pool
WEATHERDATAPATH = "C:/Users/..../weatherdata/weatherfile_%s.nc4"
OUTPUTPATH = "C:/Users/....outputs/result_%s.nc4"
def calculationFunction(year):
dataset = nc.Dataset(WEATHERDATAPATH%year)
# Read the data
data1 = dataset["windspeed"][:]
data2 = dataset["pressure"][:]
data3 = dataset["temperature"][:]
timeindex = nc.num2date(dataset["time"][:], dataset["time"].units)
# Do computations with the data, primarily relying on NumPy
data1Mean = data1.mean(axis=1)
data2Mean = data2.mean(axis=1)
data3Mean = data3.mean(axis=1)
# Write result to a file
result = pd.DataFrame( {"windspeed":data1Mean,
"pressure":data2Mean,
"temperature":data3Mean,},
index=timeindex )
result.to_csv(OUTPUTPATH%year)
if __name__ == '__main__':
pool = Pool(72)
results = []
for year in range(1900,2016):
results.append( pool.apply_async(calculationFunction, (year, )))
for r in results: r.get()
事实证明问题出在 NumPy 上。正如 this solution 所解释的,NumPy 和其他几个类似的包依赖于 BLAS 库进行数值运算。该库使用多线程来提高性能。但是由于多线程是 CPU-bound,这导致 Numpy 执行的许多操作(在我的原始代码中直到中间才开始,正如我已经指出的那样),被强制到第一个 CPU.
解决方法是关闭BLAS库的多线程特性。我不确定这是否会影响性能,但在这种情况下我认为没问题。幸运的是,这很容易做到,我只需要设置一个环境变量,这是我直接在 python 代码中设置的:
import os
os.environ["OPENBLAS_MAIN_FREE"] = "1"
现在机器在我的整个代码中都满负荷运行:)