Python-скрипты на кластере

1. Структура python-скрипта

Здесь предполагается, что python-скрипт - это текст программы, написанной на языке, понимаемом интерпретатором python соответствующей версии, и начинающейся со строки следующего вида с заменой 'N.N' на номер версии (например, на 3 или на 3.9).

#!/usr/bin/env pythonN.N

В этом случае имя python-скрипта может быть непосредственно передано команде sbatch в качестве имени исполняемого файла для постановки задачи на выполнение на вычислительных узлах кластера. После первой строки могут быть добавлены строки вида #SBATCH ... с заказом требуемых задаче ресурсов (см. man sbatch).

2. Каталог ~/.local

При использовании python надо понимать, что на вычислительных узлах разрешено писать лишь в подкаталоги каталогов ~/_scratch и ~/_scratch2, а некоторые модули python используют каталог ~/.local для записи временных подкаталогов и файлов. Значит, перед использованием python (в частности, до установки своих модулей) следует убедиться, что каталог ~/.local - это ссылка на ~/_scratch/.local, выполнив команду ls -l ~/.local. Если это не так, то нужно переместить каталог ~/.local в одну из указанных папок, выполнив, например, команды

mv  ~/.local  ~/_scratch/
ln  -s  ~/_scratch  ~/.local

3. Установка новых модулей к имеющимся версиям python

На кластере "Уран" установлено несколько версий python. В силу того, что некоторые модули системы python требуют настройки на конкретные версии системного ПО кластера, установка необходимых дополнительных модулей python осуществляется самим пользователем в зависимости от потребностей запускаемых им программ.

При использовании менеджера пакетов pip (см. man pip) для установки недостающих пакетов следует указывать опцию --user, чтобы дополнительные пакеты устанавливались в специальный каталог конкретного пользователя и не влияли на работу других пользователей, и, вызывать версию pip, соответствующую используемой версии python.

Пример:

pip3.9 install --user mpi4py

4. Работа с именованными виртуальными средами выполнения (virtual environment)

Создание виртуальных сред выполнения (комплектов пакетов) и переключение на работу с ними рекомендуется осуществлять через менеджеры пакетов conda или mamba, а также с помощью специальных скриптов, обеспечивающих такую настройку.

Так команда

source /opt/intelpython39/bin/activate

переключает на работу с относительно свежей версией python3.9 с установленными дополнительно библиотеками pandas, jupyter, scikit-image, h5py, pillow, networkx, protobuf и opencv. Для работы программ, использующих видеокарты для машинного обучения, в этой версии python также установлены pytorch, tensorflow, keras, которые собраны на базе cuda 11.8. Кроме того, будет доступен менеджер пакетов mamba.

Написание и запуск параллельных python-скриптов

MPI

Модуль mpi4py делает возможным формирование нескольких mpi-процессов с обменом сообщениями (данными) между ними даже тогда, когда они выполняются на разных вычислительных узлах (см. https://mpi4py.readthedocs.io/en/stable/tutorial.html).

Например, команда

pip3.9 install --user mpi4py

установит пакет mpi4py в подкаталог .local домашнего каталога пользователя. После этого при выполнении python-скрипта со строкой

from mpi4py import MPI

утилита python3 найдёт установленный модуль (при условии, что python3 эквивалентно python3.9).

На вычислительных узлах модуль mpi4py будет правильно стыковаться с нужной реализацией MPI, если перед запуском выбрать (командами mpiset ... или module switch ...) конкретную реализацию стандарта MPI, отличную от openmpi, и задать предварительную загрузку соотвествующей библиотеки, задав её имя в переменной LD_PRELOAD, например, выполнив команду

export LD_PRELOAD=`libmpi_name.sh`

Постановка в очередь таких python-скриптов осуществляется командами, подобными упрощённой

mqrun -n 4 -t 5 ./testmpi.py

или базовой

sbatch -n 4 -t 5 -J test --wrap='srun ./testmpi.py'

Здесь srun необходима для формирования группы из заданного числа MPI-процессов.

Предполагается, что предварительно было выполнено

cd ~/_scratch/tests

и скрипт ./testmpi.py находится в каталоге ~/_scratch/tests.

OpenMP

Модуль pymp устанавливается командой

pip install --user pymp-pypi

и позволяет, добавив специальные строки в python-скрипт по аналогии с декларациями OpenMP в C- и fortran-программах, образовать несколько подпроцессов с имитацией общих массивов данных, например, для ускорения выполнения длительного цикла за счёт привлечения дополнительных вычислительных ядер процессора (см. https://github.com/classner/pymp ).

Понятно, что такие python-скрипты должны выполняться лишь на одном вычислительном узле, так как массивы переменных (располагающиеся в оперативной памяти) должны быть доступны всем подпроцессам. В команде постановки в очередь необходимо указать дополнительно количество вычислительных ядер на подзадачу

sbatch -n 1 --cpus-per-task=4 -t 5 -J test ./testmp.py

Предполагается, что предварительно было выполнено

cd ~/_scratch/tests

и скрипт ./testmp.py находится в каталоге ~/_scratch/tests.