Как стать автором
Обновить

Matlab кластер своими руками

Высокая производительность *Matlab *
Из песочницы

Информация в данной статье устарела



Вступление


Рано или поздно пользователь пакета Matlab/Simulink сталкивается с проблемой недостаточной производительности компьютера, на котором работает. Столкнулся и я.

Первое, что пришло на ум — это модернизация железа. Работаю я на стареньком ноутбуке, и поэтому начал подумывать о стационарном ПК. Но большого прироста производительности это не сулило, да и вообще это метод геймера но не инженера.

Подробности под катом >>

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

Итак:
  1. Новый компьютер.
    Как я и упоминал выше, для комфортной «научной» работы мне нужен был как раз «игровой» ПК, имеющий на борту много ядерный процессор и графический ускоритель с cuda capability не менее 1.3. Дорого и не масштабируемо. Я был уверен, что необузданную его мощь освою довольно быстро, и её снова будет мало.
  2. Оптимизация/минимизация/уточнение моделей и кода.
    Этот путь мною уже был пройден до того, как я уперся в потолок возможностей своего ноутбука. Метод полностью себя исчерпал, когда время моделирования ситуации стало больше времени стандартного кофе/чаепития. «Можно же запустить моделирование и пойти спать!», — скажут знающие, но для этого необходимо иметь уже оптимизированную модель и чёткое представление о том, как будет она себя вести. Мне же необходима была производительность именно на начальных стадиях разработки.
  3. Использование вычислительного кластера.
    Под рукой кластера не оказалось, а на такие как Уран нужно долго стучаться. Да и постановка задачи не очень то подходила для использования сторонних ресурсов. Я не был готов единожды запустить задачу и собрать результаты. До этого было ещё далеко.

В итоге было принято решение построить хоть и небольшой, зато с блэк-джеком свой кластер.

Поиск железа


Понадеявшись на преобладание добра в нашем мире, я обратился к коллегам и знакомым за помощью. В результате некоторые выступили добровольцами и предоставили свои ПК для моего эксперимента. Вариантов было несколько, но выбрать пришлось лишь две машины. Попытаюсь объяснить почему:
  • У каждого был процессор core i7 на борту. Четыре ядра давали по 2 виртуальных. Итого я имел возможность создать 16 виртуальных WORKERов на их основе, что довольно неплохо. Плюс ко всему памяти оперативной было в одном 6 а в другом 8 Gb.
  • Они находились в одной локальной сети, что было просто необходимо для минимизации затрат времени для передачи данных между виртуальными лабораториям. Для связи с этой сетью я поднял VPN канал, а для работы с каждым ПК настроил стандартный удалённый рабочий стол.

Минусы тоже присутствовали:
  • Оба ПК работали под Windows 7 x64, тогда как мой ноутбук был с x86 операционной системой. Одним из обязательных требований к кластеру Matlab есть однородная разрядность используемых операционных систем. В итоге я лишился возможности добавить к кластеру ещё два WORKERа на основе процессора моего ноутбука.
  • Сuda capability видеокарт были менее 1.3 и включить их в связку тоже не получилось.

Но так как плюсы все же перевесили, первый камень кластера на коленке был заложен.

Строим кластер


Требования к ПО

Требования к железу я выше осветил. Требования же к ПО следующие:
  1. Matlab на каждой машине.
    Не обойтись без платформы.
  2. Distributed Computing toolbox (DCT) на каждой машине.
  3. MATLAB Distributed Computing Engine (MDCE) на каждой машине.
    Оба тулбокса работают только совместно.
  4. Компилятор отличный от стандартного компилятора Matlab.
    На машинах с 64 битной операционной системой если мы собираемся использовать их в роли хоста для компиляции модели Simulink в C код. Matlab предлагает длинный список поддерживаемых компиляторов, некоторые из которых свободные. Я использовал Microsoft Visual C++ 2010.
  5. Simulink и другие расширения в зависимости от рода деятельности.

Запуск кластера

Для начала на каждой машине нужно установить и запустить MDCE как службу. Это можно сделать как не выходя из Matlab (использование знака "!" выполняет команду Matlab как системную), так и с помощью командной строки. *.bat файлы для этого находятся относительно установочной директории Matlab по пути \toolbox\distcomp\bin\.

Устанавливаем и запускаем MDCE на каждой машине:
cd('C:\Program Files\MATLAB\R2010b\toolbox\distcomp\bin\')
!mdce install
!mdce start

Запускаем планировщика, который будет управлять параллельными вычислениями:
!startjobmanager -name jm -v
Параметр -v отвечает за подробное отображение процесса запуска в командном окне Matlab. Планировщика можно запускать удалённо на любом ПК находящемся в нашем распоряжении.

Запускаем циклом так называемых рабочих (worker), которые будут параллельно выполнять поставленные им задачи:
clientHost = 'slovak';
node = {'slovak', 'puls'};
for i = 1:length(node)
for j = 1:8
str = ['!startworker -name w_' num2str(j) '_' node{i} ' -jobmanagerhost ' clientHost ' -jobmanager jm -remotehost ' node{i} ' -v'];
eval(str)
end
end

Хост 'slovak' это компьютер, на котором запущен планировщик. В моем случае это один из рабочих ПК. Пришлось переименовать, потому как предыдущее имя было на кириллице, которую Matlab не терпит.

Уже после создания рабочих лошадок мы можем полюбоваться на наш кластер:
!nodestatus -infolevel 3
Параметр -infolevel 3 для подробной информации о «нодах».
...
Job manager:
Name jm
Running on host Slovak
Number of workers 16
...

Управлять кластером можно и с помощью GUI. Для этого в папке с батниками есть файл admincenter.bat, который запускает утилиту администрирования. В нашем случае она выглядит вот так:

Во время написания статьи ПК puls «отвалился» и поэтому в админ центре только 8 рабочих.
Далее нам остаётся найти с помощью Matlab созданного планировщика:
jm = findResource('scheduler','type','jobmanager', ...
'LookupURL', 'slovak:27350', 'Name', 'jm');

После этого шага можно торжественно разрезать ленточку и с уверенностью считать, что наш кластер создан и готов к работе. Далее нужно правильно распределить работы между нодами, организовать доступ к общим ресурсам и многое другое. Так же хочу отметить, что на этом этапе мы можем запускать параллельные задачи только из Matlab. Для того, чтобы распараллелить модель Simulink мне пришлось ещё не раз плясать с бубном. В результате я изменил в корне концепцию всей своей работы специально для удобства параллельного решения, но это уже тема отдельного топика.

Информация по теме черпалась из следующих ресурсов:
  1. Сайт Matlab
  2. Блоги пользователей Matlab
  3. Русскоязычный форум пользователей Matlab
  4. Н.Н. Оленев, Р.В. Печенкин, А.М. Чернецов Параллельное программирование в MATLAB и его приложения М.: ВЦ РАН, 2007. 120 с.
  5. Метод научного тыка проб и ошибок

Благодарю за внимание!

PS: Вся проделанная работа велась с версией Matlab R2010b, но когда я лишь мельком заглянул в папку distcomp новой версии R2011а, то на первый взгляд работа командой mathworks была проведена не малая. К сожалению новой версией пока сам не располагаю, но как только появится возможность постараюсь осветить новшества, которые она нам может предложить. Хотя сейчас я больше занят генерацией Си кода из Simulink модели для микроконтроллеров.
Теги: matlabparallel programmingкластер на коленкеparallel computingDistributed Computing toolboxDistributed Computing Engine
Хабы: Высокая производительность Matlab
Всего голосов 31: ↑31 и ↓0 +31
Комментарии 14
Комментарии Комментарии 14

Похожие публикации

Лучшие публикации за сутки