• A
  • A
  • A
  • АБВ
  • АБВ
  • АБВ
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

MATLAB

👉Вернуться к списку инструкций

MATLAB  — среда и язык технических расчетов, предназначенный для решения широкого спектра инженерных, научных и математических задач любой сложности в различных отраслях науки и техники.

MATLAB - это одновременно:
  • Язык инженерных расчетов.
  • Графические приложения (приложения с графическим интерфейсом).
  • Средства разработки программного обеспечения.
  • Более сотни прикладных программ (toolboxes) - расширений системы и ее адаптации под решение определенных классов математических и научно-технических задач.

Доступные версии на суперкомпьютерном комплексе:

module load matlab/r2023a   # релиз R2023a от 02.2023
module load matlab/r2021b   # релиз R2021b от 09.2021
module load matlab/r2020b   # релиз R2020b от 09.2020
module load matlab/r2020a   # релиз R2020a от 03.2020

В сборках R2020a и R2020b дополнительно доступен интерфейс для библиотеки PRIMME и также включены модули MAGMA и EEGLAB:

module load primme/v3.1.1 

 Пользователи: Центр языка и мозга, Научно-учебная лаборатория методов анализа больших данных, Департамент прикладной математики МИЭМ, любые подразделения НИУ ВШЭ.


MATLAB на суперкомпьютере может быть использован в нескольких режимах:

  • Пакетный (неинтерактивный) режим - выполнение записанных в файл команд с выдачей результата в выходной файл.
  • Интерактивный режим - запуск MATLAB в консольном режиме на узле суперкомпьютера. Выполнение и вывод результатов на экран.
  • Параллельный расчёт с использованием MATLAB Parallel Server - выполнение сложных вычислений с использованием мощности суперкомпьютера.

Запуск MATLAB на суперкомпьютере в пакетном режиме 

Для выполнения расчётов в пакетном (неинтерактивном) режиме необходимо подготовить .m файл и скрипт-файл для постановки задачи в очередь Slurm.

Ниже приведён пример matlab-скрипта, matlabexample.m, который создаёт вектор, используя простой for-цикл и записывает результат в бинарный файл result.dat, а также пример скрипт-файла matlab.sbatch.
Чтобы выполнить пробный запуск на суперкомпьютере создайте оба файла в одном каталоге и выполните команду sbatch matlab.sbatch

Входной файл для MATLAB (matlabexample.m):

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/r2020a                  # Загрузка модуля MATLAB
# Запуск MATLAB с файлом matlabexample.m
matlab -nodisplay -nosplash -r "run('matlabexample.m'); exit" > result.dat

Для постановки задачи в очередь выполните команду sbatch matlab.sbatch
Не забудьте скорректировать параметры в скрипте для своих расчетов!
Посмотреть состояние своих задач можно с помощью команды mj

Результат запуска в файле figure.png:
fig
Множество встроенных функций MATLAB поддерживают возможность ускорения расчёта путем разветвления его на несколько нитей. Это позволяет выполнять задачу на нескольких ядрах процессора без дополнительных модификаций кода. Встроенная многопоточность доступна, преимущественно, для операций линейной алгебры и быстрых преобразований Фурье (полный список функий с многопоточностью доступен на сайте MATLAB).

При выполнении расчёта на узле суперкомпьютера MATLAB будет автоматически использовать все выделенные пользователю ядра процессора. Поэтому, при использовании функций, поддерживающих многопоточность, рекомендуется увеличивать количество запрашиваемых ядер в скрипте sbatch, путём редактирования строки #SBATCH -c 1

Запуск MATLAB на суперкомпьютере в интерактивном режиме 

Для выполнения расчётов в интерактивном режиме необходимо выделить узел с указанием необходимого количества CPU/GPU и запустить консоль bash. Для этого, выделите ресурсы на суперкомпьютере с помощью следующей команды:

srun --ntasks--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/r2020a
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/r2020a
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/r2020a
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

Полезные ссылки


 

Нашли опечатку?
Выделите её, нажмите Ctrl+Enter и отправьте нам уведомление. Спасибо за участие!
Сервис предназначен только для отправки сообщений об орфографических и пунктуационных ошибках.