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

Singularity (CE)

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

singularity-logoSingularity — контейнерная платформа с открытым исходным кодом, обладающая простотой, быстротой и безопасностью.
Среди множества контейнерных платформ именно Singularity отличается удобством использования в средах высокопроизводительных вычислений (HPC).

Ключевые особенности: 

  • Неизменяемый одновайловый формат образов контейнеров, поддерживающий криптографические подписи и шифрование.
  • Интеграция устройств поверх изоляции, позволяющая нативно использовать GPU, вычислительную сеть и параллельные файловые системы.
  • Мобильность: файл-контенер формата SIF легко подготовить / передать / отправить.
  • Простая и эффективная модель безопасности: пользователь и группа внутри контейнера совпадают с теми, с которыми контейнер был запущен.

    Официальный сайт: https://sylabs.io/
    Github:  https://github.com/sylabs/singularity

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

* 3.9.0 (релиз от 16.11.2021)
* 3.2.0 (релиз от 14.05.2019)
* 2.6.0 (релиз от 04.08.2018)

Модуль может быть подключен следующей командой:

    module load singularity/3.9.0

Работа с контейнерами на суперкомпьютере

Синтаксис

    singularity [опции и/или команды]
Опции:
    -d, --debug отображать в выводе всю детальную информацию максимально подробно
-h, --help вывести справку по команде
-q, --quiet скрывать основной вывод (output)
-s, --silent отображать в выводе только ошибки
-t, --tokenfile string путь к файлу с токеном sylabs для удаленных сборок (по умолчанию находится тут: "/home/<USER>/.singularity/remote.yaml")
-v, --verbose отображать в выводе основную детальную информацию
Основные команды:
    apps список доступных приложений контейнера
build запуск сборки контейнера
cache управление локальным кэшем контейнеров exec выполнить команду в контейнере
help помощь о любой из команд
pull скачать образ контейнера по URI
run запуск контейнера search поиск готовых образов контейнеров в sylabs library
shell запуск контейнера в режиме командной строки
version показать текущую версию singularity

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

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

На логин-сервере можно только:

- выполнять подготовку контейнера (pull, build),

- проверять корректность запуска runscipt и прочее (без вычислительной нагрузки).

Запуск контейнера через очередь ничем не отличается от иных видов задач и может быть произведен с помощью команды sbatch или srun.

Например:

sbatch-скрипт с запуском контейнера run_my_job.sh:

#!/bin/bash
#SBATCH --job-name=singularity       # Название задачи
#SBATCH --time=01:00                 # Максимальное время выполнения
#SBATCH --ntasks=1                   # Количество MPI процессов
#SBATCH --nodes=1                    # Требуемое кол-во узлов
#SBATCH --gpus=2                     # Требуемое кол-во GPU
#SBATCH --cpus-per-task=4            # Требуемое кол-во CPU

module load singularity/3.9.0        # Загрузка модуля
singularity run my_container.sif     # Выполнение расчёта
sbatch run_my_job.sh

или без использользования файла-скрипта: 

module load singularity/3.9.0
sbatch
--job-name=singularity --time=01:00 --ntasks=1 --nodes=1 --gpus=2 --cpus-per-task=4 --wrap='singularity run my_container.sif'

Аналогично в интерактивном режиме (с помощью srun):

module load singularity/3.9.0
srun singularity run my_container.sif

 

Примеры работы с контейнерами

1. Поиск готовых образов контейнеров в sylabs library

    Для примера возьмем образ с программой "lolcow" (генирирующей фразы в командной строке):
   singularity search lolcow | grep sylabsed/examples/
* к основной команде добавлен фильтр "| grep sylabsed/examples/", чтобы отобразить результаты только из профиля sylabsed раздела examples, содеражащего примеры контейнеров

2. Загрузка контейнеров с sylabs library или docker hub

    Контейнеры могут быть загружены как с репозитория контейнеров sylabs

   singularity pull library://sylabsed/examples/lolcow


    так и в формате docker - с docker hub:

   singularity pull docker://godlovedc/lolcow


* в обоих примерах образ будет сохранен в директории выполнения команды под именем lolcow_latest.sif

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

Контейнер может быть запущен несколькими различными способами - это зависит от того, какую цель он выполняет.
* важно: в примерах ниже запуск выполнен на логин-сервере (для проверки контейнера), запуск же контейнеров для вычислений необходимо производить на вычислительных узлах!

3.1. Запуск контейнера с помощью run
Самый распространенный вариант запуска - с помощью команды run. В результате выполнения выполняется run-часть, определенная в run-скрипт контейнера. На примере ранее найденного и загруженного образа lolcow произведем его запуск с помощью run:

   singularity run lolcow_latest.sif



3.2. Запуск команд внутри контейнера с помощью exec
Команда exec позволяет выполнить указанную в следующем аргументе команду внутри контейнера. Для примера, в нашем контейнере lolcow выполним команду cowsay "I'm here":

   singularity exec lolcow_latest.sif cowsay "I'm here"

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

   singularity exec lolcow_latest.sif sh -c "fortune | cowsay | lolcat"


3.3.
 Выполнение команд внутри контейнера с помощью shell
В некоторых случаях необходимо зайти в контейнер и отредактировать файлы внутри него, либо проверить корректность запуска скриптов - это можно сделать с помощью команды shell. По аналогии с п.3.1. и п.3.2.:

  singularity shell lolcow_latest.sif

После чего можно выполнять команды непосредственно внутри контейнера:

 

4. Внесение изменений в контейнер

По умолчанию, все изменения, выполняемые в контейнере, пропадают после его завершения (во многих случаях это может быть в целом Read-only файловая система). Важно: исключение составляет изменение файлов, находящихся в вашей домашней директории (внутри контейнера она также присутствует по пути /home/<user>/) - это одна и та же директория, и все изменения, примененные к ней внутри контенера, являются ее изменениями снаружи!
Для записи данных внутри контейнера необходимо подключать в него необходимые директории, используя ключ --bind:

singularity exec --bind /home/<user>/my_data:/opt/my_data lolcow_latest.sif touch /opt/my_data

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

singularity build --sandbox my_lolcow_sandbox lolcow_latest.sif

Тогда в директории my_lolcow_sandbox будет находиться вся файловая структура контейнера, которую можно будет изменять привычным образом. Также директория может быть использована в качестве контейнера - т.е. можно выполнять аналогичные команды, что и с .sif-файлом. Например:

singularity run my_lolcow_sandbox

В случае, если необходимо собрать песочницу (директорию) в образ контейнера (единый файл с расширением .sif):

singularity build my_lolcow.sif my_lolcow_sandbox/

где my_lolcow.sif - имя создаваемого образа, а my_lolcow_sandbox - директория песочницы, из которой нужно собрать образ.

Для примера изменим строку выполнению по умолчанию (run) для образа lolcow_latest.sif:

1) создаем песочницу:

2) редактируем run-скрипт:

До изменения:

После:

Так мы добавили фразу "Im changed" в начало вывода run-скрипта нашего контейнера.

3) проверяем корректность изменений прямо в песочнице:

Убеждаемся, что фраза "Im changed" появилась в начале вывода.

4) собираем sif-образ из песочницы:

5) проверяем sif-образ:

 

*5. Сборка контейнера с def-файла (по аналогии со сборкой docker-контейнера из docker-файла)

Сборку из .def файлов рекомендуется выполнять на персональном компьютере, после чего загружать готовый образ (.sif) для расчетов на суперкомпьютере. Поскольку процесс сборки требует повышенных прав доступа. Однако, если возможности сборки на ПК нет, можно выполнить сборку на суперкомпьютере с использованием удаленного сервера. В качестве простого решения можно воспользоваться официальным облаком sylabs, которое позволяет бесплатно выполнять сборки контейнеров размером до ~11 гигабайт. 

Для получения доступа к облаку сборки, необходимо пройти быструю регистрацию на https://cloud.sylabs.io/ (sign up в правом углу), после чего создать токен доступа (войти в профиль, в меню выбрать "Access Tokens" и создать новый):

После чего скопировать его:

* токен на скриншоте является примером и не может быть использован

После чего на суперкомпьютере выполнить авторизацию в sylabs cloud:

singularity remote login

* токен необходимо обновлять каждые 30 дней

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


Создадим файл lolcow.def со следующим содержанием:
BootStrap: library
From: ubuntu:16.04

%post
    apt-get -y update
    apt-get -y install fortune cowsay lolcat

%environment
    export LC_ALL=C
    export PATH=/usr/games:$PATH

%runscript
    fortune | cowsay | lolcat

%labels
    Author Test

* подробно о написании .def-файлов: https://sylabs.io/guides/3.9/user-guide/definition_files.html

Теперь выполним сборку образа контейнера на основе данного файла, используя облако sylabs - необходимо добавить флаг --remote после build

singularity build --remote my_lolcow_image.sif lolcow.def






 

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