многопроцессорность не позволяет полностью использовать процессор на двухпроцессорной машине с Windows - PullRequest
0 голосов
/ 12 мая 2018

Я работаю на двухпроцессорной машине с Windows и пытаюсь запустить несколько независимых процессов Python, используя многопроцессорную библиотеку. Конечно, я стремлюсь максимально использовать оба процессора, чтобы ускорить время вычислений. Детали моей машины ниже:

  • ОС: Windows 10 Pro для рабочих станций
  • RAM: 524 ГБ
  • Жесткий диск: Samsung SSD PRO 960 (NVMe)
  • Процессор: Xeon Gold 6154 (раз 2)

Я выполняю мастер-скрипт с использованием Python 3.6, который затем порождает 72 независимых от памяти рабочих, использующих многопроцессорную библиотеку. Изначально все 72 ядра моей машины используются на все 100%. Однако примерно через 5-10 минут все 36 ядер на моем втором ЦП сокращают загрузку до 0%, а 36 ядер на первом ЦП остаются на уровне 100%. Я не могу понять, почему это происходит.

Есть ли что-то, чего мне не хватает в отношении использования обоих процессоров на двухпроцессорной машине с Windows? Как я могу гарантировать, что весь потенциал моей машины используется? Как примечание, мне интересно, если бы я использовал ОС Linux, это было бы иначе? Заранее благодарю всех, кто готов помочь с этим.

Ниже приведено представление моего основного сценария 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()

1 Ответ

0 голосов
/ 16 мая 2018

Оказывается, проблема была с NumPy.Как объясняет это решение , NumPy и несколько других аналогичных пакетов полагаются на библиотеку BLAS для работы с числами.Эта библиотека использует многопоточность для увеличения производительности.Но поскольку многопоточность привязана к процессору, это заставляет многие операции, выполняемые Numpy (которые в моем исходном коде не начинаются до середины, как я уже указывал), принудительно переноситься на первый процессор.

Решение состоит в том, чтобы отключить многопоточность библиотеки BLAS.Я не уверен, влияет ли это на производительность, но в этом случае я думаю, что все будет хорошо.К счастью, это легко сделать, мне нужно было только установить одну переменную среды, которую я сделал непосредственно в своем коде Python:

import os
os.environ["OPENBLAS_MAIN_FREE"] = "1"

Теперь машина работает на полную мощность по всему моему коду:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...