Можно разгрузить расчеты, чтобы запустить их в фоновом режиме при помощи 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