Запуск пакетного задания и доступ к файлам от работников

Можно разгрузить расчеты, чтобы запустить их в фоновом режиме при помощи batch. Если вашему коду нужен доступ к файлам, можно использовать дополнительные опции, такие как 'AttachedFiles' или 'AdditionalPaths', для обеспечения доступности данных. Можно закрыть или продолжить работу в MATLAB, пока выполняются расчеты, и восстановить результаты позже.

Пример подготовки

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

prepareSupportingFiles;

Текущая рабочая папка теперь содержит 4 файла: A.dat, B1.dat, B2.dat, и B3.dat.

Запуск пакетного задания

Создайте объект кластера с помощью parcluster. По умолчанию parcluster использует профиль кластера по умолчанию. Проверьте профиль кластера по умолчанию на вкладке MATLAB Home, в разделе Environment, в Parallel > Select a Default Cluster.

c = parcluster();

Поместите код в функцию и отправьте его как пакетное задание при помощи batch. Пример пользовательской функции см. в вспомогательной функции divideData. Задайте ожидаемое количество выходных аргументов и массив ячеек с входами в функцию.

Обратите внимание, что если вы отправляете файл скрипта с помощью пакета, MATLAB переносит все переменные рабочей области в кластер, даже если ваш скрипт их не использует. Если у вас есть большая рабочая область, это негативно влияет на время передачи данных. Как лучшая практика, преобразуйте ваш скрипт в файл функции, чтобы избежать этих накладных расходов на коммуникацию. Вы можете сделать это, просто добавив линию функции в начале вашего скрипта. Чтобы уменьшить накладные расходы в этом примере, divideData определяется в файле вне этого live скрипта.

Если ваш код использует параллельный пул, используйте 'Pool' аргумент пары "имя-значение" для создания параллельного пула с указанным количеством рабочих процессов. batch использует дополнительный рабочий процесс, чтобы запустить саму функцию.

По умолчанию batch изменяет исходную рабочую папку рабочих процессов на текущую папку клиента MATLAB. Может быть полезно управлять исходной рабочей папкой в работниках. Например, можно хотеть управлять им, если кластер использует другую файловую систему, и поэтому пути отличаются, например, когда вы отправляете с клиентского компьютера Windows в кластер Linux.

  • Чтобы сохранить исходную рабочую папку работников и использовать их по умолчанию, установите 'CurrentFolder' на '.'.

  • Чтобы изменить исходную рабочую папку, установите 'CurrentFolder' в выбранную папку.

Этот пример использует параллельный пул с тремя работниками и выбирает временное расположение для исходной рабочей папки. Использование batch для разгрузки расчетов в divideData.

job = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir);

batch выполняет divideData для параллельного рабочего процесса, поэтому можно продолжить работу в MATLAB во время расчетов.

Если вы хотите заблокировать MATLAB до завершения задания, используйте wait функция на объекте задания.

wait(job);

Чтобы получить результаты, используйте fetchOutputs на объекте задания. Как divideData зависит от файла, который рабочие не могут найти, fetchOutputs выдает ошибку. Вы можете получить доступ к информации об ошибке при помощи getReport на Error свойство Task объекты в задании. В этом примере код зависит от файла, который рабочие не могут найти.

getReport(job.Tasks(1).Error)
ans = 
    'Error using divideData (line 4)
     Unable to read file 'B2.dat'. No such file or directory.'

Доступ к файлам от работников

По умолчанию batch автоматически анализирует ваш код и передает необходимые файлы работникам. В некоторых случаях необходимо явным образом перенести эти файлы - например, когда вы определяете имя файла во время выполнения.

В этом примере divideData обращается к вспомогательному файлу A.dat, что batch автоматически обнаруживает и передает. Функция также обращается к B1.dat, но он разрешает имя файла во время выполнения, поэтому автоматический анализ зависимостей не обнаруживает его.

type divideData.m 
function X = divideData()
    A = load("A.dat"); 
    X = zeros(flip(size(A)));
    parfor i = 1:3
        B = load("B" + i + ".dat");
        X = X + A\B;
    end
end

Если данные находятся в месте, к которому могут получить доступ работники, можно использовать аргумент пары "имя-значение" 'AdditionalPaths' для определения местоположения. 'AdditionalPaths'добавляет этот путь к пути поиска файлов MATLAB работников и делает данные видимыми для них.

pathToData = pwd;
job(2) = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir, ...
    'AdditionalPaths',pathToData);
wait(job(2));

Если данные находятся в месте, к которому работники не могут получить доступ, можно передать файлы работникам с помощью 'AttachedFiles' аргумент пары "имя-значение". Вам нужно передать файлы, если клиент и работники не используют одну и ту же файловую систему, или если ваш кластер использует общий интерфейс планировщика в несредневом режиме. Для получения дополнительной информации смотрите Настройка использования интерфейса типового планировщика (MATLAB Parallel Server).

filenames = "B" + string(1:3) + ".dat";
job(3) = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir, ...
    'AttachedFiles',filenames);

Поиск существующего задания

Можно закрыть MATLAB после отправки задания и получить результаты позже. Прежде чем закрыть MATLAB, запишите идентификатор задания.

job3ID = job(3).ID
job3ID = 25

Когда вы снова открываете MATLAB, можно найти задание, используя findJob функция.

job(3) = findJob(c,'ID',job3ID);
wait(job(3));

Также можно использовать монитор заданий для отслеживания своего задания. Его можно открыть на вкладке MATLAB Home, в разделе Environment, в Parallel > Monitor Jobs.

Получение результатов и очистка данных

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

X = fetchOutputs(job(3))
X = 1×1 cell array
    {40×207 double}

Когда вы получили все необходимые выходы и больше не нуждаетесь в объекте задания, удалите его, чтобы очистить его данные и избежать ненужного потребления ресурсов.

delete(job)
clear job

См. также

| | |