Запустите пакетное задание и доступ к файлам от рабочих

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

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

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

prepareSupportingFiles;

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

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

Создайте кластерный объект с помощью parcluster. По умолчанию, parcluster использует ваш кластерный профиль по умолчанию. Проверяйте, что ваш кластерный профиль по умолчанию на вкладке MATLAB Home, в разделе Environment, параллельно> Выбирает 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, обратите внимание на ID задания.

job3ID = job(3).ID
job3ID = 25

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

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

В качестве альтернативы можно использовать Джоба Монитора, чтобы отследить задание. Можно открыть его от вкладки MATLAB Home, в разделе Environment, параллельно> Монитор Джобс.

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

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

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

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

delete(job)
clear job

Смотрите также

| | |