doParallel, кластер против ядер

В чем разница между кластером и ядрами в registerDoParallel при использовании пакета doParallel?

Правильно ли я понимаю, что на одной машине они взаимозаменяемы, и я получу одинаковые результаты для:

cl <- makeCluster(4)
registerDoParallel(cl)    

и

registerDoParallel(cores = 4)

Единственная разница, которую я вижу, это то, что makeCluster() нужно останавливать явно с помощью stopCluster().


person Tomas Greif    schedule 03.03.2015    source источник
comment
Не уверен, но предполагаю, что физически вы будете ограничены количеством ядер, а не количеством кластеров, то есть количеством копий R, работающих параллельно и взаимодействующих через сокеты. Конечно, кластеры потенциально могут использовать одно и то же ядро, в зависимости от соотношения количество кластеров/количество ядер.   -  person    schedule 03.03.2015
comment
Я склонен согласиться с @Pascal и в том, что на одной машине нет никакой разницы, за исключением того, что мы действительно пытаемся понять, чего можно достичь и как все работает. Если вы просто хотите распараллелить некоторый код, то в любом случае это не имеет значения.   -  person LauriK    schedule 03.03.2015


Ответы (3)


Поведение doParallel::registerDoParallel(<numeric>) зависит от операционной системы, подробности см. в print(doParallel::registerDoParallel).

На машинах Windows,

doParallel::registerDoParallel(4)

эффективно делает

cl <- makeCluster(4)
doParallel::registerDoParallel(cl)

то есть он установил четыре рабочих процесса (PSOCK), которые работают в фоновых сеансах R. Затем %dopar% будет в основном использовать технику parallel::parLapply(). С этой настройкой вам нужно беспокоиться о глобальных переменных и пакетах, прикрепленных к каждому из рабочих процессов.

Однако на машинах, отличных от Windows,

doParallel::registerDoParallel(4)

в результате %dopar% будет использовать механизм parallel::mclapply(), который, в свою очередь, опирается на разветвленные процессы. Поскольку используется разветвление, вам не нужно беспокоиться о глобальных переменных и пакетах.

person HenrikB    schedule 15.07.2017
comment
чтобы было ясно, почему doParallel::registerDoParallel(4) не делает то же самое, что cl <- makeCluster(4, type = "FORK"); registerDoParallel(cl) на unix-подобных? Мне кажется, что они должны быть одинаковыми, но последний намного медленнее в моем случае использования. - person linden; 09.10.2020
comment
Если вы будете следовать коду, вы увидите, что doParallel::registerDoParallel() в конечном итоге будет использовать doParallel:::doParallelMC() в Unix, который использует parallel::mclapply() для своей обработки. Напротив, использование makeCluster(4, type = "FORK") или эквивалентного parallel::makeForkCluster() создает кластер PSOCK разветвленных рабочих процессов. Когда вы передадите это doParallel::registerDoParallel(), вы в конечном итоге будете использовать doParallel:::doParallelSNOW(), который полагается на parallel::clusterApplyLB() для обработки. Итак, parallel::mclapply() против parallel::clusterApplyLB(). - person HenrikB; 09.10.2020

Я думаю, что выбранный ответ слишком общий и на самом деле неточный, поскольку он не затрагивал детали самого пакета doParallel. Если вы читаете виньетки, это на самом деле довольно ясно.

Пакет parallel представляет собой слияние пакета multicore, написанного Саймоном Урбанеком, и пакета snow, написанного Люком Тирни и другими. Многоядерная функциональность поддерживает несколько рабочих процессов только в тех операционных системах, которые поддерживают системный вызов fork; это исключает Windows. По умолчанию doParallel использует многоядерную функциональность в Unix-подобных системах и снежную функциональность в Windows.

В этой виньетке мы будем использовать подобную снегу функциональность, поэтому начнем с загрузки пакета и запуска кластера.

Чтобы использовать функциональность, подобную многоядерной, мы бы указали количество используемых ядер.

В общем, это зависит от системы. Кластер — это более общий режим, охватывающий все платформы, а ядра — только для unix-подобных систем.

Чтобы сделать интерфейс согласованным, пакет использовал одну и ту же функцию для этих двух режимов.

> library(doParallel)
> cl <- makeCluster(4)
> registerDoParallel(cl)
> getDoParName()
[1] "doParallelSNOW"

> registerDoParallel(cores=4)
> getDoParName()
[1] "doParallelMC"
person dracodoc    schedule 12.07.2017
comment
Этот ответ следует принять, поскольку он напрямую отвечает на вопрос ОП. - person R. Zhu; 03.06.2020

Да, это правильно с точки зрения программного обеспечения.

на одной машине они взаимозаменяемы, и я получу одинаковые результаты.


Чтобы четко понять «кластер» и «ядра», я предлагаю думать на уровне «аппаратного обеспечения» и «программного обеспечения».

На аппаратном уровне «кластер» означает компьютеры, подключенные к сети, которые могут работать вместе посредством связи, например, через сокет (нужны дополнительные операции инициализации/остановки, как вы указали stopCluster). В то время как «ядра» означают несколько аппаратных ядер в локальном ЦП, и они обычно работают вместе с общей памятью (не нужно явно отправлять сообщение от А к Б).

Иногда на программном уровне граница между cluster и cores не так уж и ясна. Программа может запускаться локально на ядрах или удаленно на кластере, и программному обеспечению высокого уровня не нужно знать подробности. Таким образом, мы можем смешивать два режима, например, использовать явную коммуникацию в локальном режиме как настройку cl на одном компьютере, а также можем запускать многоядерные процессоры на каждом из удаленных компьютеров.


Возвращаясь к вашему вопросу, равны ли настройки cl или cores?

С точки зрения программного обеспечения это будет то же самое, что программа будет запускаться на том же количестве клиентов/серверов, а затем получать те же результаты.

От железа может отличаться. cl означает явную связь, а cores - общую память, но если высокоуровневое программное обеспечение очень хорошо оптимизировано. На локальном компьютере обе настройки будут включены в один и тот же поток. Сейчас я не особо углубляюсь в doParallel, поэтому не уверен, что это одно и то же.

Но на практике лучше указать cores для одной машины и cl для кластера.

Надеюсь, это поможет вам.

person Patric    schedule 11.01.2016
comment
Это слишком общее. Вопрос ОП - это конкретный вопрос о пакете doParallel, а не общий концептуальный вопрос. Для этого вопроса речь идет больше о реализации платформы, и они разные даже для одной машины. - person dracodoc; 12.07.2017