MATLAB
👉Вернуться к списку инструкций
MATLAB — среда и язык технических расчетов, предназначенный для решения широкого спектра инженерных, научных и математических задач любой сложности в различных отраслях науки и техники.MATLAB - это одновременно:
- Язык инженерных расчетов.
- Графические приложения (приложения с графическим интерфейсом).
- Средства разработки программного обеспечения.
- Более сотни прикладных программ (toolboxes) - расширений системы и ее адаптации под решение определенных классов математических и научно-технических задач.
Доступные версии на суперкомпьютерном комплексе:
module load matlab/r2024a # релиз R2024a от 04.2024 module load matlab/r2023a # релиз R2023a от 02.2023
Пользователи: Центр языка и мозга, Научно-учебная лаборатория методов анализа больших данных, Департамент прикладной математики МИЭМ, любые подразделения НИУ ВШЭ.
MATLAB на суперкомпьютере может быть использован в нескольких режимах:
- Пакетный (неинтерактивный) режим - выполнение записанных в файл команд с выдачей результата в выходной файл.
- Интерактивный режим - запуск MATLAB в консольном режиме на узле суперкомпьютера. Выполнение и вывод результатов на экран.
- Параллельный расчёт с использованием MATLAB Parallel Server - выполнение сложных вычислений с использованием мощности суперкомпьютера.
Запуск MATLAB на суперкомпьютере в пакетном режиме
Для выполнения расчётов в пакетном (неинтерактивном) режиме необходимо подготовить .m файл и скрипт-файл для постановки задачи в очередь Slurm.
Ниже приведён пример скрипт-файла matlab.sbatch. Чтобы выполнить пробный запуск на суперкомпьютере, создайте оба файла в одном каталоге и выполните команду sbatch matlab.sbatch
#!/bin/bash #SBATCH --job-name=test-matlab # Название задачи #SBATCH --error=test-matlab-%j.err # Файл для вывода ошибок #SBATCH --output=test-matlab-%j.log # Файл для вывода результатов #SBATCH --ntasks 1 # Количество MPI процессов #SBATCH --cpus-per-task 1 # Количество CPU на одну задачу #SBATCH --mail-user=ваша_почта # Укажите ваш email для отправки уведомлений #SBATCH --mail-type=END,FAIL # События, требующие уведомления module load matlab/r2024a # Загрузка модуля MATLAB # Запуск MATLAB с файлом matlabexample.m matlab -nodisplay -nosplash -r "run('matlabexample.m'); exit" > result.dat
Для постановки задачи в очередь выполните команду sbatch matlab.sbatch
Не забудьте скорректировать параметры в скрипте для своих расчетов!
Посмотреть состояние своих задач можно с помощью команды mj
При выполнении расчёта на узле суперкомпьютера MATLAB будет автоматически использовать все выделенные пользователю ядра процессора. Поэтому, при использовании функций, поддерживающих многопоточность, рекомендуется увеличивать количество запрашиваемых ядер в скрипте sbatch, путём редактирования строки #SBATCH -c 1
Запуск MATLAB на суперкомпьютере в интерактивном режиме
Для выполнения расчётов в интерактивном режиме необходимо выделить узел с указанием необходимого количества CPU/GPU и запустить консоль bash. Для этого, выделите ресурсы на суперкомпьютере с помощью следующей команды:
srun --ntasks 1 --cpus-per-task 1 --time 00:30:00 --pty $SHELL
Запрос на выделение ресурсов встанет в очередь. Как только подходящий узел освободится, в консоли появится уведомление srun: job has been allocated resources. Hostname в строке приглашения консоли изменится на имя узла суперкомпьютера.
После этого, загрузите модуль matlab:
module load matlab/r2020a
Запустите консоль MATLAB в интерактивном режиме:
matlab -nodisplay -nosplash
В этом режиме вы можете выполнять команды MATLAB, загружать и редактировать скрипт-файлы, но не можете отображать графики (их можно сохранять в файл, скачивать и просматривать на локальном компьютере). Несмотря на минималистичность, в данной консоли поддерживается завершение команд с помощью клавиши TAB и доступна встроенная справка по командам help название_команды.
Пример вычисления в интерактивном режиме:
A=rand(100); B=rand(100); AB=A*B; sumAB=sum(AB(:)); sumAB save out.mat AB sumABНа экран будет выведена сумма матриц A и B, а в файл out.mat будут записаны переменные AB и sumAB.
Параллельные расчёты с использованием Parallel Computing Toolbox
Тулбокс Parallel Computing Toolbox позволяет разрабатывать распределённые и параллельные MATLAB-приложения и выполнять их на нескольких экземплярах MATLAB (worker). PCT добавляет множество функций для распараллеливания циклов, расчётов на GPU и обработки больших данных. Подробную информацию обо всех возможностях PCT можно найти в документации (pdf-версия, html-версия ).
Параллельные циклы FOR (parfor)
Ниже представлен простой пример кода, иллюстрирующий использование Parallel Computing Tooltobx для вычисления числа Pi с помощью параллельного метода Монте-Карло. В примере используются параллельные циклы parfor (parallel for). По этой схеме подходящие циклы for в других задачах могут быть заменены на параллельные parfor без других изменений в коде.Содержимое файла pfor.m
%============================================================================ % Parallel Monte Carlo calculation of PI %============================================================================ % Launch parallel pool with as many workers as requested hPar = parpool( 'local' ); % Report number of workers fprintf( '\nNumber of workers = %d\n' , hPar.NumWorkers ) % Main code R = 1; darts = 1e7; count = 0; % Prepare settings tic; % Start timer parfor i = 1:darts % Compute the X and Y coordinates of where the dart hit the............... % square using Uniform distribution....................................... x = R * rand(1); y = R * rand(1); if x^2 + y^2 <= R^2 % Increment the count of darts that fell inside of the................. % circle............................................................... count = count + 1 end end % Compute pi................................................................. myPI = 4 * count / darts; T = toc; % Stop timer % Log result, shutdown pool and exit fprintf('\nThe computed value of pi is %8.7f\n',myPI); fprintf('\nThe parallel Monte-Carlo method is executed in %8.2f seconds\n\n', T); delete(gcp); exit;
Содержимое файла pfor.sbatch
#!/bin/bash #SBATCH -J pfor #SBATCH -o pfor-%j.out #SBATCH -e pfor-%j.err #SBATCH -N 1 # Кол-во запрашиваемых узлов #SBATCH -c 8 # Кол-во запрашиваемых ядер #SBATCH -t 0-00:30 # Ограничение времени выполнения module load matlab/r2024a matlab -nosplash -nodesktop -r "pfor"Постановка задачи в очередь суперкомпьютера осуществляется командой sbatch pfor.sbatch, в консоль будет выведено сообщение Submitted batch job %j (где %j - номер задачи в очереди). На вычислительном узле будет запущен пул из 8 процессов MATLAB (количество регулируется в pfor.sbatch строкой #SBATCH -c 8). Результат вычисления будет записан в файл pfor-%j.out
Содержимое файла pfor-00000.out
Number of workers = 8 The computed value of pi is 3.1408868 The parallel Monte-Carlo method is executed in 0.71 secondsЛюбые ошибки при выполнении расчёта будут записаны в файл pfor-%j.err
Одна программа множество данных (SPMD)
В тулките PCT также доступна модель параллельного программирования Single Program Multiple Data. При использовании SPMD задачи могут быть распределены и назначены параллельным процессам MATLAB в зависимости от их ранга. Ниже представлен пример, печатающий ранг каждого процесса MATLAB.Содержимое файла spmd_test.m
%==================================================================== % Illustration of SPMD Parallel Programming model with MATLAB %==================================================================== parpool('local') % Start of parallel region........................................... spmd nproc = numlabs; % get total number of workers iproc = labindex; % get lab ID if ( iproc == 1 ) fprintf ( 1, ' Running with %d labs\n', nproc ); end for i = 1: nproc if iproc == i fprintf ( 1, ' Rank %d out of %d\n', iproc, nproc ); end end % End of parallel region............................................. end delete(gcp); exit;
Содержимое файла spmd.sbatch
#!/bin/bash #SBATCH -J spmd_test #SBATCH -o spmd_test-%j.out #SBATCH -e spmd_test-%j.err #SBATCH -N 1 # Кол-во запрашиваемых узлов #SBATCH -c 8 # Кол-во запрашиваемых ядер #SBATCH -t 0-00:30 # Ограничение времени выполнения module load matlab/r2024a matlab -nosplash -nodesktop -r "spmd_test"Постановка задачи в очередь суперкомпьютера осуществляется командой sbatch spmd.sbatch, в консоль будет выведено сообщение Submitted batch job %j (где %j - номер задачи в очереди). На вычислительном узле будет запущен пул из 8 процессов MATLAB (количество регулируется в spmd.sbatch строкой #SBATCH -c 8). Результат вычисления будет записан в файл spmd_test-%j.out
Содержимое файла spmd_test-00000.out
Lab 1: Running with 8 labs Rank 1 out of 8 Lab 2: Rank 2 out of 8 ...Любые ошибки при выполнении расчёта будут записаны в файл pfor-%j.err
Параллельные расчёты с использованием Parallel Server из интерфейса MATLAB
Parallel Server позволяет запускать параллельные расчёты на нескольких узлах суперкомпьютера. В настоящий момент, лицензия НИУ ВШЭ позволяет запускать до 32 процессов MATLAB. Используя комбинацию Parallel Computing Toolbox и Parallel Server можно взаимодействовать с очередью задач суперкомпьютера со своего рабочего ПК, на котором установлен пакет MATLAB. Подключение к Parallel Server с ПК вне сети ВШЭ возможно только при использовании корпоративного VPN.
Для начала работы с Parallel Server необходимо создать новый профиль кластера, настроить его для работы с очередью задач суперкомпьютера и указать скрипт-файлы для работы с очередью задач Slurm.
Создание профиля кластера
1. Скачайте и распакуйте следующий архив с конфигурацией (ZIP, 32 Кб)2. Откройте MATLAB. На вкладке HOME нажмите на кнопку Parallel и выберите пункт "Create and Manage Clusters...".
3. В появившемся окне нажмите на кнопку Import и выберите файл Supercomputer_HSE.mlsettings из распакованного архива.
4. Выберите импортированный профиль Supercomputer HSE и нажмите на кнопку Edit. В разделе SCHEDULER PLUGIN в пункте PluginScriptsLocation укажите путь до папки nonshared из распакованного архива. В Additional Properties впишите в поле Username свой логин на суперкомпьютере. По завершению редактирования нажмите на кнопку Done. 5. Установите отредактированный профиль по умолчанию, нажав на кнопку Set as Default.
Выполнение расчётов на суперкомпьютере
Перейдите в окно Command Window и выполните команду c = parclusterРезультатом её выполнения будет новый объект parcluster, связанный с суперкомпьютером.
Для иллюстрации возможности удалённой постановки задач в очередь суперкомпьютера воспользуемся следующим примером. Сохраните его в файле parallel_example.m.
%==================================================================== % parallel_example.m %==================================================================== function t = parallel_example(iter) if nargin==0, iter = 16; end disp('Start sim'); t0 = tic; parfor idx = 1:iter A(idx) = idx; pause(2); end t = toc(t0); disp('Sim completed');Отправка задачи на суперкомпьютер производится командой batch. Выполните команду:
j = c.batch(@parallel_example, 1, {}, 'pool', 4, 'CurrentFolder', '.');MATLAB запросит пароль от вашей учётной записи на суперкомпьютере и выполнит необходимые действия для постановки задачи в очередь Slurm.
Отслеживать статус задачи можно с помощью метода State у объекта j - j.State, либо в окне Job Monitor, доступного в меню Parallel -> Monitor Jobs:
После того, как задача завершена необходимо получить с суперкомпьютера результаты вычислений. Для этого выполните команду j.fetchOutputs, либо щелкните правой кнопкой мыши по задаче в окне Job Monitor и выберите пункт Fetch Outputs.
Важно: fetchOutputs возвращает только результат выполнения функции. Данные, записанные на диск во время расчёта, необходимо вручную скопировать с суперкомпьютера при необходимости.
Дополнительные параметры при отправке задачи можно указывать в переменной additionalSubmitArgs:
j = c.batch(@parallel_example, 1, {100}, 'pool', 8); additionalSubmitArgs = '--ntasks=9 -c 1 --ntasks-per-core=1'После получения результатов расчёта объект j можно удалить с помощью команды j.delete
Запуск задачи, которая взаимодействует с другими файлами
Команда batch при выполнении анализирует код и автоматически отправляет все необходимые файлы, которые недвусмысленно заданы. В случае, если ваша задача во время выполнения обращается к другим файлам, например, имя которых неявно вычисляется, то необходимо использовать дополнительные опции 'AttachedFiles' или 'AdditionalPaths'.Пример функции с доступом к файлам, заданным неявным образом:
function X = myFunction() A = load("mydata.dat"); X = zeros(flip(size(A))); parfor i = 1:3 B = load("mydata"+i+".dat"); X = X + A\B; end endЗдесь функция в цикле обращается к файлам mydata1.dat, mydata2.dat, mydata3,day, но эти имена расчитываются во время выполнения и не будут отправлены на суперкомпьютер в автоматическом режиме. В этом случае, в параметре AttachedFiles команды batch следует явно указать дополнительные файлы, которые будут приложены к задаче:
job = batch(c,@myFunction,1,{},'Pool',3,'CurrentFolder',tempdir,'AttachedFiles',"mydata"+string(1:3)+".dat");
Для подробной информации по использованию команды batch см. официальный сайт MATLAB.
Расчёты с использованием GPU-ускорителей
Многие вычисления могут быть ускорены за счёт выполнения их на GPU-ускорителях. На официальном сайте доступен список всех функций, поддерживающих использование GPU, а также подробное описание различных подходов по ускорению вычислений с помощью GPU. Подключение GPU-ускорителей в MATLAB рекомендуется только для очень больших расчётов.
Для использования GPU необходимо при постановке задачи в очередь указывать дополнительный параметр -G 1 (где 1 - количество выделяемых GPU-ускорителей). Простейший пример gpu_matlab.m, создающий случайную матрицу и выполняющий быстрое преобразование Фурье:
% MATLAB script that defines a random matrix and does FFT on CPU and GPU A1 = rand(3000,3000); % Define a matrix % Use CPU tic; % Do 1000 FFT's for i = 1:1000 B2 = fft(A1); end time1 = toc; fprintf('%s\n',"Time to run FFT on the node:") disp(time1); % Use GPU tic; A2 = gpuArray(A1); % Do 1000 FFT's for i = 1:1000 % MALAB knows to use GPU FFT because A2 is defined by gpuArray B2 = fft(A2); end time2 = toc; fprintf('%s\n',"Time to run FFT on the GPU:") disp(time2); speedup = time1/time2
Содержимое файла gpu_matlab.sbatch:
#!/bin/bash #SBATCH -J gpu_matlab #SBATCH -o gpu_matlab-%j.out #SBATCH -e gpu_matlab-%j.err #SBATCH -N 1 # Кол-во запрашиваемых узлов #SBATCH -c 2 # Кол-во запрашиваемых ядер #SBATCH -G 1 # Кол-во запрашиваемых GPU #SBATCH -t 0-00:30 # Ограничение времени выполнения module load matlab/r2024a matlab -nosplash -nodesktop -r "gpu_matlab"Постановка задачи в очередь суперкомпьютера осуществляется командой sbatch gpu_matlab.sbatch, в консоль будет выведено сообщение Submitted batch job %j (где %j - номер задачи в очереди). На вычислительном узле будет выделен участок из 2 процессоров и 1 GPU. Результат вычисления будет записан в файл gpu_matlab-%j.out
Содержимое файла gpu_matlab-00000.out:
Time to run FFT on the node: 45.7517 Time to run FFT on the GPU: 6.2630 speedup = 7.3050Любые ошибки при выполнении расчёта будут записаны в файл gpu_matlab-%j.err
Для более подробной информации - см. руководство по использованию GPU в MATLAB.
Дополнительные ресурсы по выполнению параллельных расчетов в MATLAB
- Примеры расчётов с использованием Parallel Computing Toolbox
- Документация по Parallel Computing Toolbox
- Пошаговые руководства по параллельным вычислениям и расчётам на GPU
- Видео по Parallel Computing Toolbox и отдельное видео на русском языке
- Вебинары по параллельным вычисления в MATLAB
- Запись вебинара «Параллельные вычисления и Big Data в MATLAB» на русском языке
Полезные ссылки
- Инструкция по работе с системой HPC TaskMaster
Нашли опечатку?
Выделите её, нажмите Ctrl+Enter и отправьте нам уведомление. Спасибо за участие!
Сервис предназначен только для отправки сообщений об орфографических и пунктуационных ошибках.