Параллельные вычисления в Matlab

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск

Фрей Александр (Обсуждение | вклад)
(Новая: Среда разработки Matlab предоставляет гибкую модель для организации распределенных вычислений и выч...)
К следующему изменению →

Версия 16:54, 14 октября 2012

Среда разработки Matlab предоставляет гибкую модель для организации распределенных вычислений и вычислений на GPU.

Оператор parfor

Оператор parfor очень удобен, когда хочется использовать все ядра локального компьютера. Пример — реализация алгоритма кросс-валидации, состоящего из N назависимых заданий на рассчёт.

matlabpool;
parfor qFold = 1:N
    #Any function could be executed inside parfor loop.
    results{qFold} = DoCrossValidationIteration(qFold);
 
    #The following output will be redirected to your console:
    fprintf('parfor loop: task %d completed.\n', qFold);  
end
matlabpool close;

Matlab накладывает некоторые ограничения на использование переменных в теле parfor цикла. Все переменные классифицируются на несколько типов (temporary, reduction, sliced input, sliced output, и другие), и к каждому типу применяются определенные ограничения (простой пример: запрещено модифицировать значение loop-переменной цикла).

Изображение:Parfor.png

На сайте matlab можно подробнее прочитать о классификации переменных в теле цикла parfor. Для простоты всегда можно сохранить результаты рассчёта в разные ячейки cell-array, и агрегировать результаты после завершения parfor цикла.

Тело parfor будет исполняться несколькими отдельными matlab.exe процессами. По умолчанию матлаб использует не более 4 процессов. Задать большее количество можно через меню: Parallel\Manage Configurations..., выбрать конфигурацию 'local' и её Properties, и установить желаемое значение в ClusterSize.

Настройка кластера

После установки в matlab настроена только конфигурация 'local', позволяющая производить вычисления на локальном компьютере. Для использования matlabpool и parfor на нескольких серверах необходимо настроить соответствующую конфигурацию. Рассмотрим пример с тремя серверами, с сетевыми именами 'master', 'workerhost1', 'workerhost2'.

  • Шаг 1. Установить матлаб на всех серверах.
  • Шаг 2. Настроить mdce:

На всех серверах: открыть cmd, перейти в [matlabroot]\toolbox\distcomp\bin, и выполнить:

mdce.bat install
mdce.bat start

Полезно познакомиться с cmdline help следующих утилит: mdce.bat, startjobmanager.bat, startworker.bat, nodestatus.bat.

На master сервере:

startjobmanager.bat -name myjobmanager
startworker.bat -name masterworkerNN -jobmanager myjobmanager; 
startworker.bat -remotehost workerhost1 -name host1workerNN -jobmanager myjobmanager; 
startworker.bat -remotehost workerhost2 -name host2workerNN -jobmanager myjobmanager;

Каждая startworker.bat команда запускает одного worker на одном сервере. Для каждого сервера, включая 'master', рекумендуется запустить сколько worker, сколько есть ядер на сервере. Имена worker должны быть уникальными.

Проверьте статус:

nodestatus.bat -remotehost workerhost2
  • Шаг 3. Настроить parallel configuration (только на master сервере):

Откройте [Matlab menu]\Parallel\Manage Configurations..., выберите File/New/jobmanager, и нажите 'OK' на запрос подтверждения. Далее выберите свойства созданного jobmanager, и укажите: - Configuration name в myparallelconfiguration. - Job manager hostname = master (сетевое имя компьютера) - Job manager name = myjobmanager Сохраните конфигурацию, и протестируйте её с помощью кнопки Start Validation.

  • Шаг 4. Положить свой matlab код в shared folder, доступный со всех машин. Matlab, к сожалению, не будет автоматически копировать все ресурсы между разными серверами. Но shared folder работает довольно удобно.
  • Шаг 5. На всех трёх серверах настроить пути matlab “\\master\<your shared code>”. Да, матлаб корректно работает с сетевыми путями!
  • Шаг 6. Запусить свой код:
jm = findResource('scheduler', 'configuration', 'myparallelconfiguration');
matlabpool(jm);
parfor qFold = 1:N
    results{qFold} = DoYourJobIteration(qFold);
 
    #Output will be redirected to your console even from remote machine
    fprintf('parfor loop: task %d completed.\n', qFold);  
end

Вычисления на GPU

Подробнее о поддержке GPU в Matlab можно прочитать тут. Алтернативным решением является использование коммерческой библиотеки Jacket, заявляющей о существенном приросте производительности по сравнению со встроенными средствами matlab.

Личные инструменты