Я работаю над кластером и использую пакет snowfall
для создания кластера сокетов на 5 узлах по 40 процессоров в каждом с помощью следующей команды:
> sfInit(parallel=TRUE, cpus = 200, type="SOCK", socketHosts=c("host1", "host2", "host3", "host4", "host5"));
R Version: R version 3.1.0 (2014-04-10)
snowfall 1.84-6 initialized (using snow 0.3-13): parallel execution on 5 CPUs.
Когда я проверял отчет о кластере, я вижу гораздо более низкую нагрузку на ведомые устройства, чем ожидалось, и был смущен тем фактом, что в нем говорится «параллельное выполнение на 5 ЦП» вместо «параллельное выполнение на 200 ЦП». Это просто двусмысленная ссылка на процессоры или каждый хост использует только один процессор?
РЕДАКТИРОВАТЬ: вот пример того, почему меня это беспокоит, если я использую только локальную машину и указываю максимальное количество ядер, у меня есть:
> sfInit(parallel=TRUE, type="SOCK", cpus = 40);
snowfall 1.84-6 initialized (using snow 0.3-13): parallel execution on 40 CPUs.
Я выполнил идентичную работу на одном узле, кластере с 40 ЦП, и потребовалось 1,4 минуты, в то время как кластер с 5 узлами, по-видимому, с 5 ЦП занял 5,22 минуты. Для меня это подтверждает мои подозрения, что я работаю с параллелизмом на 5 узлах, но включаю только 1 из процессоров на каждом узле.
Тогда у меня вопрос: как включить все процессоры для использования на всех доступных узлах?
РЕДАКТИРОВАТЬ: @SimonG Я использовал инициализацию базового пакета snow
, и мы ясно видим, что включены только 5 узлов:
> cl <- makeSOCKcluster(names = c("host1", "host2", "host3", "host4", "host5"), count = 200)
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.9854311 0.5737885 0.8495582
[[2]]
[1] 0.7272693 0.3157248 0.6341732
[[3]]
[1] 0.26411931 0.36189866 0.05373248
[[4]]
[1] 0.3400387 0.7014877 0.6894910
[[5]]
[1] 0.2922941 0.6772769 0.7429913
> stopCluster(cl)
> cl <- makeSOCKcluster(names = rep("localhost", 40), count = 40)
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.6914666 0.7273244 0.8925275
[[2]]
[1] 0.3844729 0.7743824 0.5392220
[[3]]
[1] 0.2989990 0.7256851 0.6390770
[[4]]
[1] 0.07114831 0.74290601 0.57995908
[[5]]
[1] 0.4813375 0.2626619 0.5164171
.
.
.
[[39]]
[1] 0.7912749 0.8831164 0.1374560
[[40]]
[1] 0.2738782 0.4100779 0.0310864
Думаю, это довольно ясно показывает. Я в отчаянии попробовал это:
> cl <- makeSOCKcluster(names = rep(c("host1", "host2", "host3", "host4", "host5"), each = 40), count = 200)
и предсказуемо получили:
Error in socketConnection(port = port, server = TRUE, blocking = TRUE, :
all connections are in use
snowfall
ограничивает количество свободных для использования процессоров до 32 по умолчанию. Есть команда (sfSetMaxCPUs
), чтобы изменить это. (2.) Чтобы проверить, работает ли ваш кластер, пример задания, который вы использовали, мог быть неадекватным. Задание выполняется на одном компьютере в течение короткого времени. На самом деле разумно предположить, что общение между хостами здесь ничего не спасает. - person SimonG   schedule 19.08.2014cpus
может не работать, давая числоsocketHosts
. Вам следует проверить это более тщательно, составив работу, которая достаточно нагружает ЦП и использует мало памяти и жесткого диска. Затем вы пробуете разные комбинации (один хост, два хоста ... 2 процессора, 4, 8, 16 ...). Это даст вам лучшую основу для оценки того, работает ли ваш кластер. В противном случае трудно судить, какова стоимость производительности из-за кластера или просто задачи (которая может быть слишком простой или предъявлять ложные требования, что увеличивает стоимость параллельных вычислений). - person SimonG   schedule 19.08.2014