путем создания образа контейнера 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) — широко используемая система управления контейнерами для высокопроизводительных вычислений и научных приложений. Он имеет множество функций, среди которых безопасность, переносимость, распределенная обработка и простота использования. Это также удобно для использования в повседневной жизни практикующего машинного обучения.