Параллельные вычисления в Matlab
Материал из MachineLearning.
Среда разработки 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-переменной цикла).
На сайте 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.