Создание и использование Matlab кластеров
Цель статьи: хочу поделится опытом создания трех вычислительных кластеров Matlab, а также их удаленного администрирования.
Небольшое вступление
При исследовании/моделировании разных природных явлений (и не только), изредка появляется потребность в больших вычислительных способностях с которыми домашний ПК справится уже не в силе (каким бы мощным он небыл). В конце концов, эта потребность появились и у меня.
Моделирование, связанное с решением систем нелинейных дифференциальных уравнений на длинном промежутке относительного времени занимает достаточно много процессорного времени, поэтому было принято решение это все дело «расспаралелить».
Итак, обо всем — по порядку
Железо в наличии:
Дома: комп (Phenom II x4 840, 7×64) и ноут (Athlon II Dual-Core M320, 7×64) соединенные в одну сеть старым добрым маршрутизатором DIR-300.
Дома у девушки: комп (i5 4440, 7×64).
На работе: 10 компов (Athlon II Dual-Core, XPx86) (связанных в одну сеть) в одном помещении и 4 (Athlon II Dual-Core, XPx86) в другом (тоже связанных в одну сеть). Локальной сети между помещениями нет.
На всех вышеперечисленных ящиках присутствует доступ в интернет.
Приступаем к созданию 2х кластеров на работе.
В статье описан способ создания кластера, однако не указано на множество подводных камней при его создании, которые чуть бы не похоронили мою затею. (Хотя все было сделано по замечательной инструкции, за которою автору спасибо!)
Для начала хочется отметить, что прежде всего надо правильно установить Матлаб. Дело тут не в том, чтобы «не дышать при установке», или «правильно» выбрать компоненты, а в том, что есть 2 версии Матлаба. Одна Серверная, другая локальная. Так вот, если установить только одну из них — дела не будет.
В этой статье есть данные, которые помогут разобраться в вопросе с версиями, однако следует заметить, что в новой версии Матлаба R2013b, установщик работает немножко по другому чем описано на скринах в статье, поэтому для начала надо установить локальную версию с Parallel Computing Toolbox, а только потом, в другую папку, серверную версию с Distributed Computing Server, иначе будет выпадать ошибка при запуске Parallel Computing Toolbox:
Эта ошибка очень популярна на различных форумах, вот только как от нее избавится никто не говорит. Она возникает при запуске Parallel Computing Toolbox на серверной версии Матлаба (кнопка start parallel pool).
Поэтому, запускать параллельные/кластерные вычисления нужно с Mastera на локальной версии Матлаба.
Установить две версии Матлаба в одну папку, как рекомендуется в статье выше — установщик R2013b не позволил, и, как оказалось, правильно сделал!
После полной установки Матлабовского ПО, на Masterе должно присутствовать 2 папки. Первая — с локальной версией Матлаба, который цепляет все расширения матлабовских файлов и создает ярлыки, и вторая папка — с установленным Matlab Distributed Computing Server. (вторая папка автономна и может быть перенесена на все компьютеры локальной сети для экономии времени при развертывании кластера)
Компютер, на котором установлены 2 версии Матлаба будем считать Masterом, так как именно из него будет запускаться наша программа.
На остальные компьютеры данной локальной сети нужно установить только серверную версию Матлаб (или просто скопировать вторую папку с Masterа в любую директорию на остальных компах)
А уже из Admin Center можно и планировщик создать и воркеров раскинуть по компам. Но тут опять есть подводный камень. Чертов брандмауэр! Настоятельно рекомендую его отключить и намертво! Со всеми правилами входящих и исходящих соединений и со всеми исключениями. Только так я смог добиться того, чтобы Admin Center добавил все компьютеры данной локальной сети. Кстати, при добавлении компьютера в локальной сети, можно задавать его имя к примеру Siegurd-PC и не боятся черточки. По крайней мере в последней версии Матлаба это работает.
При добавлении компьютеров в Admin Center, нужно чтобы на каждом компьютере уже была запущена служба mdce и висела в процессах. Сам Матлаб при этом на каждом компьютере может быть закрыт, так как он никак не участвует в работе.
В Admin Center есть возможность запустить службу mdce удаленно, но у меня это сделать так и не удалось. Возможно виной всему недостаток прав администратора для доступа к папкам компютеров локальной сети, но это не столь важно и никак не влияет на поставленную задачу.
И да, при запуске mdce скорее всего будет такие сообщения:
Я их просто игнорирую, так как они не влияют на работоспособность кластера. В статье про правильную установку детально описан способ лечения этих ошибок, связанных с русскоязычностю оси.
Важно! При использовании Admin Center для создания воркеров, разработчики рекомендуют удостоверится, что открыт 7й порт в случае возникновения ошибок.
Создание планировщика
В Admin Center нажать на любому из добавленных компьютеров правой кнопкой мыши и в контекстном меню выбрать Start MJS, или и нажать на Start в самом окне Admin Center:
После создания планировщика, аналогично добавляем воркеров на каждый компьютер.
На этом с настройкой кластера в локальной сети все.
Запуск вычислений
Для запуска кластерных вычислений нужно запустить локальную версию Матлаба на Masterе и добавить планировщик. В главном окне Мталаба следует нажать на Diskover Clusters…
Потом выполнить поиск ранее созданного планировщика в локальной сети:
После его добавления, нужно выбрать в настройках параллельного профиля количество воркеров!
Заходим в Parallel Preferences и выбераем количество воркеров к которым следует подключатся.
Важно! Если выставленное количество воркеров в настройках будет меньше чем созданных в Admin Center, то вычисления будут проходить только на указанном числле воркеров. То есть, если Вы создали 20 вокеров, а в настройках стоит 4, то работать будут только 4 первых в списке Admin Center. Статус воркеров к которым вы подключились должен сменится с idle на busy.
В случае если выставленное число воркеров будет больше чем созданное — Матлаб сам подключится ко всем существующим воркерам без ошибок.
После проделанной работы можно смело запускать свой код, который будет сам распаралеливатся между всеми воркерами текущего планировщика (кластера). (Лично я использовал для этого цикл parfor, но есть и другие команды)
Эта схема задействована в 2 комнатах и Masterы администрируются удаленно через тимвювер из дому. К сожалению эти кластеры не связаны между собой, так как требуется именно полносвязная сеть (каждый с каждым), и я никак не смог настроить VPN между таким количеством компьютеров.
Создание домашнего кластера на VPN
Во многом развертывание кластера было схожим с предыдущими, однако использование VPN создавало несколько препятствий. Избавится от которых мне удалось лишь после длительных танцев с бубном.
Для объединения в одну сеть домашних компов и компа своей девушки был использован небезызвестный Хамачи. Теперешняя версия позволяет добавлять в сеть 5 машин бесплатно.
Как все правильно сделать:
На всех компах установить Хамачи. Создать виртуальную сеть на любом из них и подключится всем в эту сеть. Опять таки отключаем брандмауер будь он не ладен, запускаем службы и планировщик…
При добавлении компьютеров в Admin Center нужно добавлять их по IP адресам, а не по именам. Это важно! Компьютер-Master, на котором будут запущены вычисления с локальной версии Матлаба нужно добавить по имени.
В настройках Хамачи отключаем шифрование трафика, сжатие трафика, и фильтрацию трафика (устанавливаем значение: разрешить все). Только так мне удалось добиться того, чтобы все воркеры получили статус Connected! До этих действий воркеры создавались, но их статус был Failed to connect.
После того, как все воркеры получили статус Connected можно смело начинать вычисления по описанным выше инструкциям.
Примечание. Хамачи хорош, но нестабилен, особенно при экспериментах с сетевыми настройками, поэтому, если вдруг Вы не можете подключится к уделенному компьютеру — рекомендую перезагрузить оба (Master, и тот комп с которым нету связи) если не поможет — переустановите Хамачи.
Да, и еще одно. Служба mdce, будучи единожды установлена и запущена, будет сама включатся с включением компьютера до момента пока ее не остановить. Однако иногда, при изменении настроек сети и возникновении конфликтов, советую перезагрузить эту службу в качестве решения проблемы командами:
Итоги
Таким образом преодолевая все эти тонкости, таки были организованы 3 вычислительных кластера, которые, через тимвювер, удаленно администрируются из любого компьютера в любое время. Главное — не забыть отключить сон и автовыключение на всех компьютерах!
Еще раз хочу поблагодарить авторов 2х статей, которые использовались выше. Спасибо Вам!
Ведь без Ваших трудов, мене так и не удалось бы поднять эти кластеры!
Надеюсь, моя статья поможет людям, которые хотели создать вычислительный Matlab кластер, но споткнувшись о подводные камни так и не смогли этого осуществить.
PS: Если кто знает как создать полносвязную, бесплатную VPN на окнах — прошу осветить. Это поможет многим ученым в организации и проведении серьезных научных исследований.
MATLAB
MATLAB — среда и язык технических расчетов, предназначенный для решения широкого спектра инженерных, научных и математических задач любой сложности в различных отраслях науки и техники.
Доступные версии на суперкомпьютерном комплексе:
MATLAB на суперкомпьютере может быть использован в нескольких режимах:
Запуск MATLAB на суперкомпьютере в пакетном режиме
Ниже приведён пример matlab-скрипта, matlabexample.m, который создаёт вектор, используя простой for-цикл и записывает результат в бинарный файл result.dat, а также пример скрипт-файла matlab.sbatch.
Чтобы выполнить пробный запуск на суперкомпьютере создайте оба файла в одном каталоге и выполните команду sbatch matlab.sbatch
Входной файл для MATLAB (matlabexample.m):
Sbatch-скрипт для запуска в очереди (matlab.sbatch):
Для постановки задачи в очередь выполните команду sbatch matlab.sbatch
Не забудьте скорректировать параметры в скрипте для своих расчетов!
Посмотреть состояние своих задач можно с помощью команды mj
Результат запуска в файле figure.png :
Множество встроенных функций MATLAB поддерживают возможность ускорения расчёта путем разветвления его на несколько нитей. Это позволяет выполнять задачу на нескольких ядрах процессора без дополнительных модификаций кода. Встроенная многопоточность доступна, преимущественно, для операций линейной алгебры и быстрых преобразований Фурье (полный список функий с многопоточностью доступен на сайте MATLAB).
Запуск MATLAB на суперкомпьютере в интерактивном режиме
Для выполнения расчётов в интерактивном режиме необходимо выделить узел с указанием необходимого количества CPU/GPU и запустить консоль bash. Для этого, выделите ресурсы на суперкомпьютере с помощью следующей команды:
Зарос на выделение ресурсов встанет в очередь. Как только подходящий узел освободится, в консоли появится уведомление srun: job has been allocated resources. Hostname в строке приглашения консоли изменится на имя узла суперкомпьютера.
После этого, загрузите модуль matlab:
module load matlab/r2020a
Запустите консоль MATLAB в интерактивном режиме:
В этом режиме вы можете выполнять команды MATLAB, загружать и редактировать скрипт-файлы, но не можете отображать графики (их можно сохранять в файл, скачивать и просматривать на локальном компьютере). Несмотря на минималистичность, в данной консоли поддерживается завершение команд с помощью клавиши TAB и доступна встроенная справка по командам help название_команды.
Пример вычисления в интерактивном режиме:
На экран будет выведена сумма матриц A и B, а в файл out.mat будут записаны переменные AB и sumAB.
Параллельные расчёты с использованием Parallel Computing Toolbox
Параллельные циклы FOR (parfor)
Содержимое файла pfor.m
Содержимое файла pfor.sbatch
Содержимое файла pfor-00000.out
Любые ошибки при выполнении расчёта будут записаны в файл pfor-%j.err
Одна программа множество данных (SPMD)
Содержимое файла spmd_test.m
Содержимое файла spmd.sbatch
Содержимое файла spmd_test-00000.out
Любые ошибки при выполнении расчёта будут записаны в файл pfor-%j.err
Параллельные расчёты с использованием Parallel Server из интерфейса MATLAB
Parallel Server позволяет запускать параллельные расчёты на нескольких узлах суперкомпьютера. В настоящий момент, лицензия НИУ ВШЭ позволяет запускать до 32 процессов MATLAB. Используя комбинацию Parallel Computing Toolbox и Parallel Server можно взаимодействовать с очередью задач суперкомпьютера со своего рабочего ПК, на котором установлен пакет MATLAB. Подключение к Parallel Server с ПК вне сети ВШЭ возможно только при использовании корпоративного VPN.
Для начала работы с Parallel Server необходимо создать новый профиль кластера, настроить его для работы с очередью задач суперкомпьютера и указать скрипт-файлы для работы с очередью задач Slurm.
Создание профиля кластера
Выполнение расчётов на суперкомпьютере
Запуск задачи, которая взаимодействует с другими файлами
Расчёты с использованием GPU-ускорителей
Содержимое файла gpu_matlab.sbatch:
Содержимое файла gpu_matlab-00000.out:
Любые ошибки при выполнении расчёта будут записаны в файл gpu_matlab-%j.err
Дополнительные ресурсы по выполнению параллельных расчетов в MATLAB
Параллельный Matlab
В ИММ имеются все 3 основных продукта для параллельных вычислений с Matlab на кластере «Уран» (версия Matlab R2011b и старше):
1) Matlab: 10 лицензий,
2) Parallel Computing Toolbox: 10 лицензий
(прежнее название Distributed Computing Toolbox),
3) Matlab Distributed Computing Server: 1000 лицензий
(прежнее название Matlab Distributed Computing Engine);
а также большое количество специализированных Toolbox-ов: по 10 лицензий на SIMULINK, Signal_Blocks, Image_Acquisition_Toolbox, Image_Toolbox, MAP_Toolbox, Neural_Network_Toolbox, Optimization_Toolbox, PDE_Toolbox, Signal_Toolbox, Statistics_Toolbox, Wavelet_Toolbox и 2 лицензии на Filter_Design_Toolbox.
Список всех установленных на кластере продуктов Matlab и количество доступных лицензий на них можно уточнить командой
Название текущей рабочей версии Matlab можно узнать, набрав, например, в командной строке
Использование русских букв в Linux версии Matlab
Для работы с русскими буквами в Matlab’е необходимо правильно настроить кодировку файла с программой, и, при необходимости, настроить ввод русских букв в клиентской программе.
Возможны два варианта настройки кодировки файла с программой:
Вариант 1
На кластере «Уран» при запуске Matlab’а можно включить Windows-кодировку CP1251. Для этого необходимо запускать Matlab в окне терминала следующей командой:
После этого можно нормально работать с файлами, подготовленными в Windows.
Внимание. Данный вариант может не сработать при запуске счётной задачи на узлах кластера.
Как минимум, в начало счетной программы надо вставить команду:
Вариант 2
После передачи файла из Windows на кластер можно перекодировать его в кодировку UTF-8. Следует помнить, что перекодированный файл будет некорректно отображаться в Windows, зато он без проблем будет обрабатываться на кластере.
2.a Перекодирование файла на кластере в командной строке. Файл перекодируется с помощью команды
Если есть необходимость перекодировать файлы, полученные с кластера, то это также можно сделать с помощью KWrite. При открытии файла надо выбрать кодировку UTF-8, а потом сохранить файл в кодировке cp1251.
В командной строке перекодирование из Linux в Windows выглядит так:
Примечание для администраторов
В дистрибутиве RHEL и его производных (CentOS, Scientific Linux) отсутствует файл локализации ru_RU.CP1251. Поэтому «Вариант 1» не сработает (Matlab не запустится с сообщением о невозможности установить указанный язык).
Для генерации файла с кодировкой администратор должен выполнить в Linux’е команду:
/.bashrc ) необходимо вставить следующую строку:
2) в настройках сессии программы PuTTY, в разделе Translation, установить кодировку ISO-8859-5:1999 (Latin/Cyrillic) и сохранить эту сессию для работы с системой Matlab в дальнейшем.
Запуск параллельной программы
Основные сведения
Программа пользователя должна быть оформлена как функция (не скрипт) и находиться в начале запускаемого файла, т.е. предшествовать возможным другим вспомогательным функциям. Имя файла должно совпадать с именем первой (основной) функции в файле. Одноименная с файлом функция, не являющаяся первой, никогда не будет выполнена, так как независимо от имени всегда выполняется первая функция файла. Файл должен иметь расширение » m » (Пример параллельной программы).
Для выполнения программы пользователя всегда вызывается программа MatLab.
Если ресурсов кластера достаточно, то на каждом участвующем в вычислении процессоре (ядре для многоядерных процессоров) начинает выполняться копия программы-функции пользователя при условии наличия достаточного числа лицензий (в настоящее время система запуска не контролирует число лицензий, доступность лицензий определяется в начале счета).
Пользователь может контролировать прохождение своей программы через систему запуска как в окне системы Matlab, например, с помощью Job Monitor (см. п. Доступ к объекту Job ), так и из командной строки с помощью команд системы запуска (запросить информацию об очереди, удалить стоящую в очереди или уже выполняющуюся программу).
Действия пользователя
Войти на кластер (с помощью PuTTY или MobaXterm) и запустить программу-функцию из командной строки или в окне системы Matlab, указав необходимое для счета число параллельных процессов и максимальное время выполнения в минутах.
В ответ пользователь должен получить сообщение вида:
Запуск параллельной программы из командной строки
Команда запуска mlrun имеет вид
Запуск параллельной программы в окне Matlab
Так, для примера выше запуск в окне Matlab будет иметь вид:
Доступ к объекту Job, состояние работы
Все работы хранятся на кластере. При необходимости доступа к работе, на которую в текущий момент отсутствует ссылка, можно (1) в окне Job Monitor правой кнопкой мыши выделить нужную работу и выбрать соответствующую опцию в контекстном меню или (2) по идентификатору ( ID ) определить ссылку на работу (обозначенную ниже job ), используя, например, команды:
Состояние работы ( State ) можно:
(1) увидеть в окне Job Monitor или
(2) выдать в окне Command Window, набрав
job.State
Основные значения состояния работы следующие:
pending (ждет постановки в очередь)
queued (стоит в очереди)
running (выполняется)
finished (закончилась)
Примечание.
Вышеприведенные команды предназначены для версий MatLab с профилем кластера, т.е. начиная с R2012a. В ранних версиях (с конфигурацией кластера) следует набирать:
При этом в поле DataLocation структуры s должен быть текущий каталог (тот, в котором ищем работу). Если каталог другой, то можно выполнить
и повторить предыдущие команды.
Вывод результатов
В окне Matlab (с R2012a) для работы job и любой ее задачи ( Task ) с номером n=1,2. можно выдать (далее для удобства n=1)
1) протокол сеанса:
Рекомендации
1. Начать работу на кластере рекомендуется с запуска своей последовательной программы в тестовом однопроцессном варианте, например,
где my_function – функция без параметров, максимальное время счета 20 минут.
2. После преобразования последовательной программы в параллельную её работоспособность можно проверить, выполняя шаги, приведенные в пункте Как убедиться в работоспособности программы при рассмотрении примеров с распределенными массивами.
Пример запуска программы
Для запуска из командной строки войти на umt через PuTTY и выполнить команду
Для запуска из окна Matlab войти на umt из MobаXterm, вызвать Matlab командой
и в открывшемся окне набрать
где job – ссылка на сформированную работу.
Можно работать в системе Matlab, войдя на umt через PuTTY и запустив её в интерактивном текстовом режиме командой
В ответ на приглашение ( >> ) следует соответственно набрать
После выполнения mlrun или imm_sch выдается строка вида
Если ресурсов кластера достаточно, задача войдет в решение (см. Запуск задач на кластере). Иначе для ускорения запуска на кластере небольших (отладочных) задач можно вместо выделенного задаче раздела назначить debug командой вида:
где 8043078 — уникальный идентификатор (JOBID) задачи.
Результаты выдаем с помощью команд:
со всех процессов
а для выдачи матрицы, полученной 1-ым процессом (т.е. Task1 )
Для выдачи результатов ранее посчитанной работы, на которую в текущий момент нет ссылки, следует обеспечить к ней доступ, например используя Job Monitor.
Запуск частично параллельной программы (c parfor или spmd)
Введение
Использование параллельного цикла parfor или параллельного блока spmd предполагает предварительное открытие Matlab пула, т.е. выделение необходимого числа процессов (Matlab workers или labs), на локальной машине или на кластере.
Запуск частично параллельных программ с открытием Matlab пула на кластере можно выполнять
(1) по аналогии с запуском параллельных программ из командной строки или в окне системы Matlab (запуск с неявным заданием пула) или
(2) на основе профиля кластера (с версии R2012a, ранее параллельной конфигурации) при работе в окне системы Matlab (запуск с явным заданием пула).
Пользователь может контролировать прохождение своей программы через систему запуска как в окне системы Matlab (с версии R2011b) с помощью Job Monitor (см. пункт меню Parallel), так и из командной строки с помощью команд системы запуска.
1. Запуск частично параллельной программы с неявным заданием пула
для функции, определенной как
и запущенной на 12 процессах с максимальным временем счета 20 минут.
При этом один процесс будет выполнять программу-функцию, а оставшиеся будут использованы в качестве пула.
В результате запуска программа ставится в очередь на счет и, если ресурсов кластера достаточно, входит в решение.
Вывод результатов осуществляется так же, как и в случае параллельных программ.
2. Запуск частично параллельной программы с явным заданием пула
на основе профиля кластера
Явное задание пула возможно при работе в окне Matlab с помощью команды matlabpool (см. help matlabpool ). Число выделенных процессов и время, в течение которого они будут доступны пользователю, зависят от заданного профиля кластера (см. пункт меню Help/Parallel Computing Toolbox/Cluster Profiles).
Команда
без параметров открывает пул, используя профиль по умолчанию с указанным в нем размером пула. В ИММ УрО РАН по умолчанию Matlab пул открывается на узлах кластера (тип кластера Generic), поскольку управляющий компьютер, выступающий в роли локальной машины (Matlab client), не должен использоваться для длительных вычислений.
Пользователь может выбрать профиль по умолчанию из уже существующих профилей или создать новый, используя пункт меню Parallel окна Matlab.
Команда matlabpool с указанием размера пула, например
открывает пул, переопределяя размер, заданный по умолчанию. При этом следует иметь в виду, что существует ограничение на максимальное число доступных пользователю процессов на кластере.
В результате открытия пула сформированная для кластера работа с именем вида JobN (где N=1,2. ) поступает в распоряжение системы запуска и ставится в очередь на счет. Если свободных процессов достаточно, то пул будет открыт на время, заданное в профиле по умолчанию, с выдачей сообщения вида:
Размер пула можно узнать, набрав
По завершении вычислений, связанных с пулом, его следует закрыть
Внимание. Пул закрывается по истечении времени с диагностикой вида:
Запуск частично параллельной программы на Matlab клиенте
(не разрешается для длительных вычислений)
Итак, схема использования параллельных конструкций parfor и spmd в окне Matlab такова:
При этом все вычисления, кроме параллельных, выполняет Matlab client (см., например, Introduction to Parallel Solutions/Interactively Run a Loop in Parallel.)
Для запуска на кластере частично параллельной программы можно использовать команду batch с открытием пула. При этом выделяемое на кластере число процессов будет на 1 больше заданного размера пула.
Так, например, для выполнения команды
По завершении работы job можно выдать
1) протокол сеанса
2) результаты работы
( fetchOutputs вместо getAllOutputArguments в ранних версиях, использовавших конфигурацию кластера, а не профиль)
3) информацию об ошибках (поле ErrorMessage )
Запуск программ с использованием GPU
Программа с использованием GPU в результате запуска ставится в очередь на счет в системе SLURM. Пользователь может контролировать прохождение своей программы через эту систему с помощью соответствующих команд или в окне системы Matlab (с версии R2011b) с помощью Job Monitor (см. пункт меню Parallel).
При запуске программы-функции, как обычно, указывается необходимое для счета число параллельных процессов и максимальное время выполнения в минутах, но используются другие команды.
При наличии параметров у функции они указываются по тем же правилам, что и в случае параллельной программы.
Возможные ошибки
2) ErrorMessage содержит ошибки трансляции, например:
Имя или расширение файла, имя функции или переменной отсутствует или указано неверно. Имя может отсутствовать по причине случайного запуска из другого каталога.
В именах файлов и функций не должно быть минуса («-«), только подчерк («_»).
Возможно, имя файла задано русскими буквами.
Внимание. В случае таких ошибок в файле my_function.1/errors обычно содержится строка
Помните: имя файла должно совпадать с именем первой функции в файле, так как
(1) при запуске программы ищется файл с именем, указанным в команде запуска, и
(2) в нем выполняется, прежде всего, первая функция.
Если они не совпадают и при запуске указано имя функции (например, my_function ), то файл не будет найден и будет выдана ошибка вида:
Если они не совпадают и при запуске указано имя файла (например, my_code ), то выполнится первая функция файла независимо от ее имени. При этом наличие одноименной с файлом функции, не являющейся первой, приведет к выдаче в протоколе сеанса предупреждения вида:
4) В случае аварийного завершения работы программы в домашнем каталоге пользователя (
) могут оставаться файлы вида mpd.hosts.123456 и mpd.mf …
Их следует периодически удалять вручную.
Завершение работы
Если эти действия не выполняются пользователем регулярно, то при очередных запусках будут создаваться и накапливаться файлы новых работ Job2, Job3 и т.д.
Вызов job_destroy без параметра
из командной строки:
в окне:
уничтожает только завершившиеся работы.
Вызов job_destroy с параметром (тип и значение параметра не существенны)
из командной строки:
в окне:
Пример параллельной программы
Пример взят с сайта MathWorks и иллюстрирует основные (базовые) принципы программирования параллельной программы-функции.
Существуют альтернативные методы получения данных копиями функций, например, создание матрицы в каждой копии или чтение каждой копией своей части данных из файла на диске и т.д.
В прикрепленном файле ml_session.PNG (см. ниже) демонстрируется запуск функции colsum в окне системы Matlab с использованием 4-х вычислительных процессов и максимальным временем счета 1 минута.
выдается сообщение вида:
Примеры с распределенными массивами
Введение
Распределение данных по процессам предназначено для ускорения счета и экономии памяти.
Параллельные вычисления с использованием распределенных массивов подробно описаны на сайте Matlab, в частности, в подразделе Working with Codistributed Arrays.
Возможен доступ к любому сегменту распределенного массива.
Доступ к локальному сегменту будет быстрее, чем к удаленному, поскольку последний требует посылки (функция labSend ) и получения (функция labReceive ) данных между процессами.
Содержимое распределенного массива можно собрать с помощью функции gather в один локальный массив, продублировав его на всех процессах или разместив только на одном процессе.
Использование распределенных массивов при параллельных вычислениях сокращает время счета благодаря тому, что каждый процесс обрабатывает свою локальную порцию исходного массива (сегмент распределенного массива).
1) Деление массива на части может быть реализовано с помощью функции codistributed (Пример 1). При этом в рабочей области каждого процесса расположены исходный массив в своем полном объеме и соответствующий сегмент распределенного массива. Таким образом, этот способ хорош при наличии достаточного места в памяти для хранения тиражируемого ( replicated ) исходного массива.
Размерности исходного и распределенного массивов совпадают.
Деление массива может быть произведено по любому из его измерений.
По умолчанию в случае двумерного массива проводится горизонтальное разбиение, т.е. по столбцам, что выглядит естественно с учетом принятого в системе Matlab размещения матриц в памяти по столбцам (как в Фортране).
2) При построении распределенного массива из локальных частей в качестве сегмента распределенного массива берется массив, хранящийся в рабочей области каждого процесса (Пример 2). Таким образом, распределенный массив рассматривается как объединение локальных массивов. Требования к памяти в этом случае сокращаются.
Вверх
Как можно использовать распределенные массивы
Даются возможные схемы решения таких задач с использованием распределенных массивов. Показан переход от исходной последовательной программы к параллельной с распределенными вычислениями. Соответствующие изменения выделены.
Замечание.
Хотя дистрибутивные массивы совместимы (в отличие от цикла parfor и GPU) с глобальными переменными, необходимо тщательно следить за тем, чтобы изменения глобальных переменных в процессе обработки одной порции данных не влияли на результаты обработки других порций, тем самым обеспечивая независимость вычислений частей дистрибутивных массивов.
Там, где допустимо, проще использовать цикл parfor или вычисления на GPU.
Вверх
Пример 1. Деление массива на части
Пусть требуется вычислить значения некоторой функции 10 вещественных переменных. Аргументом функции является 10-мерный вектор.
Значение функции необходимо вычислить для n точек (значений аргумента), заданных 10хn матрицей. Вычисление матрицы производится по некоторому заданному алгоритму и не требует много времени.
Пример 2. Построение массива из частей.
Распределенный массив как объединение локальных массивов
Замечание. Эту задачу, если памяти достаточно, можно запрограммировать и первым способом, т.е. путем деления большого массива на части. В этом случае распределение данных по процессам будет сделано автоматически (требование кратности исчезает).
Вверх
Как убедиться в работоспособности программы
Перед первым запуском программы-функции на кластере ее стоит проверить сначала в однопроцессорном варианте с отладчиком Debug (см.,например, Debug a MATLAB Program), а затем в параллельном режиме pmode. Поскольку политика использования вычислительных ресурсов ИММ УрО РАН не предполагает длительных вычислений на управляющем компьютере, запускать программу в режимах Debug и pmode следует с тестовым набором данных.
Итак, рекомендуется следующая последовательность выхода на счет:
Debug
pmode
кластер
Запуск параллельной программы с отладчиком Debug (в однопроцессорном режиме) можно осуществить, например, предварительно открыв текст программы в редакторе (Editor), установив необходимые контрольные точки (щелкая, к примеру, левой клавишей мыши справа от номера нужной строки) и нажав клавишу F5 (см. пункт меню Debug).
Стартовать режим pmode на 4-х процессах (для наглядности) можно в окне Matlab (Command Window) с помощью команды
Затем в командной строке открывшегося параллельного окна (Parallel Command Window) вызвать свою программу.
Закрыть параллельный режим можно или из Parallel Command Window командой
или из окна Matlab командой
Использование параллельного профилирования
Основные понятия
Профилирование предназначено для выявления наиболее затратных по времени мест в программе с целью увеличения ее быстродействия (см. Profile to Improve Performance).
Профилирование параллельных программ определяет как затраты на вычисление функций, так и затраты на коммуникации (см. Profiling Parallel Code).
Профилирование в Matlab осуществляется с помощью инструмента, называемого профилировщик или профайлер (profiler).
Результатом профилирования являются суммарный и детальный отчеты о выполнении программы.
Суммарный отчет о профилировании параллельной программы содержит для каждого параллельного процесса ( lab ) информацию о времени вычисления функций и частоте их использования, а также о времени, затраченном на обмены (коммуникации) и ожидание обменов с другими процессами.
Для проблемных функций полезно выдавать детальный отчет, в котором содержится статистика по строкам функций, а именно: время выполнения и частота использования.
Код программы можно считать достаточно оптимизированным, если в результате изменения алгоритма большая часть времени выполнения программы будет приходиться на обращения к нескольким встроенным функциям.
Вверх
Действия пользователя
Внесение изменений в текст программы
1) В заголовок функции добавить выходной параметр для информации о профилировании, назовем его p :
для включения профилирования (начала сбора данных)
для выключения профилирования при необходимости (или желании)
Запуск программы на профилирование
1) При запуске функции указать увеличенное соответственно на 1 число выходных параметров.
2) Запустить программу-функцию из командной строки:
или в окне Matlab:
Просмотр результатов профилирования
Пусть программа запущена в окне Matlab. Тогда по окончании счета следует
1) получить результаты:
2) выделить вектор с информацией о профилировании:
Для повторного использования полученные переменные можно сохранить командой:
(в файле res_prof.mat ) и загрузить при необходимости в другом сеансе:
Вверх
Некоторые советы
Первая реализация программы должна быть настолько проста, насколько возможно, т.е. не рекомендуется ранняя оптимизация.
Профилирование может быть использовано
— в качестве инструмента отладки;
— для изучения (понимания) незнакомых файлов.
При отладке программы детальный отчет даст представление о том, какие строки выполнялись, а какие нет. Эта информация может помочь в расширении набора тестов.
Для очень длинного файла с незнакомым матлабовским кодом можно использовать профайлер, чтобы посмотреть, как файл в реальности работает, т.е. посмотреть вызываемые строки в детальном отчете.
При использовании профилирования копию 1-го детального отчета рекомендуется сохранить в качестве основы для сравнения с последующими, полученными в ходе улучшения программы.
Замечание. Существуют неизбежные отклонения времени, не зависящие от кода, т.е. при профилировании идентичного кода дважды можно получить слегка различные результаты.
О реализации работы системы Matlab на кластере
Запуск параллельной программы пользователя на кластере организован в соответствии с рекомендациями разработчиков Matlab в разделах
Programming Distributed Jobs и
Programming Parallel Jobs
с учетом используемого в ИММ планировщика (типа Generic Scheduler в терминологии Matlab).
Замечание. Ссылки на сайт разработчика Matlab даны на момент подключения системы Matlab (
Для осуществления такого запуска необходимо:
Используем предлагаемую на сайте Matlab схему запуска программы пользователя на кластере для демонстрации получаемой у нас цепочки вызовов (для определенности на um64 в системе пакетной обработки заданий СУППЗ, 2009 г.).
Список наших служебных функций и скриптов приведен в таблице:





.png)
.jpg)



