путем создания образа контейнера FAST.AI

Apptainer — это относительно новая система управления контейнерами с открытым исходным кодом для создания и запуска безопасных решений HPC. Ранее он назывался Проект Singularity, который начался как проект с открытым исходным кодом в 2015 году с целью внедрения контейнеров в кластеры высокопроизводительных вычислений и мир научных вычислений.

Я предполагаю, что у вас есть базовые знания о контейнерных технологиях, таких как Docker. Но если вы опытный пользователь Docker, то большинство концепций вы сможете быстро и легко перенести в мир Apptainer.

В программном обеспечении Apptainer есть несколько полезных функций. Вот некоторые из них: переносимость, постоянные оверлейные файловые системы, контейнерное шифрование, исполнение без рута, хорошая поддержка графических процессоров и ПЛИС, а также поддержка распределенных вычислений OpenMPI и MPICH. .

Я хочу сосредоточиться на другом возможном применении Apptainer: прототипировании модели машинного обучения и экспериментировании.

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

Менеджер пакетов Conda или контейнеры Docker могут облегчить некоторые из этих проблем с прототипированием. Однако Conda может не спасти вас от конфликтов пакетов на уровне ОС. Контейнеры Docker не очень подходят для итеративных и интерактивных изменений (скорее для упаковки артефактов окончательной модели). Кроме того, Docker OverlayFS может значительно увеличить производительность ввода-вывода.

Я нашел Apptainer очень удобным, когда мне нужно быстро синхронизировать среду разработки модели (необязательно с данными) между ноутбуком и облачными экземплярами, обучить модель на большом распределенном пуле вычислительных узлов или работать в «подобной виртуальной машине» изолированной среде с машинным обучением. модели.

Установка приложения

Следующая процедура взята из Документации Apptainer и протестирована на Ubuntu 20.04 и Ubuntu 22.04. Вы также можете обратиться к этому сценарию установки за полным списком шагов.

$ lsb_release -a
Distributor ID:    Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:    focal

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

$ sudo apt-get install -y \
   build-essential \
   libseccomp-dev \
   pkg-config \
   squashfs-tools \
   cryptsetup \
   curl wget git

Чтобы скомпилировать и запустить Apptainer, нам нужно, чтобы Go был установлен:

$ export VERSION=1.18.1 OS=linux ARCH=amd64 && wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && sudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz
$ echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc && source ~/.bashrc
$ go version
go version go1.18.1 linux/amd64
$ rm go$VERSION.$OS-$ARCH.tar.gz

Загрузите и установите приложение Apptainer. На момент написания последняя версия Apptainer — 1.0.2, но в этом примере мы продолжим с 1.0.1:

$ export VERSION=1.0.1 &&  wget https://github.com/apptainer/apptainer/releases/download/v${VERSION}/apptainer-${VERSION}.tar.gz && tar -xzf apptainer-${VERSION}.tar.gz && cd apptainer-${VERSION}

После этого шага вы должны оказаться в папке Apptainer. Теперь давайте скомпилируем код Apptainer:

$ ./mconfig && make -C builddir && sudo make -C builddir install
$ apptainer version
1.0.1

Если все шаги выполнены успешно, Apptainer должен быть установлен и готов к использованию.

Контейнер Hello-World

Apptainer полностью совместим с образами Docker, и вы можете использовать практически любой образ Docker в качестве базового образа для разработки контейнеров Apptainer.

Давайте используем официальный образ Docker hello-world, чтобы протестировать нашу настройку Apptainer:

$ cd ~ && mkdir -p apptainer-images
$ apptainer pull docker://hello-world
$ ls -l
 hello-world_latest.sif

При извлечении из центра Docker Apptainer автоматически преобразует изображение в формат Apptainer с расширением SIF. Это расширение относится к Формату изображения Singularity (SIF). Этот формат позволяет создавать и упаковывать контейнеры Apptainer в одном файле, включая заголовки, определение контейнера, неизменяемую среду выполнения и доступное для записи пространство.

Мы можем проверить содержимое SIF-образа контейнера, выполнив команду inspect:

$ apptainer inspect  hello-world_latest.sif

org.label-schema.build-arch: amd64
org.label-schema.build-date: Sunday_8_May_2022_12:23:16_EDT
org.label-schema.schema-version: 1.0
org.label-schema.usage.apptainer.version: 1.0.1
org.label-schema.usage.singularity.deffile.bootstrap: docker
org.label-schema.usage.singularity.deffile.from: hello-world

Вы можете запустить нашу версию контейнера Docker Hello-World для Apptainer следующим образом:

$ apptainer run  hello-world_latest.sif
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Шпаргалка интерфейса командной строки Apptainer

Если вы знакомы с Docker CLI, вы узнаете многие из этих команд. Однако есть несколько различий в терминологии между Apptainer и Docker, на которые стоит обратить внимание. Вы можете ознакомиться с полной справочной документацией по CLI здесь.

Файл определения Apptainer

Файл определения (файл DEF) в Apptainer играет ту же роль, что и Dockerfile для контейнеров Docker.

Типичный файл определения Apptainer состоит из следующих разделов:

  • Bootstrap — позволяет указать базовый образ контейнера и агента для запуска сборки контейнера. Вы даже можете создать контейнер с нуля.
  • %setup — в этом разделе вы можете указать команды для запуска в хост-системе вне контейнера до запуска процесса сборки.
  • %files — позволяет указать файлы для копирования внутри контейнера.
  • %environment — вы можете определить переменные среды, которые будут установлены во время выполнения вашего контейнера.
  • %post — этот раздел позволяет запускать команды во время сборки контейнера. Например, установите пакеты или клонируйте репозиторий git.
  • %runscript — это скрипт, который запускается при запуске контейнера. Например, когда вы вводите команду apptainer run.
  • %startscript — это сценарий, который запускается при запуске контейнера как службы: запуск экземпляра приложения.
  • %test — вы можете выполнять команды в самом конце процесса сборки. Например, для выполнения тестов и проверки успешного построения образа.
  • %labels — в этом разделе вы можете добавить метаданные к вашему контейнеру, т.е. автора изображения, версию и т.д.
  • %help — текст, который будет отображаться для пользователя, когда он выполняет команду apptainer run-help.

Существуют и другие разделы, которые можно определить в файле определения Apptainer. Например, разделы SCIF %app*. Научная файловая система (SCIF) — это стандарт для определения метаданных и макета научной файловой системы. Такой макет облегчает воспроизводимость, возможность обнаружения и тестирование в научных приложениях. Что касается Apptainer, разделы SCIF %app* позволят вам иметь несколько точек входа внутри вашего контейнера. Вы можете найти более подробную информацию о поддержке SCIF в Apptainer в этой документации.

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

Поскольку Apptainer изначально поддерживает графические процессоры, вы можете запускать любые образы NVIDIA NGC или использовать их в качестве базовых образов в файле определения Apptainer.
Например, мы можем запустить образ PyTorch NGC следующим образом:

$ apptainer pull nvidia-pytorch:22.04-py3.sif docker://nvcr.io/nvidia/pytorch:22.04-py3

Чтобы прикрепить ресурсы GPU к вашему контейнеру, мы используем параметр -nv:

$ apptainer run --nv --containall nvidia-pytorch:22.04-py3.sif
Note: by default Apptainer will mount host filesystems available. To prevent that and make container isolated use  --containall option.

Мы можем войти внутрь контейнера и проверить, доступны ли графические процессоры:

Apptainer> python -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'CUDA devices: {torch.cuda.device_count()}')"

PyTorch version: 1.12.0a0+bd13bc6
CUDA devices: 2

Вы можете ознакомиться с более подробным руководством по запуску контейнеров Nvidia NGC в Singularity (теперь Apptainer) в этом сообщении блога.

Создание контейнера для курса FAST.AI с помощью Apptainer

Practical Deep Learning for Coders — популярный МООК-курс наряду с FastBook (Глубокое обучение кодеров с Fastai и Pytorch: приложения AI без докторской степени), опубликованный Jeremy Говард и Сильвен Гуггер.

Этот курс включает в себя экспериментальный подход к изучению глубокого обучения. И, как это часто бывает с экспериментами, мы можем испортить окружающую среду. Один из способов облегчить это — использовать образ контейнера Apptainer, чтобы иметь возможность легко откатывать или поддерживать несколько версий пакетов fast.ai.

В этом примере мы создадим образ контейнера Apptainer, который будет содержать готовую к использованию среду со всем предустановленным: библиотеками ОС, библиотекой fast.ai, блокнотами fastbook и Jupyter.

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

Вот полный файл определения для создания контейнера Apptainer для запуска ноутбуков fast.ai:

Вы также можете клонировать репозиторий GitHub со всеми скриптами для установки Apptainer и сборки образа: https://github.com/tensoralex/apptainer-fastai-container

Пошаговые инструкции:

  • Клонируйте репозиторий со скриптами и файл определения Apptainer:
$ git clone https://github.com/tensoralex/apptainer-fastai-container.git
$ cd apptainer-fastai-container
  • Соберите контейнер:
$ sudo apptainer build fastai-selfcontainer.sif fastai-selfcontainer.def && apptainer overlay create --size 16384 fastai-selfcontainer.sif

Несколько слов о параметрах команды apptainer build:

fastai-selfcontainer.sif — имя целевого образа контейнера. Он будет содержать полный образ + доступную для записи область контейнера для хранения данных. Вы можете перенести этот файл изображения на любой другой хост, на котором установлен Apptainer, и быстро запустить его.

fastai-selfcontainer.def — имя файла определения контейнера, который мы пытаемся создать.

размер 16384 — мы добавим 16 ГБ доступного для записи пространства в образ контейнера. Этого достаточно, чтобы запустить все ноутбуки Jupyter для FastBook.

Извлечение всех зависимостей и создание образа может занять несколько минут.

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

...
Cloning into 'fastbook'...
remote: Enumerating objects: 2477, done.
remote: Total 2477 (delta 0), reused 0 (delta 0), pack-reused 2477
Receiving objects: 100% (2477/2477), 78.29 MiB | 59.78 MiB/s, done.
Resolving deltas: 100% (1566/1566), done.
INFO:    Adding help info
INFO:    Adding labels
INFO:    Adding environment to container
INFO:    Adding startscript
INFO:    Adding runscript
INFO:    Adding testscript
INFO:    Running testscript
Container base is Ubuntu as expected.
INFO:    Creating SIF file...
INFO:    Build complete: fastai-selfcontainer.sif

Теперь мы можем запустить наш контейнер в сервисном режиме:

$ sudo apptainer instance start --nv --dns 8.8.8.8 --net --network bridge --network-args "portmap=7888:8888/tcp" --writable fastai-selfcontainer.sif fastai-selfcontainer-instance
WARNING: nv files may not be bound with --writable
INFO:    instance started successfully

Несколько слов о параметрах, которые мы использовали:

запуск экземпляра apptainer — запуск контейнера в автономном режиме (как службы).

-nv — подключить GPU к контейнеру. Если у вас нет графического процессора, пропустите этот вариант.

-dns 8.8.8.8 — net — сетевой мост — включить сетевое подключение для контейнера и установить сервер разрешения DNS для контейнера.

-network-args «portmap=7888:8888/tcp» — Jupyter автоматически запускается на порту 8888 внутри контейнера, и мы сопоставляем порт контейнера обратно на хосте как 7888.

доступный для записи fastai-selfcontainer.sif — мы указываем имя образа контейнера (файл .sif) и делаем его доступным для записи во время выполнения.

fastai-selfcontainer-instance — вы можете присвоить любое имя вашему запущенному контейнеру.

Вы можете убедиться, что контейнер запущен и работает:

$ sudo apptainer instance list
INSTANCE NAME                    PID        IP            IMAGE
fastai-selfcontainer-instance    3905447    10.22.0.29    fastai-selfcontainer.sif

Чтобы остановить экземпляр контейнера, вы можете запустить:

$ sudo apptainer instance stop fastai-selfcontainer-instance
INFO:    Stopping fastai-selfcontainer-instance instance of fastai-selfcontainer.sif (PID=3905447)

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

Теперь вы можете войти в оболочку внутри контейнера:

$ sudo apptainer shell instance://fastai-selfcontainer-instance
(base) [container] /root $
(base) [container] /root $ cd ~
(base) [container] ~ $ df -hP .
Filesystem      Size  Used Avail Use% Mounted on
overlay          16G   45M   15G   1% /
(base) [container] ~ $ ls
fastbook  miniconda

Папка fastbook автоматически клонируется с https://github.com/fastai/fastbook во время сборки контейнера. Вы можете обновить его в любое время, так как контейнер был запущен как доступный для записи.

Теперь вы можете открыть веб-браузер для доступа к блокноту Jupyter, который работает внутри вашего контейнера: http://localhost:7888

Теперь вы сможете запускать записные книжки fastbook внутри своего контейнера:

Краткое содержание

Apptainer (ранее Singularity) — широко используемая система управления контейнерами для высокопроизводительных вычислений и научных приложений. Он имеет множество функций, среди которых безопасность, переносимость, распределенная обработка и простота использования. Это также удобно для использования в повседневной жизни практикующего машинного обучения.