Руководство пользователя

Оглавление

Введение

Данный документ предназначен пользователям вычислительных кластеров HPC2 и HPC4.
Приводим определение некоторых терминов, связанных с данными кластерами.

Политика безопасности

При регистрации пользователя (см. раздел Регистрация пользователей, Шаг 3) требуется согласие с нашей политикой безопасности, поэтому вам нужно внимательно прочитать этот документ и следовать его предписаниям.

Как сообщить о проблеме

При возникновении любых проблем, относящихся к вашей работе на каком-либо из наших кластеров, пожалуйста, напишите письмо в нашу службу сопровождения пользователей по адресу «help[AT]computing~dot~kiae~dot~ru».

Нам будет удобнее работать с вашим обращением, если при составлении письма вы учтёте следующие рекомендации:

Доступ к ресурсам

Для доступа к вычислительным ресурсам наших кластеров используются следующие login-узлы:

Заход на указанные выше login-узлы кластеров осуществляется с использованием протокола SSH. Для соединения можно использовать программы SSH-клиентов, поддерживающие протокол SSH версии 2. Подойдут, например,

Для копирования файлов можно использовать следующие утилиты:

Создание SSH-ключей

Для аутентификации на нашем кластере в настоящий момент используются SSH-ключи. Если вы не знаете, что это такое, то сейчас вам это будет, по мере возможности, объяснено.

Если коротко, то SSH-ключи – это пара файлов, один из которых называется закрытым ключом, обычно защищён паролем и не показывается никому, во избежание разных неприятностей. Второй файл называется открытым ключом и может быть показан кому угодно; более того, его нужно поместить на сервер, чтобы он начал вас пускать. Из открытого ключа, в-принципе, можно восстановить закрытый, но из-за сложности разложения чисел на простые множители на современных машинах это займет достаточно большое количество времени.

Так вот, вся штука заключается в том, что имея только открытый ключ сервер может проверить, есть ли у вас соответствующий ему закрытый ключ. А поскольку предполагается, что закрытый ключ есть только у вас (именно поэтому его так важно никому не показывать), то сервер сможет утверждать, что если проверка прошла успешно, то к нему стучитесь именно вы.

Теперь один из важных практических вопросов: как создать эти самые SSH-ключи (на сервер их положат наши администраторы, поэтому здесь вы можете быть спокойны).

Создание SSH-ключей на Unix-системах

Предполагается, что у вас установлен пакет OpenSSH, и, стало быть, есть утилита ssh-keygen. Запускаем:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vasya/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your public key has been saved in /home/vasya/.ssh/id_rsa.pub.
The key fingerprint is:
22:f7:7b:96:c5:4b:b2:0d:2d:9f:5f:67:57:48:46:37 vasya[AT]some~dot~host~dot~in~dot~the~dot~net
Соответственно, если вы хотите сохранить ваш ключ не в /home/vasya/.ssh/id_rsa, а куда-то еще, вы можете ввести полный путь в ответ на приглашение «Enter file in which to save the key». Но если вы пока не очень в курсе, как использовать различные SSH-ключи для различных машин, то лучше оставить все как есть.

После отработки ssh-keygen закрытый ключ будет находиться в файле /home/vasya/.ssh/id_rsa, а открытый – в /home/vasya/.ssh/id_rsa.pub. Именно последний файл вам и нужно отослать нам. Пожалуйста, не перепутайте ;))

Если вы используете нестандартное имя файла с закрытым ключом, то вам либо придётся указывать его расположение каждый раз с помощью ключа «-i», либо добавить в файл ~/.ssh/config следующие строчки:

Host ui2.computing.kiae.ru
    IdentityFile ~/.ssh/id_rsa-hpc2
Если вы используете один и тот же открытый ключ для нескольких наших кластеров, то можно использовать настройки, в которых имя узла будет содержать символ «*», который соответствует любому количеству любых символов:
Host ui*.computing.kiae.ru
    IdentityFile ~/.ssh/id_rsa-kiae

Создание SSH-ключей на Windows-системах

Putty

Для создания SSH-ключа вам нужно скачать программу PuTTYgen с сайта Putty. Запускаем программу и выбираем тип ключа «SSH-2 RSA», а его размер – 2048 бит:
Без картинок вам будет тяжело
Нажимаем на кнопку «Generate».

Далее PuTTYgen создает ключ и предлагает ввести для него пароль:
Ох как плохо без картинок
Пароль нужно выбирать такой, чтобы враг его не раскрыл, а вы – не забыли. Также можно ввести комментарий (любой).

Сохраняем private key (закрытый ключ) в файл mykey.ppk, а public key (открытый ключ) – в файл id_rsa.pub.

id_rsa.pub нужно послать нам, а на закрытый ключ нужно натравить Putty, чтоб он знал, откуда его брать. Картинка, я надеюсь, все объясняет:
Картинки бы включить, а?
That's all, folks!

Tectia SSH Client (ssh.com)

Tectia SSH Client – это преемник Windows SSH Client от ssh.com. По нашему мнению, Putty лучше, но некоторые любят этот клиент, поэтому мы вас научим создавать ключи для SSH и в нем.

В меню «Edit» выбираем пункт «Tectia Connections…», в узле дерева слева «User Authentication» выбираем «Keys and Certificates» и получаем примерно следующее окно:
Картинки бы включить, а?

Нажимаем на кнопку «New key…» и получаем следующее окно, в котором необходимо ввести параметры создаваемого ключа:
Картинки бы включить, а?

Ваши действия будут следующими:

Нажав кнопку «Next» вы инициируете создание ключевой пары, что может занять некоторое время. Далее вы увидите следующее окно, предлагающее нам загрузить ключ на сервер:
Картинки бы включить, а?
Нажимаем «Cancel», ничего никуда загружать не нужно.

После этого мы видим первоначальное окно,
Картинки бы включить, а?
но уже с одним (или, если у вас до этого были созданы публичные ключи, с еще одним) ключом. Поле «Default keys» сверху окна показывает, где сохраняются ваши открытый и закрытый ключ.

Файл с закрытым ключом не имеет расширения, файл с открытым ключом имеет расширение «.pub»:
Картинки бы включить, а?
That's all, folks!

Экспорт ключей из Putty/Tectia в формат OpenSSH

Если вам нужно экспортировать закрытый ключ с Windows-системы в Unix и вы использовали Putty или Tectia SSH Client, то сейчас мы объясним, как это можно сделать. Для преобразования необходим Putty key generator, в одном из предыдущих разделов объясняется, где его взять.

Шаг номер 1: вы загружаете существующий закрытый ключ в Putty key generator (меню «File», пункт «Load private key»). Получается примерно такое окно:
Картинки бы включить, а?

Шаг номер 2: находим в меню «Conversions» пункт «Export OpenSSH key», вводим имя файла и выбираем каталог, в который будет сохранен закрытый ключ. Пароль сохраненного закрытого ключа будет таким же, как и пароль к исходному ключу в формате Putty.

Шаг номер 3: переносим закрытый ключ на Unix-машину, лучше – копированием файлов с использованием какого-то offline-носителя, а не через сеть или электронную почту.

Экспорт ключей из OpenSSH в формат Putty/Tectia

Если вам нужно экспортировать закрытый ключ с Unix-системы использющей OpenSSH в Windows, где вы используете Putty или Tectia SSH Client, то этот раздел – для вас.

Шаг номер 1: находим в меню PuTTY Key Generator «Conversions» пункт «Import key», выбираем файл с ключом в формате OpenSSH, вводим в открывшемся окне пароль для этого закрытого ключа и получаем примерно такое окно:
Картинки бы включить, а?

Шаг номер 2: нажимаем в этом окне кнопку «Save private key»,
Картинки бы включить, а?
выбираем имя файла и каталог, куда будет сохранен файл закрытого ключа. Пароль для этого файла будет совпадать с паролем исходного ключа. Если вы хотите его изменить, то перед сохранением ключа в формат Putty необходимо ввести новый пароль в поля «Key passphrase» и «Confirm passphrase»:
Картинки бы включить, а?

Типичные проблемы, возникающие при работе с SSH-ключами

При переносе SSH-ключей между различными операционными системами иногда возникает путаница. Ниже будет показано, как отличить файлы с ключами различных форматов.

Вот как должен выглядеть закрытый ключ для Unix-систем:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,F45627B370E24DB1

XD4u/JN7snja3Wl1Dj7eoIGKiAx8IOALvLbmUTik4liCMxk3OPW1eOTQxAV7CJom
PMfH5kOMAber45D4yiQzGYGc/mxStfNjtm8V7j6N4acb6E4BKRUGmv7ZkLrw9csr
PpZzSQ5wTYiXRzJE55r5Q+CWd2V5qVJypAW2Q8pUMGF6A+DSxno1LSc8TwQ43o8G
FTGw8bCEgnfhXmGGLm6lirbXOQIJRCqbszBlPGZ4uNNaLAkbs7O85dqjKFsTMXLv
XCloDn+8wFr8eg7mZAkAjs0jz9l0PBDAYxivzrw97GRmemHynqsDSaE4F6pxaed9
lhxLwtK0VZH1ofEZUdT64lHJUX4oow9t2r7ajrItlnGBo7redY4yTaLKArxSOdVG
AKOO0PyAv4J2Mm0F8bNwYecUskpu+efr4n2343jJKmXONc+KxfZjdDBFsVFkmpv3
p4AyryKisiT/BbgAdLYXomVKeMSBQe6eDUSQtIabirOBsk63aiJAy5j5yzqzudJ8
IzmCuNB7p4SkmqiPoqW7vPR5G2PlK4G790vszcYr221w5QE3keVB/iRszyJrQHl8
k9LzX3oejumGknLubihJqelWBDP54tGlL88YB9uPQ4jSUFOv8+M68ebBONVh1eB9
uUe0C3FwxUHm53i7v8DnDFki8onnk6mUxa8pgIJJBUMdDnie0CGh1QAT6NiLE2tT
mnBIG7pHxU3HbnUdA+yDbvvfvkoP6Lc5XWCQsn8SNjDv2gPkNrYRbxaRjgOykTiQ
ZHEEU+JYwzyOtw6tbuOOUfcH4BqKhVc0YwZrDDKHOXAo0PgGcuxoE8EAKZptV3lz
XyFZjtfw5KvulRmwjuMydu0Alg5qo8cpyCSFCyxRQlWjyiPwOI3w7ixLpZFpQGMQ
bmVrgLKB/XdgPnmXj7K/6KD2YU2FxZjCFdbGdDUY6E/cBAHD/7sHjGV6CXJ72ZkO
oGWhLgkRk/Dy9doysm6DwCiLS7K/cddUkZcFKvxzBdmOaTt+jlB2tXKDvRAJIwrm
GiEx2LlKjbbgoTrV+rjuFFgVhsHualxP52NsvujQZVpeFtomZ/amk3ceOMTFTkab
QJcb/zOWjG+PrtiQ6BR/Te0kl44S2L3AR5AOCVD13k1nEOZ1yHyCtti04xM7JavP
Jy+RSUmIt7hSD9A0e4nHHXEhPZnGgG8ekVrR6FEQ+0FbvYLpv05Ir+igQSMftZwA
YdBjA16KeJL4jKAOWzVe5tdA0BQcJvPjzPK97N6HkCrbcmSy7mQAsXCZ7BcInwwa
UD8zOeH8Ii8atzy+YM+bQRoRfQLkzpJ3pVe68ZwqKFHl+YQNlh0sCJ3slihLKKVR
mUXutpa2c385Yb9djLifKaSdPYG3rutmdx7HY1JzYvvkIau+ixiO1H6dETI8tLZC
4l1FTSisGt4LZyH3WgPpQzhiWs0KX9yIQ/0lqRhgEL8zqqDm3jo/jIQdFMVfHBlI
YSKjoySUN3GXk8MfBsxxgbJRNwfcdiuB5qcsAxYkNVJgczHScEoM5NoatlHVlbyV
Ymu8j7BqNZ5a1W/YYadEV2prdQeAUOTX8yGVq14MU/5X6uTZyCj9fQ==
-----END RSA PRIVATE KEY-----
Детали могут отличаться, но первая и последняя строчки почти всегда имеют вид
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
либо
-----BEGIN DSA PRIVATE KEY-----
-----END DSA PRIVATE KEY-----
Если вы пытаетесь использовать для Putty ключ в формате OpenSSH, то вам необходимо его сконвертировать. Без преобразования формата файла Putty не будет правильно распознавать ваш закрытый ключ.

Вот как выглядит закрытый ключ для Putty:

PuTTY-User-Key-File-2: ssh-rsa
Encryption: aes256-cbc
Comment: rsa-key-20130610
Public-Lines: 6
AAAAB3NzaC1yc2EAAAABJQAAAQB7+dgXYGyYpkhymcDPzH1vD+ERuwodip3gZdp5
KQmmk0Ahu1WdIZuGIGnXv2TcuvaNzY/VVCXK2wzVSzOtywfvsIW+IMeFD4t4P0C1
UNvOSepfgp/NSDRZUcocVLB9PFByiaL19ghY39ReX5XAqzCMLGGKM/TDsdiX6q6j
xb7hytTZOlt/sHnK49RYO7ZqmYKqfYXh+T2tBR2TahFUIIYQuW2pR1ABDLxGwGvw
L3T2laIT5Lt3//6ioCT0jlIkBuVii1hlm2quiyqogDs1U1ihOGL0wKNvhpds4Hfd
wyRCjU1WJkZGGrLkdtvlg4AQhM7J8FVrYhTNZe90GJZXjnJP
Private-Lines: 14
Xp4pdSAaE8Ftj9Va68OgwyTtO1V75m7cLmSHJSxzVaQCpw8zzn2gPeFnl/7fuusN
Q1cZ8uDdpzI5E2+iEtM5hSn4SoOfH5eyhSa+FYObxj2IN+ylwS4vIbPmj7pY4Mom
BGvxPdgZzKSITblxiE6YSFCNq4CmTIjtg/OXU5/slw7oifdEPcvPDudaGtztmv4a
zSMPO9tvgrk1C5hzY5FfDoKpZHK94mgyjypHt7NEAbEls7GQCn7qTsng2Au2xeu/
l5ZDmb52zu/iLYb2JALnz+h5qyE2XFHsVjwyY+rzxstEWgkgCZdCrbOexHrgIlyc
sKr7H3c3pJ7ZsVsXFvoWLVRcFhq/8Sa7rTr7ONkaUBPUiF00fdp2UiC3bI5U9FlQ
MRhXKEfogEdJDZdWvGibHyX2on8PkJzDZCuQaG/K6pm92VHhv8AYMs4ADfrUVg6k
Y7A5q+sDtXM1QAiL/Qct1Hr8uAp8sLfKYsnBSc1teTHdIjugEjfOn8zMR96vgFEi
bXWcA8o4WROMJ42f9Dy3hTsg7kf4ZcGmY8ua3deYABu3KuAttUNTshAF5qfPGjEk
gR53PoPgLzA1IeYIgX9w9INHQgfolsWguuTb5i1UdXKnk7SwXxmyl1o9F3DSRGu9
pl7bKLQGjrDcaLyxavUyZoHb1zwiDoGBJ4pefC1e1LKJ6OUiWXCWcUsTIeuj9q+L
eEr4RWr59A/11jGvbrTi2Qjxp71aqHmQjsiXonT/bl6Xydb3zS8e4AmJJifxu179
EgfXBPePYarjX6PPivt6uURnRDyTVU6jXJl4ddIudtpUpY14M4BekA4MZ9m2PMsx
S5syWlWFvfPIoHMLpdDWV/D2kimvamcEbbCxK0uI9VlVHNmTotI49OYt0XaHrZGS
Private-MAC: 464d517a6c7b61184a4f7f1ec2ad4f33c1b15294
Характерными особенностями данного формата является первая строка вида
PuTTY-User-Key-File-2: ssh-rsa
вслед за которой довольно часто следуют строки вида
Encryption: aes256-cbc
Comment: rsa-key-20130610
Если вы пытаетесь использовать на Unix-системах ключ в формате Putty, то вам необходимо его сконвертировать. Без преобразования формата файла OpenSSH не будет правильно распознавать ваш закрытый ключ.

Ваши пароли и SSH-ключи

Ваши пароли и закрытые части SSH-ключей не нужно показывать или передавать никому. Вообще никому, даже если вас об этом просит служба поддержки или администратор, с которым вы переписываетесь или разговариваете по телефону. Любой, кто спрашивает вас о вашем пароле – это человек, который пытается методами социальной инженерии вытащить из вас секретные сведения и пробраться на наш кластер. Исключений – нет, пожалуйста, запомните это.

Также не нужно давать ваш пароль и/или SSH-ключ вашим коллегам, близким, и, вообще, кому бы то ни было. Если кто-то хочет получить доступ на наш кластер, то он должен заполнить заявку (см. раздел Регистрация пользователей, Шаг 4), и мы ее обязательно рассмотрим.

При необходимости замены или добавления SSH-ключа следует обратиться в нашу службу поддержки – написать письмо по адресу «help[AT]computing~dot~kiae~dot~ru» и приложить открытую часть нового ключа.
Не следует пытаться самостоятельно изменить открытый ключ на login-узле.

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

Установленное ПО

По поводу того, как настраивается окружение для разработки, написано в разделе настройка рабочего окружения.

Компиляторы

Библиотеки MPI

Доступные файловые системы

При проведении расчётов используется файловая система Lustre.
На кластере HPC2 для размещения домашних каталогов пользователей и групповых каталогов используется файловая система NFS.

Параллельная файловая система Lustre

У каждого из наших суперкомпьютеров есть своя, доступная только ему, параллельная файловая система, основанная на Lustre.
Она доступна как с login-узла этого суперкомпьютера, так и с узлов его вычислительного поля, и должна использоваться для хранения временных данных расчётов и программного обеспечения.

В файлах сценариев запуска задач необходимо использовать пути к каталогам в файловой системе Lustre (для кластера HPC2 путь должен начинаться с /s/ls2, для HPC4 – с /s/ls4).

Мы не используем квоты на Lustre (чтобы не препятствовать исполнению задач, промежуточные файлы которых занимают большое пространство).
Поэтому, пожалуйста, будьте разумны в плане занимаемого на Lustre места, и удаляйте, либо переносите на другие хранилища все файлы, которые более не требуются для проведения ваших будущих расчётов.

Ниже описаны особенности работы с файловыми системами для каждого кластера.

Кластер HPC2

Домашняя файловая система на NFS

При входе на кластер HPC2 вы попадаете в свой домашний каталог /home/users/$USER. Домашние каталоги пользователей на данном кластере располагаются не в параллельной файловой системе, а в файловой системе NFS.

Эти каталоги доступны только с login-узла, вычислительное поле их не видит. Кроме пользовательских каталогов доступны, также, и групповые каталоги. Они именуются как /home/groups/gABCD, и доступны для чтения и записи всем членам указанной группы.

На NFS установлены групповые квоты для полного пространства, которое занимают как индивидуальные пользовательские каталоги, так и групповой каталог. Квоты ставятся в соответствии с вашими заявками при регистрации группы, при необходимости они могут быть несколько расширены. По вопросам расширения нужно обращаться в нашу службу поддержки («help[AT]computing~dot~kiae~dot~ru»).

Использование NFS для размещения домашних каталогов пользователей и групп позволяет уменьшить нагрузку на относительно медленную и ограниченную по ёмкости параллельную файловую систему кластера HPC2. Технически NFS располагается на нескольких независимых серверах и домашний каталог каждого из пользователей находится на конкретном сервере. Это означает, что при проблемах с одним NFS-сервером пострадают все пользователи с домашними каталогами, расположенными на нём, но другие пользователи будут иметь возможность продолжать работу.

Доступ к файловой системе Lustre

Для кластера HPC2 путь к файловой системе Lustre начинается с /s/ls2/.

Организация каталогов на Lustre на кластере HPC2 сходна с организацией каталогов в домашней файловой системе на NFS, доступны следующие каталоги:

Эти каталоги предназначены для хранения временных данных в процессе вычислений.

Для хранения более постоянных объектов (например, программного обеспечения, каких-то вспомогательных данных, которые часто используются для многих вычислительных задач, и т.п.) предусмотрены каталоги со следующими именами:

Обмен данными между NFS и Lustre

Для запуска программы на счёт нужно разместить саму программу и исходные данные для расчёта в параллельной файловой системе Lustre. Там же окажутся файлы с результатами ваших расчётов. Предполагается, что вы будете копировать ваши данные между NFS и Lustre вручную (командами cp, rsync и другими).

В принципе, вы можете работать непосредственно на Lustre, но, поскольку она используется для хранения данных, к которым обращается значительная часть вычислительного поля, вы можете испытывать проблемы со скоростью работы с файлами: у вас будет долго работать команда ls, файлы в редакторе также будут долго открываться и сохраняться. Поэтому вам, скорее всего, будет значительно удобнее использовать Lustre и домашнюю файловую систему на NFS по их назначению.

Кластер HPC4

Для кластера HPC4 путь к файловой системе Lustre начинается с /s/ls4/.

При входе на кластер HPC4 вы попадаете в свой домашний каталог. Домашние каталоги пользователей /home/users/$USER на данном кластере являются символическими ссылками на каталоги /s/ls4/users/$USER в параллельной файловой системе Lustre.

Файловая система Lustre кластера HPC4 более производительная и имеет больший объём по сравнению с системой Lustre кластера HPC2, поэтому использование NFS для размещения домашних каталогов пользователей и групп не требуется.

Кроме пользовательских каталогов на кластере HPC4 при необходимости могут быть созданы групповые каталоги: /s/ls4/groups/gABCD.

Резервное копирование данных

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

Настройка программного окружения

В связи с тем, что на кластере могут использоваться различные комбинации установленного программного обеспечения, у нас используется несложная система настройки программного окружения для каждого пользователя. Называется она modules.

Например, чтобы воспользоваться компиляторами от Intel, выполните команду:

module load intel-compilers
Чтобы скомпилировать параллельную задачу с использованием библиотеки MPI, выполните:
module load mpi
Всё это можно сделать одной командой:
module load intel-compilers mpi

Следующая команда позволяет узнать, какие пакеты имеются в системе:

module avail
Следующая команда выдает список уже используемых в данном сеансе модулей:
module list

Более подробную информацию о системе «modules» можно узнать, запустив команду man module.

Для настройки пользовательского окружения на login-узле вполне достаточно поместить в файл ~/.bash_profile следующую строку:

module load mpi intel-compilers
Эта строка говорит о том, что пользователь будет использовать библиотеки MPI (mpi) и компиляторы Intel C/C++ и Intel Fortran (intel-compilers). Естественно, не обязательно использовать именно эти конкретные инструменты, указанная строка является лишь примером.

В сценариях запуска для задач нужно указывать те же строки, что и в ~/.bash_profile. В разделе про запуск задач будут приведены соответствующие примеры.

На кластере HPC4 библиотека MPI входит в состав модулей «intel-compilers» и «intel-parallel-studio».

Запуск задач

Запуск задач осуществляется командой sbatch. Совсем подробную документацию можно посмотреть командой man sbatch, здесь будет рассмотрена только базовая функциональность.

Запуск простого сценария

Важно: batch-система умеет запускать только сценарии, поэтому не пытайтесь вместо сценариев запустить исполняемый файл: чаще всего из этого ничего не выйдет.

Самый простой пример: пусть мы хотим запустить на выполнение сценарий test.sh, находящийся в текущем каталоге и содержащий следующие строчки:

#!/bin/sh
#SBATCH -D /s/ls2/users/eygene
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -t 01:00:00
#SBATCH -p hpc2-16g-3d
hostname
df
date
sleep 10
date
Этот сценарий должен быть сделан исполняемым:
chmod +x test.sh

Запускаем сценарий на выполнение командой sbatch test.sh;

$ sbatch test.sh
sbatch: Submitted batch job 19
В ответ нам выдали идентификатор нашей задачи в очереди – 19.

Пользуясь этим идентификатором мы можем, например, узнать текущий статус нашей задачи:

$ squeue -j 19
  JOBID PARTITION       NAME     USER  ST       TIME  NODES NODELIST(REASON)
     19 hpc2-16g-3d  test.sh   eygene  PD       0:00      2 (JobHeld)
В данном случае задача пока не была запущена. Вот как выглядит состояние запущенной задачи:
  JOBID PARTITION        NAME     USER  ST       TIME  NODES NODELIST(REASON)
     19 hpc2-16g-3d   test.sh   eygene   R       0:01      2 n[29-30]
Значение различных полей таблицы должны быть достаточно понятны.

Командой scancel можно удалить задачу из очереди: scancel 19.

После успешного завершения нашей задачи в каталоге /s/ls2/users/eygene, из которого задача запускалась образуются файлы 19.out и 19.err. В них было записано содержимое потоков стандартного вывода и стандартной ошибки вашей программы. Файлы будут находиться в каталоге /s/ls2/users/eygene, поскольку в сценарии мы написали

#SBATCH -D /s/ls2/users/eygene
что заставляет Slurm при запуске задания переходить в указанный каталог. Этот каталог должен существовать и находиться на параллельной файловой системе Lustre, поскольку задание выполняется на рабочих узлах, которые из файловых систем видят только параллельную (см. раздел «Доступные файловые системы»). Если указанный в сценарии каталог отсутствует в файловой системе, задача завершается без сообщений об ошибках и без создания файлов *.out и *.err.

Файлы будут называться 19.out и 19.err, поскольку мы указали следующее:

#SBATCH -o %j.out
#SBATCH -e %j.err
В этих директивах «%j» заменяется на идентификатор задачи, все остальное – оставляется как есть.

Директива

#SBATCH -t 01:00:00
указывает на максимальное время выполнения данной задачи (в данном случае – один час). Если вы можете более-менее точно оценить верхнюю границу этого времени, пожалуйста, указывайте ее: это позволит планировщику более разумно планировать задачи. Однако вы должны понимать, что если ваша задача будет «убита», если время ее выполнения превысит указанное. Поэтому максимальное время выполнения лучше указывать с небольшим запасом.

Директива

#SBATCH -p hpc2-16g-3d
указывает, что мы хотим запустить задачу в очередь «hpc2-16g-3d». Чтобы понять, какую очередь нужно использовать для ваших нужд, пожалуйста, обратитесь к разделу «Список очередей и политика их использования»

Кстати говоря, вышеприведенные строчки вполне эквивалентны передаче утилите sbatch параметров командной строки «-o . -e .». И это работает для любых параметров sbatch, не только для указанных.

Запуск одиночной задачи

Запускать сценарии – это очень здорово, но чаще приходится запускать уже откомпилированные программы, подавать им на вход какие-то файлы и забирать результаты, которые сохраняются в другие файлы.

Но всё это несложно: передать программе любые аргументы можно из сценария, поэтому остаётся только вопрос копирования файлов на машину (с машины), где задача будет выполняться. Но это не проблема: на нашем кластере используется разделяемая файловая система, поэтому все узлы кластера видят одно файловое пространство. Поэтому вы спокойно можете запускать вашу задачу из любого каталога на login-узле – нижеприведенный сценарий запуска позаботится о том, чтобы задача «увидела» все те же файлы, которые есть в этом каталоге.

Вот какой файл сценария нужно использовать:

#!/bin/sh
#SBATCH -D /s/ls2/users/eygene/my-precious-task
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -t 01:00:00
#SBATCH -p hpc2-16g-3d

module load intel-compilers

`pwd`/program mytask.in | tee mytask.log."$SLURM_JOBID"
Здесь предполагается, что запускаемая программа называется “program” и она принимает на вход один аргумент – имя входного файла; в нашем случае “mytask.in”.

Конструкция “| tee mytask.log."$SLURM_JOBID"” применяется для того, чтобы весь вывод программы перенаправлялся в файл с именем “mytask.log.идентификатор_задачи”. Для программ, которые выдают результаты своей работы на экран это удобно, поскольку можно контролировать работу программы просматривая содержимое указанного файла. Если ваша программа ничего не выводит на экран, то эту конструкцию можно опустить, оставив только “`pwd`/program mytask.in”.

Запуск параллельной задачи

Предполагается, что вы ознакомились с разделом запуск одиночной задачи. Материал этого раздела лишь дополняет рассказанное там.

Как рассказывалось в разделе настройка программного окружения, в сценарии запуска задачи окружение должно настраиваться точно так же, как и в файле ~/.bash_profile. Будем предполагать, что вы используете следующие директивы команды module load: mpi и intel-compilers. Поэтому первым отличием сценария запуска MPI-задачи является наличие строк

module load mpi intel-compilers
Строго говоря, по-сравнению со сценарием для одиночной задачи тут появляется только загрузка модуля «mpi».

Следующим отличием является добавление еще одной строчки вида «#SBATCH …»:

#SBATCH -n 100
Эта директива говорит о том, что вам нужно 100 ядер.

Последней модификацией в сценарии является добавление слова “$MPIRUN” в начало команды запуска задачи.

Собирая всё вместе, мы получаем следующий сценарий запуска задачи:

#!/bin/sh
#SBATCH -D /s/ls2/users/eygene/my-precious-task
#SBATCH -n 100
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -t 01:00:00
#SBATCH -p hpc2-16g-3d

module load mpi intel-compilers

$MPIRUN `pwd`/program mytask.in | tee mytask.log."$SLURM_JOBID"

Использование контейнеров

Внимание!
Мы предоставляем пользователям возможность использования контейнеров только на кластере HPC4 и только в очередях с CentOS 7
(*-el7-* и hpc5-v100-3d).

Использование технологии контейнеризации предоставляет пользователям новые возможности.
Контейнер создаёт для задач пользователя требуемую среду (образ ОС, необходимое пользователю ПО определённых версий). Это, в частности, позволяет избавиться от установки пользовательского ПО непосредственно на кластер.
В результате упрощается добавление нового ПО, обеспечивается переносимость вычислений, появляется возможность фиксировать версии ПО для воспроизводимости результатов.

На кластере HPC4 используется контейнерная платформа Apptainer версии 1.2 (см. руководство пользователя: Apptainer User Guide).

Образы контейнеров Apptainer сохраняются в виде файлов в формате *.sif. Для запуска ПО необходимо сохранить образ контейнера в системе хранения кластера.

Создание контейнеров

Существует несколько вариантов создания файла образа контейнера.

  1. Загрузить готовый образ из репозитория Docker: $ apptainer build alpine.sif docker://alpine.

  2. Собрать образ контейнера на login-узле ui4-el7.computing.kiae.ru на основе файла со сценарием сборки. В таком файле указывается базовый образ контейнера, набор команд по установке и настройке ПО, а также команды запуска ПО по умолчанию.

    Пример файла:

    Bootstrap: docker
    From: ubuntu:20.04
    %post
        apt-get -y update
        apt-get -y install cowsay lolcat
    %environment
        export LC_ALL=C
        export PATH=/usr/games:$PATH

    %runscript date | cowsay | lolcat

    Команда для сборки контейнера:

    $ apptainer build lolcow.sif lolcow.def
    

    Здесь Bootstrap – тип базового образа контейнера. Для локального файла – Bootstrap: localimage.

    Поле From – имя базового образа.

    Секция %post – набор команд для установки ПО в образ контейнера.

    Секция %environment – определение переменных окружения.

    Секция %runscript – команда для запуска ПО внутри контейнера.

  3. Собрать контейнер в формате *.sif на другом сервере или персональном компьютере и скопировать его на кластер.

Запуск контейнеров

Команда для запуска ПО в контейнере имеет следующий вид:

apptainer exec {опции-контейнера} {путь-к-контейнеру.sif} {исполняемый-файл} {опции-командной-строки}

Пример команды запуска:

$ apptainer exec lolcow.sif cowsay moo
 _____
< moo >
 -----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Аргументы после имени файла образа будут распознаны как путь к исполняемому файлу и его опции командной строки. Если их не указывать, будет запущен исполняемый файл с опциями по умолчанию, которые указаны в образе контейнера.

Также доступна команда run, она позволяет передать опции командной строки, но использует исполняемый файл по умолчанию:

apptainer run {опции-контейнера} {путь-к-контейнеру.sif} {опции-командной-строки}

Команда shell позволяет начать интерактивную сессию внутри контейнера:

apptainer shell {опции-контейнера} {путь-к-контейнеру.sif}

Опции контейнера определяют параметры взаимодействия с операционной системой кластера. Здесь настраиваются связи между каталогами и переменные окружения.

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

По умолчанию к контейнерам Apptainer подключается следующие каталоги: домашний каталог пользователя, каталог для временных файлов и набор служебных каталогов операционной системы. Для подключения дополнительных каталогов существует опция --bind, -B в формате --bind {каталог-на-кластере:каталог-в-контейнере}.

Пример использования:

$ ls /data
bar  foo
$ apptainer exec --bind /data:/mnt my_container.sif ls /mnt
bar  foo

По умолчанию в контейнере определены все переменные окружения, определенные для пользователя в операционной системе кластера, плюс переменные окружения, указанные в файле контейнера. Переменные окружения из операционной системы кластера можно не передавать, указав опцию --cleanenv.

Можно указать дополнительные переменные окружения с помощью опции --env ИМЯ=Значение.

Пример использования:

$ apptainer run --env MSG=Hello\ HPC alpine.sif sh -c 'echo $MSG'
Hello HPC

Запуск ПО с использованием MPI

Apptainer совместим с библиотеками MPI для многопроцессорных вычислений. Из-за особенностей MPI, для запуска необходимо использовать команду mpirun, установленную в операционной системе кластера.

Пример запуска:

$ mpirun -n 8 apptainer run hybrid-mpich.sif /opt/mpitest

При этом внутри контейнера должны быть доступны библиотеки MPI, совместимые с mpirun, используемым для запуска.
Рассмотрим два способа достижения этой цели.

  1. Первый способ предполагает создание образа контейнера, включающего совместимые версии библиотек MPI. На кластере доступен базовый образ OpenMPI 4.1.0, который можно использовать для сборки новых контейнеров с его поддержкой: /s/ls4/sw/apptainer/openmpi-4.1.0.sif Его можно использовать вместе с соответствующим модулем openmpi/4.1.0.

    Пример файла сборки образа:

    Bootstrap: localimage
    From: /s/ls4/sw/apptainer/openmpi-4.1.0.sif
    %files
        mpitest.c /opt
    %post
        export OMPI_DIR=/opt/ompi
        export OMPI_DIR=/opt/ompi
        export PATH=$OMPI_DIR/bin:$PATH
        export LD_LIBRARY_PATH=$OMPI_DIR/lib:$LD_LIBRARY_PATH
        export MANPATH=$OMPI_DIR/share/man:$MANPATH
        echo "Compiling the MPI application..."
        cd /opt && mpicc -o mpitest mpitest.c
    %runscript
        /opt/mpitest
    

    Сборка образа:

    $ apptainer build mpitest.sif mpitest.def
    

    Запуск:

    $ srun -p hpc5-el7-3d -n 4 --pty bash
    $ module load openmpi/4.1.0
    $ mpirun apptainer run mpitest.sif
    Hello, I am rank 0/4
    Hello, I am rank 1/4
    Hello, I am rank 2/4
    Hello, I am rank 3/4
    
  2. Второй способ предполагает подключение библиотек MPI из операционной системы кластера, в этом случае не нужно включать их в образ контейнера. Необходимо знать местоположение библиотек MPI и подключить их к контейнеру так, чтобы приложение смогло их найти при запуске. Кроме того, приложение в контейнере должно быть совместимо с версией MPI библиотек на кластере.

    Пример файла сборки образа:

    Bootstrap: docker
    From: ubuntu:22.04
    %files
        mpitest /opt
    %environment
        export PATH="$OMPI_DIR/bin:$PATH"
        export LD_LIBRARY_PATH="$OMPI_DIR/lib:$LD_LIBRARY_PATH"
    %runscript
        /opt/mpitest
    

    Сборка образа:

    $ apptainer build mpitest-bind.sif mpitest-bind.def
    

    Запуск:

    $ srun -p hpc5-el7-3d -n 4 --pty bash
    $ module load openmpi/4.1.0
    $ export OMPI_DIR=/s/ls4/sw/openmpi/4.1.0
    $ export IB_DIR=/s/ls4/sw/ucx/1.9.0
    $ mpirun apptainer run --bind $OMPI_DIR --bind $IB_DIR mpitest-bind.sif
    Hello, I am rank 0/4
    Hello, I am rank 1/4
    Hello, I am rank 2/4
    Hello, I am rank 3/4
    

    Опция --bind $OMPI_DIR подключает каталог с библиотеками OpenMPI.

    Опция --bind $IB_DIR подключает каталог с дополнительными библиотеками, необходимыми для поддержки InfiniBand.

    Примеры основаны на документации по использованию MPI для Apptainer, см. раздел Apptainer and MPI applications.

Запуск ПО с использованием GPU

Apptainer поддерживает работу с графическими ускорителями NVIDIA Tesla K80 и NVIDIA Tesla V100, используемыми на кластере HPC4.
Для запуска контейнера с поддержкой GPU достаточно добавить ключ --nv к опциям контейнера.

При сборке образа контейнера важно подготовить версии исполняемых файлов, совместимые с GPU на кластере.
Для NVIDIA CUDA нужно указать требуемые версии CUDA Compute Capability.
Для K80 – версия 3.7, для V100 – версия 7.0.
Например, при компиляции с помощью nvcc необходимо добавить ключи:

$ nvcc x.cu -gencode arch=compute_37,code=sm_37 -gencode arch=compute_70,code=sm_70

На кластере доступны образы контейнеров NGC для библиотек PyTorch (/s/ls4/sw/apptainer/tensorflow_21.10-tf1-py3.sif) и Tensorflow (/s/ls4/sw/apptainer/pytorch_21.10-py3.sif)

Список очередей и политика их использования

При выборе очереди для запуска вашей задачи следует иметь в виду следующее:

Из этого следуют следующие рекомендации:

Кластер HPC2

В настоящее время пользователи могут запускать задачи в следующих очередях:

ОчередьНазначениеМакс. время выполнения задачиКоличество узловПримечание
hpc2-debug-10mОтладка10 минут1Пользователь может запустить лишь 1 задачу
hpc2-16g-3dСчёт3 суток1170
hpc2-16g-1wСчёт7 суток
hpc2-16g-1mСчёт31 суткиДоступ по согласованию

Пояснения к таблице

Кластер HPC4

В настоящее время пользователи могут запускать задачи в следующих счётных очередях:

Login-узелОперационная
система
Очередь Тип узла Hyper-Threading Ядер CPU на узел Ядер GPU на узел Макс. время
выполнения задачи
(суток)
Количество
узлов
Примечание
ui4.computing.kiae.ru CentOS 6 hpc4-3d n1 Да 48 Нет 3 241
hpc4-1w 7 Доступ по согласованию
hpc5-gpu-3d g2 Нет 16 4 3 132
hpc5-gpu-1w 7 Доступ по согласованию
hpc5-3d Не используется 3
hpc5-2w 14 Доступ по согласованию
ui4-el7.computing.kiae.ru CentOS 7 hpc4-el7-3d n2 Да 56 Нет 3 60
hpc4-el7-gpu-3d g1 Да 48 6 19
hpc5-el7-gpu-3d g2 Нет 16 4 10
hpc5-el7-3d Не используется
hpc5-v100-3d g3 Да 40 4 1 Доступ по согласованию

Пояснения к таблице

Ограничения ресурсов в очередях

Кластер HPC2

Во всех очередях кластера HPC2 действуют ограничения на размер виртуальной памяти для одного процесса. Эти пределы работают так, что если вы пытаетесь распределить памяти в сумме больше установленного предела, системные функции распределения памяти вернут нулевой указатель. Что с этим делать – решает сама задача, никто ее принудительно не убивает: задача

Текущие ограничения на виртуальную память: 1,945,600 Кбайт виртуальной памяти на процесс.

Кластер HPC4

На HPC4 в настоящее время ограничений на системные ресурсы нет.

Упоминание в публикациях

По условию использования ресурсов ЦКП руководитель группы и пользователи должны в публикациях результатов, полученных с использованием ресурсов ЦКП, ссылаться на ЦКП.
Подробная инструкция по данной теме помещена в документе Декларация сотрудничества.

Иногда задаваемые вопросы

Как узнать, на каких узлах выполнялась программа

Список узлов содержится в переменной окружения SLURM_JOB_NODELIST. Значением этой переменной может быть, например «n[14,26-29]». Это означает, что задача выполнялась на узлах n14, n26, n27, n28 и n29.

Поэтому простейшим из способов сохранить эти данные в выводе вашей задачи будет добавление следующей строчки в сценарий запуска задачи:

echo "CPU list: $SLURM_JOB_NODELIST"
Строчку можно добавить, например, после директив «module load».

Каким образом распределяются физические машины для каждой задачи

Чтобы различные пользовательские задачи не могли «отъесть» память друг у друга, каждой задаче выделяются свои физические машины. Скажем, запросив 20 ядер, вы получите 3 физических узла, на которых вам будет выделено 8+8+4 ядер (если каждый узел оснащен восемью процессорными ядрами). Никого больше на эти узлы, пока вы на них считаете, не пустят. Из этого следуют две вещи:

  1. Количество процессов лучше выбирать кратным количеству ядер на узлах.
  2. Иногда может быть так, что количество занятых всеми задачами ядер не равно полному количеству ядер в кластере, но тем не менее, все запускаемые задачи встают в очередь: для них просто может не быть свободных физических машин.

Как получить образ памяти (core dump) для программ, скомпилированных с помощью Intel Fortran.

Образ памяти иногда необходим для анализа ошибок в программе. По-умолчанию, для всех ошибок «severe» в Intel Fortran образ памяти на диск не сбрасывается. Если вам нужно получить этот образ, то нужно установить переменную окружения decfort_dump_flag в значение «y»:

export decfort_dump_flag=y

Скорее всего вы также захотите получать некоторую информацию об именах функций, номерах строк в исходных файлах и тому подобном. Для этого нужно скомпилировать отладочный образ вашей программы. Это можно сделать, указав при компиляции и компоновке флаг '-g', оповещающий инструментарий о том, что в исполняемый файл требуется включить отладочную информацию.

Кстати говоря, для Intel Fortran отладочный образ имеет еще одно свойство: при возникновении системных ошибок на экран выдаётся информация о последовательности вызова процедур, в которой будут присутствовать имена переменных, процедур и исходных файлов. Без использования отладочного образа, на месте перечисленных имен будет стоять грустное слово «Unknown».

У меня не работает самая простая MPI-программа на Fortran. Спасите!

Есть очень простая программа, которая выглядит так:

       program mpi_probe
        include 'mpif.h'
        integer :: irank,isize,ierr
        call MPI_INIT(ierr)
        call MPI_COMM_RANK(MPI_COMM_WORLD,irank,ierr)
        call MPI_COMM_SIZE(MPI_COMM_WORLD,isize,ierr)
        print *,'irank isize',irank,isize
        call MPI_FINALIZE(ierr)
        end

Программа запускается, но сразу валится в segmentation fault со следующей диагностикой:

forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image              PC                Routine            Line        Source

libc.so.6          000000358F72E2B0  Unknown               Unknown  Unknown
libmpi.so.1        0000002A95755D7B  Unknown               Unknown  Unknown
libmpi.so.1        0000002A9575EE08  Unknown               Unknown  Unknown
a.out              0000000000402CFB  Unknown               Unknown  Unknown
a.out              0000000000402CA2  Unknown               Unknown  Unknown
libc.so.6          000000358F71C3FB  Unknown               Unknown  Unknown
a.out              0000000000402BEA  Unknown               Unknown  Unknown

Причин этому, конечно, может быть целая куча. Но одна из самых часто встречающихся ошибок следующая: у пользователя в том же каталоге, в котором компилируется программа, есть файл mpif.h. Причем файл этот, скорее всего, не от HP-MPI (или от HP-MPI, но другой версии). Поэтому не совпадают прототипы функций, типы переменных и, вообще, все плохо.

Мораль: таскать за собой какой-то mpif.h не нужно, даже если вы знаете, что он от нашей версии HP-MPI (чего вы знать не можете, поскольку версия иногда меняется). В системе уже есть mpif.h и он идет в комплекте с библиотекой HP-MPI. Более того, он автоматически берется из правильного места, если компилятор видит инструкцию «include 'mpif.h'». Поэтому об mpif.h заботиться не нужно. Более того, таскать этот файл за своей программой не только совершенно бессмысленно, но даже и вредно: система найдет этот заголовочный файл сама, поскольку данный файл является системным, принадлежит конкретной версии конкретной библиотеки MPI и ни в коем случае не является частью вашей программы.

Статические массивы размером более 2GB в Intel Fortran.

Если при компоновке вашей программы возникают сообщения следующего сорта

/tmp/ifort0ivMR0.o(.text+0xda): In function `output_t_':
: relocation truncated to fit: R_X86_64_PC32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x18a): In function `output_t_':
: relocation truncated to fit: R_X86_64_PC32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x18f): In function `output_t_':
: relocation truncated to fit: R_X86_64_32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x386): In function `output_t_':
: relocation truncated to fit: R_X86_64_PC32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x46d): In function `output_t_':
: relocation truncated to fit: R_X86_64_PC32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x472): In function `output_t_':
: relocation truncated to fit: R_X86_64_32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x59a): In function `output_t_':
: relocation truncated to fit: R_X86_64_32 eos_par_mp_dens_
/tmp/ifort0ivMR0.o(.text+0x5cd): In function `output_t_':
: relocation truncated to fit: R_X86_64_PC32 eos_par_mp_dens_
/tmp/ifortwpWEfe.o(.text+0xc): In function `pm_':
: relocation truncated to fit: R_X86_64_PC32 tabhad_
/tmp/ifortwpWEfe.o(.text+0x5e): In function `pm_':
: relocation truncated to fit: R_X86_64_32S tabhad_
/tmp/ifortwpWEfe.o(.text+0x6a): In function `pm_':
: additional relocation overflows omitted from the output
то, скорее всего, у вас используются статические массивы размером более 2GB. Чтобы такие программы правильно собирались, к ключам компилятора на стадии сборки самой программы нужно добавить параметры «-mcmodel medium -shared-intel».

Еще одним вариантом является использование ключа «-mcmodel large», но этот ключ для большинства программ не нужен, и приводит только к увеличению их размера. Подробности можно узнать на техническом форуме Intel.

Как заставить работать FTP в Midnight Commander.

По-умолчанию, в Midnight Commander FTP работает в активном режиме. Настройки нашего кластера не позволяют работать в данном режиме, поэтому нужно попросить Midnight Commander использовать пассивный режим. Это очень просто: открываем файл «.mc/ini», ищем там раздел «[Midnight-Commander]» и добавляем туда строчку

ftpfs_use_passive_connections=1
Если переменная «ftpfs_use_passive_connections» уже была определена, то заменяем её значение на единичку, как показано выше.

В результате, файл «.mc/ini» будет выглядеть так (многоточиями отмечены пропущенные строчки, не имеющие отношения к нашей проблеме):

…
[Midnight-Commander]
…
ftpfs_use_passive_connections=1
…

Sbatch выдает сообщение «No partition specified or system default partition»

Такое сообщение возникает, когда вы не указали очередь, в которую хотите запустить свою задачу. Это нужно делать ключом командной строки «-p имя_очереди» или директивой SBATCH в файле сценария запуска:

#SBATCH -p имя_очереди

При компиляции программ на языке Fortran компилятором Intel выдается предупреждение о функции feupdateenv

При компиляции программ на Fortran компилятор фирмы Intel может выдавать следующее предупреждение:

/opt/intel/ifc/9/lib/libimf.so: warning: warning: feupdateenv is not
implemented and will always fail
Это всего лишь предупреждение и оно не влияет на нормальную работу программ. Вот объяснение от компании Intel, находящееся в заметках к компилятору Intel C/C++ 9.x:
In some earlier versions of Intel C++ Compiler, applications built
for Intel EM64T linked by default to the dynamic (shared object)
version of libimf, even though other libraries were linked statically.
In the current version, libimf is linked statically unless -i-dynamic
is used. This matches the behavior on IA-32 systems. You should use
-i-dynamic to specify the dynamic Intel libraries if you are linking
against shared objects built by Intel compilers.

A side effect of this change is that users may see the following
message from the linker:

warning: feupdateenv is not implemented and will always fail

This warning is due to a mismatch of library types and can be
ignored. The warning will not appear if -i-dynamic is used.

Я поместил в .bash_profile «module load …», но при заходе на машину выдается сообщение об ошибке

Файл ~/.bash_profile в редакторе vi выглядит следующим образом:

module load openmpi intel-compilers
~
~
~
".bash_profile" [dos] 2L, 54C
При заходе на кластер выдается сообщение об ошибках:
: No such file or directory
-bash: module: command not found
Причина проста: файл .bash_profile был создан в DOS/Windows и затем был перенесен в Unix. Это видно по наличию символов «[dos]» в строке статуса редактора vi. Нужно отметить, что реальное содержимое файла ~/.bash_profile особенного значения не имеет – важно то, что сам файл был создан в DOS/Windows, поскольку именно это приводит к ошибкам.

Решение проблемы простое: нужно перекодировать файл из DOS/Windows в Unix-кодировку. Для этого достаточно набрать команду «dos2unix имя_файла», которая перекодирует указаный файл из кодировки DOS (CP866) в кодировку Unix (KOI8-R). В нашем случае нужно дать команду «dos2unix ~/.bash_profile».

Программа на языке Fortran завершается, говоря «MPI_ERR_TYPE: invalid datatype»

Скорее всего, в вашей программе не объявлены параметры MPI_REAL, MPI_INTEGER и другие, отвечающие за тип передаваемых данных при приеме/пересылке. Побороть это возможно включением инструкции "include 'mpif.h'" в вашу программу. Естественно, причина может быть еще более простой: вы указали неправильный (или незарегистрированный) тип данных MPI.

Обратите, пожалуйста, внимание, что в программе следующего вида

      program main
      include 'mpif.h'

      print *, "m = ", mpi_real
      call test
      end

      subroutine test
      print *, "m-test = ", mpi_real
      end
значение переменной «mpi_real» внутри подпроцедуры «test» не будет совпадать с (правильным) значением «mpi_real» внутри «main». Причина проста: область видимости «правильной» mpi_real ограничена программой «main». Если хочется использовать «mpi_real» внутри подпроцедуры «test», то нужно написать так:
      program main
      include 'mpif.h'

      print *, "m = ", mpi_real
      call test
      end

      subroutine test
      include 'mpif.h'
      print *, "m-test = ", mpi_real
      end

Работа с кириллическим текстом

На login-узлах кластеров по умолчанию настроена кодировка KOI8-R. Поэтому, если ваша клиентская программа понимает кириллические кодировки, достаточно указать ей данную кодировку и вы получите возможность работать с родным языком ;))

Другой возможной проблемой является то, что файлы, которые вы копируете на login-узлы кластера, могут быть в кириллических кодировках, отличных от KOI8-R. Но это поправимо: на login-узлах установлена программа «iconv», которая умеет преобразовывать файлы из любых кодировок в любые. Например, команда

iconv -f cp866 -t koi8-r infile > outfile
преобразует файл infile из кодировки DOS (CP866) в кодировоку KOI8-R и сохранит результат в файл outfile (который не должен совпадать с входным файлом, иначе вы уничтожите ваш входной файл). Если нужно преобразовать файл, пришедший в Windows-кодировке, то используйте ключ -f cp1251.

Странные падения программ на Fortran

Иногда бывает так, что программы, полностью или частично написанные на Fortran, валятся в segmentation fault без видимой причины. Если посмотреть на проблему в отладчике, то будет видно очень странное: точное место, где все заканчивается – это машинная инструкция «call».

Очень часто эта проблема возникает потому, что у программы заканчивается стек: некоторые авторы программ на Fortran любят делать большие локальные массивы в подпроцедурах и не использовать для этого динамическую память. Однако, разработчики Intel Fortran уже об этом подумали и сделали ключ компилятора «-heap-arrays». Он перемещает все локальные массивы в динамическую память, значительно облегчая нагрузку на стек.

Попробуйте, может быть, этот ключ спасёт вас от падений программы.

Хочется использовать больше памяти, чем есть на ядро

Бывают параллельные задачи, которым не хватает памяти, скажем, из расчета 1 GB/ядро и вычислительные процессы задачи организованы так, что каждый из них потребляет примерно одинаковое количество памяти. Понятно, что если таких процессов на рабочем узле живет столько, сколько есть ядер, то дело плохо.

Один из вариантов решения проблемы – сказать Slurm, что мы хотим выделять не одно ядро под процесс, а несколько. Для этого есть директива

#SBATCH --cpus-per-task N
где N – это как раз число ядер, выделяемых для каждого процесса.

Эффективно это приведет к тому, что каждому из процессов будет доступно не менее чем N*k GB оперативной памяти на машинах с k GB/ядро.

Задача сразу завершается не оставляя сообщений об ошибках

Данная проблема чаще всего возникает, когда в файле сценария указан неверный путь к рабочему каталогу:

#SBATCH -D /s/ls2/users/eygene/my-precious-task
Проверьте, что каталог находится в файловой системе Lustre (путь начинается с /s/), что путь указан верно и у вас есть доступ к указанному каталогу.

В моём каталоге появились странные файлы core.*

Файлы core.* образуются тогда, когда ваша программа обращается к недопустимой области памяти или делает ещё какую-то некорректную операцию; операционная система это ловит и завершает программу аварийно, тем не менее, давая возможность программисту или пользователю попробовать разобраться, что именно она пыталась сделать.

Задача не начинает расчет, а висит со статусом PD, AssocGrpCpuLimit

Данный статус говорит о том, что задача упирается в ограничение количества одновременно используемых ядер для вашей группы. Обычно ограничение составляет 2048 ядер на группу. Важно, что при одновременном использовании в сценарии команд

#SBATCH -n N
и
#SBATCH --cpus-per-task M
сценарий занимает N*M ядер. Сумма занятых ядер по всем запущенным задачам участников группы не должна превышать установленное ограничение.