R и makePSOCKcluter EC2 Разъем
Я хотел бы иметь возможность подключить мой Mac к моим инстансам EC2 для выполнения параллельной обработки на AWS через parallel
использование пакета makePSOCKcluster
или же makeSOCKCluster
,
В данный момент моя попытка оставляет R "висящей", поэтому я адаптировал makePSOCKcluster
и некоторые из его подпрограмм, так что некоторые из его выходных данных можно увидеть, добавив -v
вариант в сш. Я думаю, что мне удалось справиться с паролем SSH логин, но я застрял на socketConnection
часть, которая, я думаю, вызывает проблемы.
Я попытался связать Elastic IPs и использовать их в качестве IP-адресов безрезультатно, также попытался настроить группы безопасности так, чтобы он включал порт по умолчанию, который makePSOCKcluster использует безрезультатно... В последнем случае я не использовал аргумент ports и использовал параметр порта по умолчанию 10187, к которому он говорит:
Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, :
cannot open the connection
In addition: Warning message:
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, :
port 10187 cannot be opened
Рассматривая несколько вопросов из списка рассылки hpc, это казалось проблемой, связанной с Windows... но, учитывая, что я подключаюсь с Mac, я не думаю, что подпадаю под эту категорию.
hosts
Объект - это просто общедоступный DNS, который предоставляется после запуска экземпляра EC2.
Ниже моя нынешняя попытка адаптировать некоторые из makePSOCKcluster
функция к makePSOCKcluster1
они должны быть примерно одинаковыми.
Я указал rscript
параметр, чтобы соответствовать тому, что можно ожидать в экземпляре Ubuntu, и я указал ubuntu
в качестве имени пользователя для входа в систему, как на экземпляре Ubuntu EC2.
makePSOCKcluster1 <- function (names, ...) {
if (is.numeric(names))
names <- rep("localhost", names[1])
options <- parallel:::addClusterOptions(parallel:::defaultClusterOptions, list(...))
cl <- vector("list", length(names))
for (i in seq_along(cl)) cl[[i]] <- newPSOCKnode1(names[[i]],
options = options, rank = i)
class(cl) <- c("SOCKcluster", "cluster")
cl
}
newPSOCKnode1 <- function (machine = "localhost", ..., options = parallel:::defaultClusterOptions,
rank)
{
options <- options
if (is.list(machine)) {
options <- options
machine <- machine$host
}
outfile <- parallel:::getClusterOption("outfile", options)
master <- if (machine == "localhost")
"localhost"
else parallel:::getClusterOption("master", options)
port <- parallel:::getClusterOption("port", options)
manual <- parallel:::getClusterOption("manual", options)
timeout <- parallel:::getClusterOption("timeout", options)
methods <- parallel:::getClusterOption("methods", options)
useXDR <- parallel:::getClusterOption("useXDR", options)
env <- paste("MASTER=", master, " PORT=", port, " OUT=",
outfile, " TIMEOUT=", timeout, " METHODS=", methods,
" XDR=", useXDR, sep = "")
arg <- "parallel:::.slaveRSOCK()"
rscript <- if (parallel:::getClusterOption("homogeneous", options)) {
shQuote(parallel:::getClusterOption("rscript", options))
}
else "Rscript"
cmd <- paste(rscript, "-e", shQuote(arg), env)
renice <- parallel:::getClusterOption("renice", options)
if (!is.na(renice) && renice)
cmd <- sprintf("nice +%d %s", as.integer(renice), cmd)
if (manual) {
cat("Manually start worker on", machine, "with\n ",
cmd, "\n")
flush.console()
}
else {
if (machine != "localhost") {
rshcmd <- parallel:::getClusterOption("rshcmd", options)
user <- parallel:::getClusterOption("user", options)
cmd <- shQuote(cmd)
cmd <- paste(rshcmd, "-v -l", user, machine, cmd)
print(cmd)
}
if (.Platform$OS.type == "windows") {
system(cmd, wait = FALSE, input = "")
}
else system(cmd, wait = FALSE)
}
print("ssh done!!! about to start socketConnection....")
con <- socketConnection("localhost", port = port, server = TRUE,
blocking = TRUE, open = "a+b", timeout = timeout)
print("socketConnection complete!!!")
structure(list(con = con, host = machine, rank = rank), class = if (useXDR)
"SOCKnode"
else "SOCK0node")
}
hosts <- c("ec2-xxx-xx-xxx-xxxx.zone.compute.amazonaws.com","ec2-xx-xxx-xxx-xxx.zone.compute.amazonaws.com")
# the code to try and connect to the actual EC2 instance...
cl1 <- makePSOCKcluster1(hosts, user="ubuntu", rscript="/usr/lib/R/bin/Rscript", port=8787)
[1] "ssh -v -l ubuntu ec2-xxxxxxxxxxx.zone.compute.amazonaws.com \"'/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=local.machine.name PORT=8787 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE\""
[1] "ssh done!!! about to start socketConnection...."
OpenSSH_5.2p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to ec2-xxxxxxxxxxx.zone.compute.amazonaws.com [xx.xxx.xx.x.x] port 22.
debug1: Connection established.
debug1: identity file /Users/username/.ssh/identity type -1
debug1: identity file /Users/username/.ssh/id_rsa type 1
debug1: identity file /Users/username/.ssh/id_dsa type 2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9p1 Debian-5ubuntu1
debug1: match: OpenSSH_5.9p1 Debian-5ubuntu1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.2
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
Warning: Permanently added 'ec2-xx-xx-xxx-xxx-xx.ap-southeast-1.compute.amazonaws.com,xx.xxx.xxx.xx.x' (RSA) to the list of known hosts.
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /Users/username/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending command: '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=local.machine.name PORT=8787 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
debug1: fd 2 clearing O_NONBLOCK
Transferred: sent 2352, received 2400 bytes, in 20.0 seconds
Bytes per second: sent 117.5, received 119.9
debug1: Exit status 1
Я использую Mac на OS X 10.6.8 для подключения к экземпляру Debian Ubunutu. Если есть лучшие способы подключения к экземплярам EC2 для выполнения параллельной обработки, о которых люди знают, это также было бы чрезвычайно полезно.
Конечной целью является использование foreach
выполнить эту обработку после регистрации кластера.
Также в качестве побочного вопроса мне было интересно, каковы плюсы и минусы скорости / обработки, связанные с параллельным выполнением процесса по сравнению с использованием MPI? или какой-то другой метод?
Заранее спасибо!
РЕДАКТИРОВАТЬ Мне удалось получить makePSOCKcluster
работать, если начать с отдельного экземпляра EC2, и parLapply
функция работает, и я даже могу зарегистрироваться, используя registerDoParallel(cl1)
где cl1
это кластерный объект, но по какой-то причине foreach
... %dopar%
не работает... выдает ошибку:
Error in serialize(data, node$con) : error writing to connection
или же
Error in unserialize(node$con) : error reading from connection
связи кажутся нормальными, если смотреть на showConnections()
с этим как следующий вывод:
> showConnections()
description class mode text isopen can read can write
3 "<-ip-xx-xxxx-x-xxx.zone.compute.internal:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
4 "<-ip-yy-yyyy-y-yyyy.zone.compute.internal:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
5 "<-ip-zz-zzzz-z-zzzz.zone.compute.internal:10187" "sockconn" "a+b" "binary" "opened" "yes" "yes"
>
где x
,y
& z
представляют разные IP-адреса.... foreach
примеры выходят непосредственно из примеров, приведенных в справочных файлах foreach
и, кроме того, некоторые из clusterCall
/clusterExport
/clusterEvalQ
функции от parallel
пакет тоже не работает... выдает подобное сообщение об ошибке как раньше....
Я все еще хотел бы иметь возможность подключения с Mac... но также хотел бы иметь возможность использовать foreach для параллельной обработки... надеюсь, что дополнительная информация поможет