Можно разгрузить вычисления для выполнения в фоновом режиме с помощью batch. Если код требует доступа к файлам, можно использовать дополнительные параметры, такие как 'AttachedFiles' или 'AdditionalPaths', чтобы сделать данные доступными. Можно закрыть или продолжить работу в MATLAB, пока выполняются вычисления, и восстановить результаты позже.
Использовать вспомогательную функцию prepareSupportingFiles для копирования необходимых данных для этого примера в текущую рабочую папку.
prepareSupportingFiles;
Текущая рабочая папка теперь содержит 4 файла: A.dat, B1.dat, B2.dat, и B3.dat.
Создание объекта кластера с помощью parcluster. По умолчанию parcluster использует профиль кластера по умолчанию. Проверьте профиль кластера по умолчанию на вкладке Главная страница MATLAB (MATLAB Home) в разделе Среда (Environment) в разделе Параллельный (Parallel) > Выбрать кластер по умолчанию (Select a Default Cluster).
c = parcluster();
Поместите код в функцию и отправьте его как пакетное задание с помощью batch. Пример пользовательской функции см. в разделе вспомогательная функция. divideData. Укажите ожидаемое число выходных аргументов и массив ячеек с входами для функции.
Обратите внимание, что при отправке файла сценария с использованием пакета MATLAB переносит все переменные рабочей области в кластер, даже если сценарий не использует их. Большая рабочая область отрицательно влияет на время передачи данных. Рекомендуется преобразовать сценарий в файл функций, чтобы избежать таких накладных расходов на связь. Это можно сделать, просто добавив строку функции в начале сценария. Чтобы уменьшить накладные расходы в этом примере, divideData определяется в файле вне этого сценария.
Если код использует параллельный пул, используйте '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).
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 в разделе Среда в меню Параллельный (Parallel) > Контролировать задания (Monitor Jobs).
Для получения результатов пакетного задания используйте fetchOutputs функция. fetchOutputs возвращает массив ячеек с выходами функции, выполняемой с batch.
X = fetchOutputs(job(3))
X = 1×1 cell array
{40×207 double}
Если получены все требуемые выходные данные и объект задания больше не требуется, удалите его, чтобы очистить данные и избежать ненужного потребления ресурсов.
delete(job)
clear job