Нужен ли pexpect.pxssh для написания параллельного скрипта, который выполняется на двух вычислительных узлах кластера slurm? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу написать скрипт на python, который может запускать параллельные процессы на двух вычислительных узлах кластера slurm.

Я пытался pexpect.spawn

node_list = {'cn000': 28, 'cn001': 28}
children, pid = [], 0
for node, ntasks in nnode_list.items():
    pid_range = range(pid, pid + ntasks)
    pid += ntasks
    for worker in pid_range:
        chile = pexpect.spawn(worker_command % worker)
        children.append(child)

Однако после запуска сценария все установленные соединения (захваченные lsof -i | grep port_number) являются одним из вычислительных узлов,нет соединений между двумя вычислительными узлами.

Поэтому я попытался pexpect.pxssh для решения проблемы, я попробовал скрипт:

from pexpect import pxssh 
from socket import gethostname
from getpass import getuser
connections, pid = [], 0
for node, ntasks in node_list.items():
    pid_range = range(pid, pid + ntasks)
    pid += ntasks
    if node == gethostname():
        children = []
        for worker in pid_range:
            child = pexpect.spawn(worker_command % worker)
            children.append(child)
        connections.append(children)
    if node != gethostname():
        ssh = pxssh.pxssh()
        ssh.login(node, getuser())
        for worker in pid_range:
            ssh.sendline(worker_command % worker)
        connections.append(ssh)

К сожалению, это не решает проблему, хотякомандная строка была отправлена ​​ssh.sendline, процессы не запущены.

Я знаю, srun также может быть использован для написания скрипта, который может запускать параллельные процессы, как я могу синхронизировать процессы, запущенные srun?

...