Индикатор выполнения с parfor и nohup - PullRequest
1 голос
/ 16 июня 2020

Я хотел бы отслеживать ход выполнения скрипта, использующего parfor. К сожалению, поскольку это требует большой вычислительной мощности и времени, мне приходится запускать его на удаленном многопроцессорном компьютере, используя nohup.

В качестве первой попытки я использовал fprintf, чтобы иметь вывод из каждого из параллельных экземпляров, т.е.

parfor i = 1:N
    fprintf('Computing instance %i out of %i\n', i, N)
    % Other code
end

и подсчитывая количество появлений слова «instance» в выходном файле nohup, используя grep. Однако, поскольку N имеет порядок ~ 1E8 ~ несколько сотен миллионов, выходной файл становится огромным, поэтому я бы хотел избежать его.

Затем я начинаю пробуя какой-нибудь индикатор выполнения parfor, который я могу найти на Inte rnet. Однако большинство из них используют вывод graphi c, а некоторые другие имеют некоторые недостатки при использовании вместе с nohup (например, в выходном файле я обнаружил каждое обновление индикатора выполнения, поэтому снова вывод файл будет огромным).

Как я могу эффективно контролировать parfor, используя nohup?

1 Ответ

0 голосов
/ 16 июня 2020

Q : «Как я могу эффективно контролировать parfor при использовании nohup

Я бы предпочел использовать порт ZeroMQ / JeroMQ и явно сигнализировать изнутри parfor о любом фактическом (соответствующем) прогрессе.

import org.zeromq.ZMQ;

aCtx = zmq.Ctx();
ADDR = 'tcp://127.0.0.1:75757';

parfor i = 1:N
     fprintf( 'Computing instance %i out of %i\n', i, N );
     %---------------------------------------------------------------------
                                     aSocket = aCtx.createSocket( ZMQ.PUB );    
                                     aSocket.connect( ADDR );
                                     aMessage = zmq.Msg( 9 );
                                     aMessage.put( unicode2native( 'SIG:START' ) );
                                     aSocket.send( aMessage, 1 );
     %---------------------------------------------------------------------
     % Other code
     %---------------------------------------------------------------------
                                     aMessage = zmq.Msg( 7 );
                                     aMessage.put( unicode2native( 'SIG:END' ) );
                                     aSocket.send( aMessage, 1 );
                                     aSocket.close();
     %---------------------------------------------------------------------

end

Для этого вам понадобится SUB сторона подписчика , собирая все сигнальные сообщения, очевидно, .bind() и готовые к указанному выше адресу ADDR:PORT, имея GUI или не имея заголовка, все зависит от вашего предпочтительного языка и потребностей монитора.


Как ?

Повторно использовать установку Уилла Гранта совет и ссылки, на которые он ссылается, или здесь .


Если есть никогда не работал с ZeroMQ ,
здесь вы можете впервые посмотреть на "ZeroMQ: Принципы менее чем за Пять секунд "
перед тем, как углубиться в подробности



...