Параллельные вычисления в 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
На 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
Настройка mdce закночена. Для более тонкой настройки mdce полезно познакомиться с cmdline help следующих утилит: mdce.bat, startjobmanager.bat, startworker.bat, nodestatus.bat.
- Шаг 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.
Public Matlab cloud
При общей популярности Cloud computing количество сервисов, предоставляющие вычислительные ресурсы Matlab, довольно ограничено. Наиболее известным является Red Cloud with MATLAB, организованный центром Advanced Computing в Cornell University. В качестве альтернативы можно упомянуть Amazon EC2 - High-CPU Instances. Тонкость с запуском Matlab в Amazon EC2 заключается в том, что схема лицензирования Matlab требует отдельной лицензии за каждый установленный экземпляр. Альтернативой является компилирование Matlab кода в C. Данный подход обсуждается тут и тут.