В этом примере показано, как разработать параллельный код MATLAB ® на локальной машине и масштабироваться до кластера. Кластеры обеспечивают больше вычислительных ресурсов, чтобы ускорить и распределить ваши расчеты. Можно запускать код в интерактивном режиме параллельно на локальной машине, затем в кластере, не меняя код. После завершения прототипирования кода на локальном компьютере можно выгрузить расчеты в кластер с помощью пакетных заданий. Таким образом, можно закрыть MATLAB и получить результаты позже .
Начните с прототипа алгоритма на локальной машине. Пример использует целочисленную факторизацию как задачу сэмплирования. Это вычислительно сложная задача, где сложность факторизации увеличивается с величиной числа. Вы используете простой алгоритм, чтобы факторизировать последовательность целочисленных чисел.
Создайте вектор простых чисел с 64-битной точностью и умножите пары простых чисел случайным образом, чтобы получить большие составные числа. Создайте массив, чтобы хранить результаты каждой факторизации. Код в каждом из следующих разделов этого примера может занять более 20 мин. Чтобы сделать его быстрее, уменьшите рабочую нагрузку, используя меньше простых чисел, таких как 2^19
. Прокрутка с 2^21
чтобы увидеть оптимальные конечные графики.
primeNumbers = primes(uint64(2^21)); compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers))); factors = zeros(numel(primeNumbers),2);
Используйте цикл, чтобы увеличить каждое составное число и измерить время, которое занимает расчет.
tic; for idx = 1:numel(compositeNumbers) factors(idx,:) = factor(compositeNumbers(idx)); end toc
Elapsed time is 684.464556 seconds.
Parallel Computing Toolbox™ позволяет масштабировать рабочий процесс, работая с несколькими работниками в параллельном пуле. Итерации в предыдущей for
цикл является независимым, и поэтому вы можете использовать parfor
цикл, чтобы распределить итерации нескольким работникам. Просто преобразуйте for
цикл в parfor
цикл. Затем запустите код и измерьте общее время расчета. Код запускается в параллельном пуле без дальнейших изменений, и работники отправляют ваши расчеты обратно в локальную рабочую область. Поскольку рабочая нагрузка распределена между несколькими работниками, время расчета меньше.
tic; parfor idx = 1:numel(compositeNumbers) factors(idx,:) = factor(compositeNumbers(idx)); end toc
Elapsed time is 144.550358 seconds.
Когда вы используете parfor
и у вас есть Parallel Computing Toolbox, MATLAB автоматически запускает параллельный пул работников. Для запуска параллельного пула требуется некоторое время. В этом примере показан второй запуск с уже запущенным пулом.
Профиль кластера по умолчанию 'local'
. Можно проверить, что этот профиль установлен по умолчанию на вкладке MATLAB Home, в Parallel > Select a Кластер. Когда этот профиль включен, MATLAB создает рабочие места на вашем компьютере для параллельного пула. Когда вы используете 'local'
профиль, MATLAB, по умолчанию, запускает столько рабочих, сколько физических ядер в вашей машине, до вашего предпочтительного количества рабочих. Можно управлять параллельным поведением, используя параллельные настройки. На вкладке MATLAB Home выберите Parallel > Parallel Preferences.
Чтобы измерить скорость с количеством работников, запустите один и тот же код несколько раз, ограничив максимальное количество работников. Сначала определите количество работников для каждого запуска, до количества работников в пуле, и создайте массив для хранения результатов каждого теста.
numWorkers = [1 2 4 6]; tLocal = zeros(size(numWorkers));
Используйте цикл, чтобы выполнить итерацию максимального количества рабочих процессов и запустить предыдущий код. Чтобы ограничить количество работников, используйте второй входной параметр parfor
.
for w = 1:numel(numWorkers) tic; parfor (idx = 1:numel(compositeNumbers), numWorkers(w)) factors(idx,:) = factor(compositeNumbers(idx)); end tLocal(w) = toc; end
Вычислите скорость путем вычисления отношения между временем расчета одного работника и временем расчета каждого максимального количества работников. Чтобы визуализировать, как расчеты масштабируются с количеством работников, постройте график скорости с количеством работников. Заметьте, что скорость увеличивается с количеством работников. Однако масштабирование не идеально из-за накладных расходов, связанных с параллелизацией.
f = figure; speedup = tLocal(1)./tLocal; plot(numWorkers, speedup); title('Speedup with the number of workers'); xlabel('Number of workers'); xticks(numWorkers); ylabel('Speedup');
Когда вы закончите с вашими расчетами, удалите текущий параллельный пул, чтобы можно было создать новый для вашего кластера. Вы можете получить текущий параллельный пул с gcp
функция.
delete(gcp);
Если вычислительная задача слишком велика или слишком медлена для локального компьютера, можно разгрузить вычисление в кластер на месте или в облаке. Перед запуском следующих разделов необходимо получить доступ к кластеру. На вкладке MATLAB Home перейдите в Parallel > Discover Cluster, чтобы узнать, есть ли у вас уже доступ к кластеру с MATLAB Parallel Server™. Дополнительные сведения см. в разделе Обнаружение кластеров.
Если у вас нет доступа к кластеру, необходимо сконфигурировать доступ к кластеру до запуска следующих разделов. В MATLAB можно создавать кластеры в облачном сервисе, таком как Amazon AWS, непосредственно с рабочего стола MATLAB. На вкладке «Вкладке Home», в меню Parallel, выберите Create and Manage Clusters. В Диспетчере профилей кластеров щелкните Создать облако. Дополнительные сведения о масштабировании облака см. в разделе Начало работы с облачным центром. Дополнительные сведения о опциях масштабирования до кластера в сети см. в разделе Запуске с MATLAB Parallel Server (MATLAB Parallel Server).
После настройки профиля кластера можно изменить его свойства в Parallel > Создать и управлять кластерами. Дополнительные сведения см. в разделах Обнаружение кластеров и Использование профилей кластеров. На следующем изображении показан профиль кластера в диспетчере профилей кластеров:
Если вы хотите запустить параллельные функции в кластере по умолчанию, установите профиль кластера по умолчанию в Parallel > Select a Default Cluster:
Можно также использовать программный подход для определения кластера. Для этого запустите параллельный пул в кластере, указав имя профиля кластера в parpool
команда. В следующем коде замените MyCluster
с именем профиля кластера. Также укажите количество рабочих процессов со вторым входным параметром.
parpool('MyCluster',64);
Starting parallel pool (parpool) using the 'MyCluster' profile ... connected to 64 workers.
Как и прежде, измерьте скорость с количеством работников, запустив один и тот же код несколько раз, и ограничив максимальное количество работников. Поскольку кластер в этом примере позволяет работать больше, чем локальная настройка, numWorkers
может содержать больше значений. Если вы запускаете этот код, parfor
цикл теперь запускается в кластере.
numWorkers = [1 2 4 6 16 32 64]; tCluster = zeros(size(numWorkers)); for w = 1:numel(numWorkers) tic; parfor (idx = 1:numel(compositeNumbers), numWorkers(w)) factors(idx,:) = factor(compositeNumbers(idx)); end tCluster(w) = toc; end
Вычислите скорость и постройте график относительно количества работников, чтобы визуализировать, как расчеты масштабируются с количеством работников. Сравните результаты с результатами локальной настройки. Заметьте, что скорость увеличивается с количеством работников. Однако масштабирование не идеально из-за накладных расходов, связанных с параллелизацией.
figure(f); hold on speedup = tCluster(1)./tCluster; plot(numWorkers, speedup); title('Speedup with the number of workers'); xlabel('Number of workers'); xticks(numWorkers(2:end)); ylabel('Speedup');
После завершения расчетов удалите текущий параллельный пул.
delete(gcp);
batch
После завершения прототипирования и интерактивной работы можно использовать пакетные задания для разгрузки выполнения длительных расчетов в фоновом режиме с пакетной обработкой. Расчет происходит в кластере, и можно закрыть MATLAB и получить результаты позже.
Используйте batch
функция для отправки пакетного задания в кластер. Можно поместить содержимое алгоритма в скрипт и использовать batch
функция для отправки. Например, скрипт myParallelAlgorithm выполняет простой бенчмарк, основанный на целочисленной задаче факторизации, показанной в этом примере. Скрипт измеряет время расчета нескольких сложностей задачи с разным количеством работников.
Обратите внимание, что если вы отправляете файл скрипта с помощью batch
MATLAB переносит все переменные рабочей области в кластер, даже если ваш скрипт их не использует. Если у вас есть большая рабочая область, это негативно влияет на время передачи данных. Как лучшая практика, преобразуйте ваш скрипт в файл функции, чтобы избежать этих накладных расходов на коммуникацию. Вы можете сделать это, просто добавив линию функции в начале вашего скрипта. Чтобы узнать, как преобразовать myParallelAlgorithm в функцию, см. MyParallelAlgorithmFcn.
Следующий код отправляет myParallelAlgorithmFcn
как пакетное задание. myParallelAlgorithmFcn
возвращает два выходных аргументов, numWorkers
и time
, и вы должны задать 2
как количество выходов входного параметра. Потому что коду нужен параллельный пул для parfor
цикл, используйте 'Pool'
Пара "имя-значение" в batch
для определения количества работников. Кластер использует дополнительный рабочий процесс, чтобы запустить саму функцию. По умолчанию batch
изменяет текущую папку рабочих процессов кластера на текущую папку клиента MATLAB. Может быть полезно управлять текущей папкой. Например, если кластер использует другую файловую систему, и поэтому пути отличаются, например, когда вы отправляете с клиентского компьютера Windows в кластер Linux. Установите пару "имя-значение" 'CurrentFolder'
в папку по вашему выбору или в '.'
чтобы избежать изменения папки рабочих процессов.
totalNumberOfWorkers = 65; cluster = parcluster('MyCluster'); job = batch(cluster,'myParallelAlgorithmFcn',2,'Pool',totalNumberOfWorkers-1,'CurrentFolder','.');
Чтобы контролировать состояние вашего задания после его отправки, откройте Job Monitor in Parallel > Monitor Jobs. Когда расчеты запускаются в кластере, состояние задания изменяется на running
:
MATLAB можно закрыть после отправки задания. Когда вы снова открываете MATLAB, монитор заданий отслеживает задание для вас, и можно взаимодействовать с ним, если щелкнуть правой кнопкой мыши. Для примера, чтобы извлечь объект задания, выберите Показ Details и, чтобы перенести выходы пакетного задания в рабочую область, выберите Fetch Выходов.
Кроме того, если вы хотите заблокировать MATLAB до завершения задания, используйте wait
функция на объекте задания.
wait(job);
Чтобы перенести выходы функции из кластера, используйте fetchOutputs
функция.
outputs = fetchOutputs(job); numWorkers = outputs{1}; time = outputs{2};
После получения результатов их можно использовать для вычислений на локальном компьютере. Вычислите скорость и постройте график относительно количества работников. Поскольку код запускает факторизации для различных сложностей задачи, вы получаете график для каждого уровня. Вы можете увидеть, что для каждой сложности проблемы ускорение увеличивается с количеством работников, пока накладные расходы для дополнительных работников не будут больше, чем увеличение эффективности от параллелизации. Когда вы увеличиваете сложность задачи, вы достигаете лучшего ускорения при большом количестве работников, потому что накладные расходы, связанные с параллелизацией, менее значительны.
figure speedup = time(1,:)./time; plot(numWorkers,speedup); legend('Problem complexity 1','Problem complexity 2','Problem complexity 3','Problem complexity 4','Location','northwest'); title('Speedup vs complexity'); xlabel('Number of workers'); xticks(numWorkers(2:end)); ylabel('Speedup');
batch
| fetchOutputs (Job)
| parfor
| parpool