Ответ 1
У меня было довольно много проблем с параллельной установкой EC2, когда пытались сохранить мастер node локальный. Использование StarCluster для настройки пула очень помогло, но реальное улучшение пришло с использованием StarCluster и имеющего мастер node в частном IP-пуле EC2.
StarCluster устанавливает всю обработку ключей для всех узлов, а также для любых используемых монтировок. Динамическое распределение node не выполнялось, но если спотовые экземпляры не будут использоваться в долгосрочной перспективе, и ваша стратегия назначения ставок не "сохранит" ваши экземпляры, тогда динамическое распределение должно быть проблемой.
Некоторые другие уроки:
- Создайте переменную, содержащую частные IP-адреса, чтобы перейти на createCluster и экспортировать ее, поэтому, когда вам нужно перезапустить с одними и теми же узлами, это проще.
- Попросите мастер node запустить byobu и настройте его для ведения сеанса R.
- Запуск RStudio-сервера на master может быть очень полезным время от времени, но должен быть другим AMI, чем подчиненные узлы.:)
- Управляйте script файлами rda данных для загрузки на путь, который удаленно контролируется для новых файлов и автоматически загружает их.
- Используйте htop для мониторинга подчиненных устройств, чтобы вы могли легко видеть экземпляры и определять требования script (память/процессор/масштабируемость).
- Использовать сценарии включения/отключения процессора с поддержкой гиперпотоков.
У меня возникла небольшая проблема с подчиненными соединениями и сериализацией /unserialize, и выяснилось, что одной из причин является ограничение соединения и что ограничение соединения должно быть уменьшено на количество узлов; и когда управление script было остановлено, самый простой способ очистки - перезапустить мастер-сеанс R и использовать script, чтобы убить подчиненные процессы вместо ожидания таймаута.
Для настройки понадобилось немного работы, но, надеюсь, эти мысли помогут...
Хотя это было 8 месяцев назад, и оба StarCluster и R изменили здесь некоторые из того, как это было настроено... Вы найдете 90% этого в документах StarCluster.
- Настройки .starcluster/config AWS и разделы пары ключей, основанные на информации о безопасности с консоли AWS.
- Определите [smallcluster]
- ключ-имя
- наличие зоны
- Определите шаблон кластера, расширяющий [smallcluster]. Использование AMI на основе AMI StarCluster 64bit HVM. Вместо создания новых публичных экземпляров AMI я просто сохранил настроенный экземпляр (со всеми необходимыми инструментами) и использовал его как AMI.
Вот пример одного...
[cluster Rnodes2]
EXTENDS=smallcluster
MASTER_INSTANCE_TYPE = cc1.4xlarge
MASTER_IMAGE_ID= ami-7621f91f
NODE_INSTANCE_TYPE = cc2.8xlarge
NODE_IMAGE_ID= ami-7621f91f
CLUSTER_SIZE= 8
VOLUMES= rdata
PLUGINS= pkginstaller
SPOT_BID= 1.00
- Настройте общий том, в котором находятся журналы экрана /byoubu, основной вывод контрольной точки .R script, общие данные R и источник для производственного пакета. Он отслеживался для новых файлов в дочернем пути, называемом export, поэтому, если кластер или элемент управления script умерли/исправили максимальное количество записей, все это было бы потеряно и должно быть пересчитано.
После создания общего тома определение было просто:
[volume rdata]
VOLUME_ID = vol-1145497c
MOUNT_PATH = /rdata
Установщик пакетов, который обеспечивал последние (и равные) версии R на всех узлах.
[plugin pkginstaller]
setup_class = starcluster.plugins.pkginstaller.PackageInstaller
packages = r-base, r-base-dev, r-recommended
Наконец, разрешения доступа для обоих серверов ssh и RStudio. Https через прокси-сервер будет более безопасным, но поскольку RStudio использовался только для настройки управления script...
[permission ssh]
# protocol can be: tcp, udp, or icmp
protocol = tcp
from_port = 22
to_port = 22
# [permission http]
protocol = tcp
from_port = 8787
to_port = 8787
Затем запустите кластер, используя интерфейс StarCluster. Он обрабатывает все элементы управления доступом, имена систем, общие папки и т.д. После запуска кластера я запускал сеанс ssh в каждой из моей локальной системы и запускал script, чтобы остановить гиперпоточность:
#!/bin/sh
# disable hyperthreading
for cpunum in $(
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list |
cut -s -d, -f2- | tr ',' '\n' | sort -un); do
echo 0 > /sys/devices/system/cpu/cpu$cpunum/online
done
затем запустил htop-сессию для каждого из них для контроля масштабируемости по сравнению с экспортированными журналами контрольных точек.
Затем, войдя в мастер, запустил сеанс экрана (с тех пор я предпочитал byobu) и запускал R из встроенного тома StarCluster. Таким образом, когда кластер остановился по какой-то причине, я мог бы легко настроить снова, просто запустив R. Когда-то в R сначала нужно было создать переменную workers.list
, используя имена nodeXXX
, что было просто чем-то вроде:
cluster.nodes <- c("localhost", paste("node00", 1:7, sep='' ) )
workers.list <- rep( cluster.nodes, 8 )
Затем я загрузил элемент управления script, запустил и сохранил рабочее пространство. Элемент управления script обработал весь вывод таблицы для экспорта и контрольных точек и парных завершенных вызовов в производственный пакет. Основная функция script также приняла аргумент cpus
, в котором был помещен рабочий список, который затем передавался как cores
в инициализатор кластера.
initialize.cluster <- function( cores )
{
if( exists( 'cl' ) ) stopCluster( cl )
print("Creating Cluster")
cl <- makePSOCKcluster( cores )
print("Cluster created.")
assign( 'cl', cl, envir=.GlobalEnv )
print( cl )
# All workers need to have the bounds generator functions...
clusterEvalQ( cl, require('scoreTarget') )
# All workers need to have the production script and package.
clusterExport( cl, varlist=list('RScoreTarget', 'scoreTarget'))
return ( cl )
}
После перезапуска сеанса R (после первоначального создания employee.list) был создан элемент управления script и вызван основной func. Вот и все. С этой настройкой, если бы кластер когда-либо остановился, я просто оставил бы rsession на главном хосте; остановите подчиненные процессы через htop на каждом из подчиненных устройств и снова запустите.
Вот пример этого в действии::
R
R version 2.15.0 (2012-03-30)
Copyright (C) 2012 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
[Previously saved workspace restored]
> source('/rdata/buildSatisfactionRangeTable.R')
Loading required package: data.table
data.table 1.7.7 For help type: help("data.table")
Loading required package: parallel
Loading required package: scoreTarget
Loading required package: Rcpp
> ls()
[1] "build.satisfaction.range.table" "initialize.cluster"
[3] "initialize.table" "parallel.choices.threshold"
[5] "rolled.lower" "rolled.upper"
[7] "RScoreTarget" "satisfaction.range.table"
[9] "satisfaction.search.targets" "search.range.bound.offsets"
[11] "search.range.bounds" "search.range.center"
[13] "Search.Satisfaction.Range" "update.bound.offset"
[15] "workers.list"
> workers.list
[1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost"
[7] "localhost" "localhost" "node001" "node002" "node003" "node004"
[13] "node005" "node006" "node007" "node001" "node002" "node003"
[19] "node004" "node005" "node006" "node007" "node001" "node002"
[25] "node003" "node004" "node005" "node006" "node007" "node001"
[31] "node002" "node003" "node004" "node005" "node006" "node007"
[37] "node001" "node002" "node003" "node004" "node005" "node006"
[43] "node007" "node001" "node002" "node003" "node004" "node005"
[49] "node006" "node007" "node001" "node002" "node003" "node004"
[55] "node005" "node006" "node007" "node001" "node002" "node003"
[61] "node004" "node005" "node006" "node007" "node001" "node002"
[67] "node003" "node004" "node005" "node006" "node007" "node001"
[73] "node002" "node003" "node004" "node005" "node006" "node007"
[79] "node001" "node002" "node003" "node004" "node005" "node006"
[85] "node007" "node001" "node002" "node003" "node004" "node005"
[91] "node006" "node007" "node001" "node002" "node003" "node004"
[97] "node005" "node006" "node007" "node001" "node002" "node003"
[103] "node004" "node005" "node006" "node007" "node001" "node002"
[109] "node003" "node004" "node005" "node006" "node007" "node001"
[115] "node002" "node003" "node004" "node005" "node006" "node007"
> build.satisfaction.range.table(500000, FALSE, workers.list )
[1] "Creating Cluster"
[1] "Cluster created."
socket cluster with 120 nodes on hosts ‘localhost’, ‘node001’, ‘node002’, ‘node003’, ‘node004’, ‘node005’, ‘node006’, ‘node007’
Parallel threshold set to: 11000
Starting at: 2 running to: 5e+05 :: Sat Apr 14 22:21:05 2012
Если вы прочитали здесь, вам может быть интересно узнать, что я протестировал каждую настройку кластера, которую я мог (в том числе openMPI), и обнаружил, что разница в скорости не была, возможно, это потому, что мои вычисления там, где это связано с процессором, возможно, нет.
Кроме того, не сдавайтесь, даже если это может быть болью для перехода с HPC. Это может стоить того. Я все еще ожидал завершения первых 100 000 итераций вычислений, которые я выполнял, если бы я придерживался наивной реализации в base-R на товарной рабочей станции (ну, на самом деле, так как я никогда бы не застрял с R: D). С кластером 384 000 итераций завершены в течение недели. Всего стоит потратить время (и потребовалось много всего) для настройки.