Вычислительный кластер Ekman ИОРАН состоит из 5 партиций: rack1, broadwellr2, r2c2, knl и gpu. Каждая партиция состоит из идентичных вычислительных узлов (одинаковые процессоры, количество оперативной памяти и т.д.). В таблице ниже представлены конфигурации каждой партиции.
| Партиция | Модель процессора | Ядер на узел |
Всего узлов |
Всего ядер |
RAM на ядро |
|---|---|---|---|---|---|
| rack1 | Intel Platinum 8368Q | 76 | 17 | 1292 | 3.4G |
| broadwellr2 | Intel Xeon E5-2697A v4 | 32 | 15 | 480 | 8G |
| knl | Intel Phi CPU 7290 | 72 | 2 | 144 | 1.3G |
| r2c2 | Intel Xeon Gold 6248R | 48 | 15 | 720 | 4G |
| gpu | NVIDIA H100 Gen5, 80G | 14592 | 2 карты | 29184 | 5.6M |
⚠️ Объединять партиции невозможно, т.е. одну задачу можно отправить только на одну партицию.
Доступ предоставляется только по протоколу ssh. Адрес точки входа: sail.msk.ru, порт 2240. Для пользователей Linux или MacOS команда в терминале будет выглядеть примерно вот так:
ssh -X USERNAME@sail.msk.ru -p 2240
где USERNAME – это полученное от системного администратора имя вашего пользователя.
На кластере есть 2 основные системы хранения: /storage/ekman (267T, SAS диски) и /storage/scratch (27T, SSD диски). Вторая система более производительна, однако, из-за ограничения в объеме, данные старше чем три месяца безвозвратно удаляются автоматическим скриптом.
Для достижения максимальной скорости расчета, задачки для партиции rack1 рекомендуется запускать из /storage/scratch , а расчет на остальных партициях лучше запускать из /storage/ekman. Это связанно с особенностью подключения высокоскоростного интерконнекта.
Дополнительно пользователям доступны хранения: /storage/kubrick, /storage/tartar и /storage/thalassa. Это сетевые хранилища. Расчет с них запустить не получится, однако они позволяют работать с большими объемами данных.
При подключении нового пользователя, на каждой из описанных выше систем хранения автоматически создается папка с именем пользователя – работать можно только внутри этой папки.
⚠️ В СВОЕЙ ДОМАШНЕЙ ПАПКЕ ($HOME/USERNAME) РАБОТАТЬ НЕЛЬЗЯ!
На кластере Ekman реализована система модулей окружения. Посмотреть наличие нужного модуля можно командой module avail. Посмотреть список модулей, которые уже загружены: module list. Загрузить модуль можно командой module load {MODULE_NAME}, где MODULE_NAME это название модуля из списка module avail. К примеру, для загрузки компиляторов необходимо выполнить команду:
module load compiler/2021.3.0
Далее можно использовать стандартные команды компиляции для OneAPI©. Компиляция последовательного кода: ifort (FORTRAN) или icc (C/C++). Компиляция параллельного кода: mpiifort (FORTRAN) или mpiicc (C/C++).
Для загрузки библиотек работы с компиляторами и NetCDF нужно загрузить модули:
module load compiler/2021.3.0
module load netcdf4/intel/serial
При работе с языком Python, рекомендуется загружать пакет module load anaconda/24.1.2. В этом случае нет необходимости устанавливать его индивидуально. Настоятельно рекомендуется для работы создавать окружения (enviroment). Например, для создания обертки для работы с numpy модулем:
module load anaconda/24.1.2
conda create -n numpy
conda activate numpy
conda install conda-forge::numpy
Выйти из окружения можно командой
conda deactivate
Просмотри текущих загруженных модулей вополняется командой module avail, а просмотр всего списка доступных модулей – module list. Выгрузить все модули разом можно командой module purge. Для установки новых модулей необходимо обратиться к системному администратору (Гавриков Александр). Однако предпочтительным является вариант установки нужных версий того или иного софта средствами conda enviroment. Например, чтобы установить полный пакет редактирования NetCDF файлов из командной строки, необходимы следующие команды:
module load anaconda/24.1.2
conda create -n cdo
conda activate cdo
conda install -y conda-forge::cdo
conda install -y conda-forge::nco
conda install -y conda-forge::ncview
conda deactivate
Такая логика позволяет контролировать версии пакетов пользователями, что значительно ускоряет работу.
Проще всего проверить есть ли свободные ресурсы командой
sinfo
Ее примерный вывод
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
login down infinite 1 drain login1
rack1* up 30-00:00:0 2 alloc n01p[001-002]
rack1* up 30-00:00:0 9 idle n01p[003-011]
broadwellr2 up 30-00:00:0 1 down* n02p016
broadwellr2 up 30-00:00:0 14 idle n02p[001-008,010-011,013-015,017]
knl up 30-00:00:0 2 idle n02p[018-019]
r2c2 up 30-00:00:0 14 idle n02p[020-025,027-034]
gpu up 30-00:00:0 1 idle nvidia
означает, что в партиции rack1 свободной 9 узлов (их статус помечен как idle) и 2 узла заняты (alloc). Партиции knl, r2c2 и gpu полностью свободны. В партиции broadwellr2 доступно 14 узлов и один находится в выключенном состоянии (down).
⚠️ Максимальное разрешенное время на выполнение задачи: 30 суток. Если требуется сверх долгий расчет -- необходимо согласовать его с адмиристраторм.
Наиболее распространенный тип запуска. Если вы не знаете на какой архитектуре вам запускать задачу – это означает, что запускать нужно здесь.
Задача отправляется на расчет и не "отпускает"" консоль. Как будто вы запускаете исполняемый файл прямо на текущем компьютере. Часто делается при дебагинге. Обращаю внимание: запускать таким образом нужно сразу исполняемый файл! Пример -- отправляем на расчет задачу test.exe на 16 ядрах партиции rack1:
srun --partition=rack1 -n 16 ./task.exe
Наиболее частый (и рекомендуемый!) способ. Мы ставим задачу в очередь, отпуская консоль. Для этого требуется небольшой скрипт, в котором будет указана конфигурация запуска. Например, запускам задачу по количеству требуемых ядер
sbatch -n 128 ./program.sh
... или указываем вычислительные ноды -- в этом случае количество используемых ядер посчитается автоматически (предпочтительный вариант):
sbatch -w n01p[001-02] ./program.sh
В обоих случаях скрипт program.sh должен выглядеть примерно таким образом (показано на примере партиции rack1):
#!/bin/bash
#SBATCH -J real # название задачки (как она будет отображатсья в системе)
#SBATCH --partition=rack1 # название партишена
#SBATCH --time=00-00:10:00 # Примерное время на выполнение (DD-HH:MM:SS) (10 минут)
#SBATCH --ntasks-per-node=76 # Количество ядер на одном ноде
# Можно внутри скрипта загрузить модули, которые нужны для расчета, например:
module purge # Чистим окружение
module load compiler/2021.3.0 # Загружаем компилятор
module load mpi/2021.12 # Загружаем MPI библиотеки
module load netcdf4/intel/2021.3.0/serial # Загружаем NetCDF библиотеки
# Конифгурируем настройки Intel MPI (mpi/2021.12):
export I_MPI_OFI_PROVIDER=verbs # (только для запуска из /storage/scratch!) Включить быстрый InfiniBand провайдер
srun ./program.exe
То есть мы запустили задачу в очередь на 152 ядра, потому что потребовали в строке запуска 2 узла из очереди rack1, а эти ноды имеют по 76 ядер на ноде (см. таблицу вверху). Об этом мы пишем уже внутри скрипта (параметры --partition и --ntasks-per-node).
⚠️ Обращаю внимание, что эти параметры зависимы: количество ядер на узел зависит от того, какая партиция была выбрана! Т.е. если хотим запустить задачу в партиции r2c2, то в скрипте меняем переменные
--partition=r2c2и--ntasks-per-node=48, согласно первой таблице.
Проверить как дела у запущенной задачи можно командой
squeue
Ее вывод
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
636 rack1 real gavr R 0:52 2 n01p[001-002]
говорит о том, что задача под номером 636 и именем real была запущена в партиции rack1 пользователем gavr сейчас находится в статусе активного расчета R уже почти минуту (0:52) на двух нодах n01p[001-002]. И т.д. для остальных партиций.
scancel JOBID