Вот информация о моем процессоре:
Я использую 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?