Количество параллельно работающих процессов определяется количеством физических ЦП или количеством логических ЦП?

Вот информация о моем процессоре:

введите здесь описание изображения

Я использую ray для обучения алгоритмов обучения с подкреплением, где я определяю Learner класс, украшенный @ray.remote(num_cpus=2) и Worker класс, награжденный ray.remote(num_cpus=1). Сколько рабочих я могу иметь, чтобы получить максимальную производительность?

Раньше я устанавливал количество воркеров на 8-10, но сегодня я столкнулся с этим пост, в котором говорится

Для многих рабочих нагрузок (особенно числовых рабочих нагрузок) часто нельзя ожидать большего ускорения, чем число физических ЦП.

Кажется, это говорит о том, что количество физических процессоров ограничивает количество процессов, работающих параллельно. Означает ли это, что я не должен использовать более 4 рабочих процессов для достижения максимальной производительности, предполагая, что рабочие процессы интенсивно используют ЦП? Я надеюсь, что кто-то может дать мне подробное объяснение (или ссылку). Заранее спасибо.

Обновлять

Спасибо за комментарии @AMC и @KlausD.. Я обновляю свой вопрос здесь, надеясь, что он сделает мой вопрос более ясным.

Я сделал несколько тестов. Например, я проводил эксперименты с 1, 3, 8 работниками по отдельности. Вот результат:

  • Для случая с 1 рабочим требуется 4 м 17 с, чтобы выполнить 400 шагов.
  • В случае с тремя работниками в среднем требуется 4 минуты 29 секунд, чтобы пройти 400 шагов.
  • Для случая с 6 работниками в среднем требуется 5 минут 30 секунд, чтобы пройти 400 шагов.

Я пришел к выводу, что конфликт ЦП произошел в случае с 6 рабочими. Однако я открыл top (где я мог видеть 12 ЦП), чтобы проверить загрузку ЦП, все рабочие использовали около 100% ЦП. Поэтому я понятия не имел, был ли мой вывод правильным.

Я также написал небольшую программу для дальнейшего тестирования. Код приведен ниже

from time import time
import numpy as np
import ray


@ray.remote(num_cpus=1)
def f(x, y):
    start = time()
    while True:
        x += y
        if np.mean(x) > 100:
            break
    return time() - start

if __name__ == '__main__':
    # I intend to make x and y large to increase the cpu usage.
    x = np.random.rand(1000, 10000)
    y = np.random.uniform(0, 3, (1000, 10000))
    print('x mean:', np.mean(x))
    print('y mean:', np.mean(y))
    for n in range(1, 30, 3):
        ray.init()

        start = time()
        result = ray.get([f.remote(x, y) for _ in range(n)])

        print('Num of workers:', n)
        # print('Run time:', result)
        print('Average run time:', np.mean(result))
        print('Ray run time:', time() - start)
        ray.shutdown()

Вот результат

x mean: 0.4998949941471149
y mean: 1.4997634832632463

Num of workers: 1
Average run time: 1.3638701438903809
Ray run time: 2.1305620670318604

Num of workers: 4
Average run time: 3.1797224283218384
Ray run time: 4.065998554229736

Num of workers: 7
Average run time: 5.139907530375889
Ray run time: 6.446819543838501

Num of workers: 10
Average run time: 7.569052147865295
Ray run time: 8.996447086334229

Num of workers: 13
Average run time: 8.455958109635572
Ray run time: 11.761570692062378

Num of workers: 16
Average run time: 7.848772034049034
Ray run time: 13.739320278167725

Num of workers: 19
Average run time: 8.033894174977354
Ray run time: 16.16210103034973

Num of workers: 22
Average run time: 8.699185609817505
Ray run time: 18.566803693771362

Num of workers: 25
Average run time: 8.966830835342407
Ray run time: 21.45942711830139

Num of workers: 28
Average run time: 8.584995950971331
Ray run time: 23.2943696975708

Я ожидал, что по крайней мере случай с 4 рабочими процессами займет почти столько же времени, сколько и случай с 1 рабочим, поскольку у меня 6 физических ядер. Но результат, кажется, предполагает другую историю. Кроме того, я не понимаю, почему Average run time перестает расти, когда количество рабочих превышает 10?


person Maybe    schedule 19.01.2020    source источник
comment
Как насчет того, чтобы проверить некоторые числа и посмотреть, какой из них будет самым быстрым?   -  person Klaus D.    schedule 19.01.2020
comment
Надеюсь, кто-нибудь сможет предоставить мне подробное объяснение (или ссылку). Подробное объяснение чего именно? Содержание этой ссылки кажется вполне ясным, не так ли? Кроме того, я думаю, что название поста может быть слишком двусмысленным/расплывчатым.   -  person AMC    schedule 19.01.2020
comment
Привет, я обновил свой вопрос, добавив некоторые экспериментальные результаты. Надеюсь, в этот раз будет понятнее.   -  person Maybe    schedule 20.01.2020


Ответы (1)


Количество процессов, которые вы можете запускать параллельно, зависит от количества доступных рабочих, для которых ваш компьютер может запускать процессы, это находится в прямой зависимости от доступных ядер и процессоров вашего компьютера (двухъядерные системы и т. д.). Чем больше рабочих процессов доступно через доступные ядра процессора, тем больше процессов вы можете запускать одновременно. Я работаю на Linux-машине, и один из способов проверить информацию о вашем процессоре —

cat /proc/cpuinfo

Если вы используете многопроцессорность в python, я бы рекомендовал использовать concurrent.futures, поскольку она отлично справляется с автоматическим запуском нужного количества рабочих процессов для оптимальной производительности параллельных задач в зависимости от характеристик вашего компьютера, хотя вы можете перезаписать ее, если хотите больше или меньше рабочих процессов.

Итак, чтобы ответить на ваш вопрос о ядрах, ядра — это то, что управляет шоу под металлическим радиатором на процессоре. Это физические чипы внутри вашего компьютера, они не метафоричны и не логичны. Каждый из них представляет собой полноценный ЦП сам по себе, поскольку все они могут одновременно выполнять совершенно разные фрагменты кода.

Причина, по которой ваш эксперимент оказался контрпродуктивным, очень проста. Вашему компьютеру требуется время для создания и назначения задач (процессов) рабочим (ядрам процессора) и дополнительное время для закрытия этих процессов после их завершения. Это дополнительное время, которое вы продолжали возвращать в свой эксперимент, и это причина того, что 1 рабочий процесс занял меньше времени для вычислений, чем любое другое количество рабочих процессов, и если вы заметили, что чем больше рабочих процессов вы использовали, тем больше времени это заняло, потому что больше процессов было запущено. быть назначены большему количеству рабочих и закрыты после завершения. Таким образом, поскольку при вычислении программы не экономилось время, это просто замедляло ваш код, что означает, что они не были какими-то тяжелыми вычислениями, поэтому один рабочий выполнял задачи с оптимальной эффективностью, но когда вы вводили больше рабочих, нужно было выполнять больше процессов. созданный из исходной задачи и назначенный новым созданным рабочим (что увеличит время, необходимое для запуска вашего кода), и когда эти процессы будут завершены, их придется закрыть (что также увеличит время, необходимое для завершения вашей программы он запущен).

Обычно многопроцессорность рекомендуется только для очень тяжелых операций, связанных с процессором (тяжелые вычислительные вычисления, игры и т. д.), если они не становятся неэффективными и просто замедляют работу вашей программы. В других случаях, чтобы обрабатывать вещи, которые не привязаны к ЦП, вам следует изучить использование потоков (модуль, который я рекомендовал, также поддерживает это) или асинхронное кодирование с асицио

person maestro.inc    schedule 20.01.2020
comment
Спасибо за ответы. Мне интересно, означают ли ядра ЦП физические ЦП, а процессоры предполагают логические ЦП? Не могли бы вы помочь мне объяснить результаты моего эксперимента? - person Maybe; 20.01.2020
comment
Привет, @maestro.inc, спасибо за терпение. Ядра — это физические процессоры, я прав? Кроме того, мне очень жаль, что я не указал на свое замешательство по поводу результатов эксперимента. Я немного отредактировал раздел обновления, чтобы сделать его более понятным. - person Maybe; 20.01.2020
comment
Ядра являются частью ЦП вашей системы, которые могут работать индивидуально, как и сами ЦП. Также я выделил часть моего ответа, которая напрямую касается вашего замешательства по поводу ваших результатов во время эксперимента. - person maestro.inc; 21.01.2020
comment
Привет @maestro.inc. Ваш основной момент объяснил увеличение «Время выполнения луча», но я все еще не понимаю, почему «Среднее время выполнения» сначала увеличивается, а потом остается почти таким же. Как «Среднее время выполнения» связано со стоимостью новых процессов? - person Maybe; 21.01.2020
comment
Как и в большинстве экспериментов, в какой-то момент вы дойдете до того, что результаты начнут вести себя не так, как вы ожидаете, очень вероятно, что именно это и происходит в вашем эксперименте. Модель вашей системы по вашему эксперименту достигает около 20 воркеров, то есть от 20 воркеров и выше это не имеет большого значения для среднего времени или рабочей нагрузки, разница либо почти незначительна, либо полностью отсутствует. - person maestro.inc; 22.01.2020
comment
Почему «Среднее время выполнения» не увеличивается по мере увеличения числа рабочих? Вы предложили, чтобы система планировала только 20 рабочих за один раз и откладывала остальных до тех пор, пока некоторые из этих 20 рабочих не будут завершены? - person Maybe; 24.01.2020