Параллельные вычисления в 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-переменной внутри цикла).

Изображение: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

На 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 не умеет автоматически копировать код и необходимые ресурсы между разными серверами.
  • Шаг 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

Подводные камни

  • Функция, созданная в новом файле после запуска matlabpool, не будет автоматически распознанна и при запуске приведет к следующей ошибке:
Error using parallel_function (line 598)
Undefined function '[your function name]' for input arguments of type 'struct'.
Error stack: ...

Woraround - закрыть matlabpool с помощью "matlabpool close", и открыть его заново. Дополнительная информация по этой проблеме есть тут.

Вычисления на 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. Данный подход обсуждается тут и тут.

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