Включите все ЦП для всех узлов в кластере: пакет снег / снегопад

Я работаю над кластером и использую пакет 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

person mlegge    schedule 18.08.2014    source источник
comment
Некоторые мысли по этому поводу: (1.) snowfall ограничивает количество свободных для использования процессоров до 32 по умолчанию. Есть команда (sfSetMaxCPUs), чтобы изменить это. (2.) Чтобы проверить, работает ли ваш кластер, пример задания, который вы использовали, мог быть неадекватным. Задание выполняется на одном компьютере в течение короткого времени. На самом деле разумно предположить, что общение между хостами здесь ничего не спасает.   -  person SimonG    schedule 19.08.2014
comment
Как я понял вас, вы беспокоитесь, что аргумент cpus может не работать, давая число socketHosts. Вам следует проверить это более тщательно, составив работу, которая достаточно нагружает ЦП и использует мало памяти и жесткого диска. Затем вы пробуете разные комбинации (один хост, два хоста ... 2 процессора, 4, 8, 16 ...). Это даст вам лучшую основу для оценки того, работает ли ваш кластер. В противном случае трудно судить, какова стоимость производительности из-за кластера или просто задачи (которая может быть слишком простой или предъявлять ложные требования, что увеличивает стоимость параллельных вычислений).   -  person SimonG    schedule 19.08.2014


Ответы (1)


Внимательно прочитав документацию snow, я пришел к (частичному) решению.

Я читал, что с распределенной версией R можно открыть одновременно только 128 соединений, и убедился, что это правда. Я могу открыть 25 процессоров на каждом узле, но кластер не запустится, если я попытаюсь запустить 26 на каждом. Вот правильная структура списка хостов, который необходимо передать makeCluster:

> library(snow);

> unixHost13 <- list(host = "host1");
> unixHost14 <- list(host = "host2");
> unixHost19 <- list(host = "host3");
> unixHost29 <- list(host = "host4");
> unixHost30 <- list(host = "host5");

> kCPUs <- 25;
> hostList <- c(rep(list(unixHost13), kCPUs), rep(list(unixHost14), kCPUs),               rep(list(unixHost19), kCPUs), rep(list(unixHost29), kCPUs), rep(list(unixHost30), kCPUs));
> cl <- makeCluster(hostList, type = "SOCK")
> clusterCall(cl, runif, 3)
[[1]]
[1] 0.08430941 0.64479036 0.90402362

[[2]]
[1] 0.1821656 0.7689981 0.2001639

[[3]]
[1] 0.5917363 0.4461787 0.8000013
.
.
.
[[123]]
[1] 0.6495153 0.6533647 0.2636664

[[124]]
[1] 0.75175580 0.09854553 0.66568129

[[125]]
[1] 0.79336203 0.61924813 0.09473841

Я нашел ссылку, в которой говорится, что для увеличения соединений R необходимо перестроить с NCONNECTIONS, установленным выше (см. здесь).

person mlegge    schedule 19.08.2014