Как неправильно использовать экземпляры ноутбуков AWS Sagemaker

Я использую Sagemaker в качестве основного разработчика. Среда для создания и развертывания продукта Data Science не менее 2 лет. Работая с людьми с разным уровнем опыта, я заметил множество антипаттернов, которых следует избегать при использовании Sagemaker. В следующем посте я сначала упомяну варианты использования антипаттернов и любые заблуждения, а затем объясню, почему их следует избегать и какова альтернатива. Вот так!

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

Это именно та ситуация, когда вы должны использовать сценарий настройки. Если вы прикрепите сценарий конфигурации один раз к своему экземпляру, каждый раз, когда вы запускаете экземпляр, сценарий конфигурации будет запускаться первым и делать все предварительные настройки доступными для вас. Любую настройку сценария оболочки можно выполнить с помощью сценария конфигурации. Например:

  • Сохраняйте пользовательскую среду Conda в соответствии с вашими потребностями
  • Настройка прокси-сервера, например, защищенная с помощью VPC, подсети и группы безопасности (расширенная тема)
  • Настройка git-репозитория организации для — глобальное имя пользователя и адрес электронной почты

У этого списка нет конца. Я даже пошел дальше и в качестве эксперимента настроил pipenv, поэзию в своих инстансах Sagemaker для задач MLOps.

Вот пример сценария конфигурации жизненного цикла, который сохранит любую вновь созданную среду conda внутри каталога Sagemaker, а также добавит путь поэзии для управления версиями python (скрипт украден из Интернета, я не совсем помню, у кого я его взял. Это был блокпост, позже я сделал некоторое упрощение.):

set -e
PERSISTED_CONDA_DIR="${PERSISTED_CONDA_DIR:-/home/ec2-user/SageMaker/.persisted_conda}"
echo "Setting up persisted conda environments..."
mkdir -p ${PERSISTED_CONDA_DIR} && chown ec2-user:ec2-user ${PERSISTED_CONDA_DIR}
envdirs_clean=$(grep "envs_dirs:" /home/ec2-user/.condarc || echo "clean")
if [[ "${envdirs_clean}" != "clean" ]]; then
    echo 'envs_dirs config already exists in /home/ec2-user/.condarc. No idea what to do. Exiting!'
    exit 1
fi
echo "Adding ${PERSISTED_CONDA_DIR} to list of conda env locations"
cat << EOF >> /home/ec2-user/.condarc
envs_dirs:
  - ${PERSISTED_CONDA_DIR}
  - /home/ec2-user/anaconda3/envs
EOF
echo 'export PATH="$HOME/SageMaker/.poetry/bin:$PATH"' >> /home/ec2-user/.bashrc

Мне нужен экземпляр GPU, потому что я хочу обучить модель глубокого обучения.

Нет, мы не делаем этого здесь! Именно поэтому в Sagemaker существуют задания по обработке и задания по обучению. Вы должны написать свой код таким образом, чтобы он мог работать на процессоре и графическом процессоре, это просто условие If-Else. Затем вам следует разработать конвейер обучения на ЦП и запустить контейнер графического процессора для полномасштабного обучения с любым самым большим экземпляром графического процессора, который вы хотите. Преимущества:

  • Вы будете платить только за то время, которое ваша учебная задача использует GPU.
  • Кластер графического процессора будет автоматически отключен после обучения.
  • Это подталкивает вас уже к написанию кода, близкого к MLOps, поскольку вам нужно организовать свой код таким образом, чтобы окончательная модель из обучения сохранялась в s3. Потому что ничто в контейнере заданий обучения не сохраняется, если вы не сохраните их преднамеренно.
  • Вы не забиваете свой экземпляр Sagemaker гигабайтами данных, так как можете извлекать данные из s3 во время обучения модели в контейнере заданий обучения.
  • Это подталкивает вас к тому, чтобы начать с меньшего количества данных при прототипировании, а затем перейти к полномасштабному обучению с работой по обработке, что является хорошей практикой MPV на деле.

Вот очень простое сравнение цен, основанное на моем личном расчете, если вы запускаете инстанс 24/7 в течение месяца:

# GPU Instances run 24/7
Cost of running p2.large (ec2) instance is 648.0 USD/Month
Cost of running p2.8xlarge (ec2) instance is 5184.0 USD/Month
Cost of running p3.2xlarge instance is 2754.0 USD/Month
# CPU Instances run 24/7
Cost of running ml.t2.large instance is 79.92 USD/Month
Cost of running ml.t2.xlarge instance is 160.56 USD/Month

Цена по US-EAST-1 из официальной документации (Почасовая оплата собрана на 06.05.2022). Как видите, запущенные инстансы с графическим процессором обходятся гораздо дороже, чем инстансы с процессором.

Вот пример определения контейнера Py-torch:

from sagemaker.pytorch import PyTorch
pytorch_estimator = PyTorch(
    'pytorch-train.py',
    instance_type='ml.p3.2xlarge',
    instance_count=1,
    framework_version='1.8.0',
    py_version='py3',
    hyperparameters = {'epochs': 20, 'batch-size': 64, 'learning-rate': 0.1})

Более подробную информацию можно найти здесь". В этом примере тип экземпляра p3 означает экземпляр GPU.

Моего присоединенного тома недостаточно, мне нужно больше места на диске.

Подключенный объем по умолчанию для экземпляра Sagemaker, я думаю, составляет 5 ГБ, что может быть недостаточно, и вам может понадобиться 15 ГБ. Но если вы говорите, что мне нужно 80 ГБ дискового пространства, значит, вы собираетесь провести полномасштабное обучение в своем экземпляре. Вместо этого я должен предложить вам использовать Training Job, перестаньте засорять свой экземпляр большим объемом данных.

Мне нужен лучший экземпляр с большим количеством процессора и оперативной памяти.

Ответ аналогичен: вы должны использовать один из дешевых экземпляров при разработке кода для любого продукта ML. Когда придет время для полномасштабного обучения, вы запустите свой контейнер заданий обработки с высокопроизводительными экземплярами ЦП и ОЗУ. После обучения контейнер будет уничтожен автоматически, и вам не нужно думать об отключении дорогостоящего инстанса.

Вот пример конфигурации контейнера заданий обучения с помощью Scikit-Learn. Но ничто не мешает вам определить свой собственный контейнер с помощью Pytorch или tensorflow. Подробнее об обработке задания можно прочитать здесь.

from sagemaker.sklearn.estimator import SKLearn
sklearn = SKLearn(
    entry_point="train.py", 
    framework_version="0.20.0", 
    instance_type="ml.m5.xlarge", 
    role=<your_sagemaker_role>
)

Как видите, вы можете выбрать любой инстанс для своей работы по обработке или обучению. Посмотрите на веб-сайт со списком цен на Amazon SageMaker, чтобы узнать цены на инстанс, в примере используется инстанс m5 xlarge.

Мне нужна последняя и лучшая версия Python для моего проекта. Поэтому мне нужна среда conda python 10.

Если вы разрабатываете коды для развертывания модели машинного обучения также с помощью Lambda или Sagemaker, у вас могут возникнуть проблемы во время развертывания, если версия Python для Lambda или Sagemaker API не совпадает с версией Python, которую вы использовали во время разработки. Некоторый синтаксис Python 10 недоступен в Python 7 или 8. Поэтому используйте версию Python с умом и выберите версию, совместимую со следующей средой:

  • Версии лямбда Python
  • Задание обработки Sagemaker, версии задания обучения
  • Версии Python API Sagemaker

На момент написания Python 8 поддерживал все сервисы и выглядел хорошо для всех сервисов.

Анти-шаблоны для начинающих:

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

Простое и простое объяснение: любой файл в каталоге `home/ec2-user/Sage maker` сохраняется в Sagemaker, все остальное удаляется после закрытия кластера. Таким образом, ваши git pull и другие данные конфигурации должны быть сохранены в каталоге Sagemaker.

Я зафиксирую свой код позже, надеюсь, он будет в безопасности в моем экземпляре Sagemaker.

Сохранность тома (папки Sagemaker) не гарантируется на 100%. По крайней мере, я не видел никаких подтверждений этому от AWS. Поправьте меня, если я ошибаюсь. Насколько я понимаю, объем 5 ГБ, прикрепленный к sagemaker, представляет собой предоставленный вам объем жесткого диска SSD. Жесткий диск может быть поврежден, и в таких случаях AWS может заменить его новым. Я не совсем уверен, что ваши данные также будут перемещены на новое место на диске. Поэтому ваш код всегда должен быть в git, а ваши данные всегда должны сохраняться в s3.

Есть много других второстепенных антипаттернов, которые я хотел бы игнорировать. Прежде чем закончить, я хотел бы упомянуть еще одно заблуждение, с которым я столкнулся на одном из своих рабочих мест. Существовало мнение, что Sagemaker недостаточно хорош для крупномасштабных тренировок. Итак, специалисты по данным сделали следующее: они предоставили экземпляр ec2 с подключенным к нему графическим процессором, и обычно для любого проекта мы подключаемся к экземпляру по ssh и разрабатываем код для любого проекта. Проблема в:

  • Экземпляр ec2 будет работать 24 часа в сутки, 7 дней в неделю, даже если мы не используем графический процессор во время разработки кода, который стоит больше, чем экземпляр ЦП.
  • Когда кто-то проводит тестовый прогон или полномасштабное обучение, другим приходится ждать освобождения графического процессора.

Что такое Альтернативное решение?

Вы по-прежнему можете использовать дешевый экземпляр ЦП ec2 для разработки кода, а затем у вас может быть роль Sagemaker с прикрепленной необходимой политикой, чтобы вы могли запустить задание обработки, и ваша роль ec2 будет иметь прикрепленную политику, чтобы я мог вызывать/использовать Sagemaker Роль прокси. Таким образом, из вашего дешевого экземпляра ec2 вы можете запустить обучающую работу Sagemaker с GPU как отдельной сущностью. Преимущество:

  • Стоимость будет намного меньше, потому что экземпляр запускается только во время полномасштабного обучения.
  • Никому не нужно ждать, пока другие освободят GPU, поскольку каждое задание будет выделять отдельные экземпляры GPU.
  • Нет необходимости контролировать или паниковать, что инстанс GPU ec2 работает круглосуточно и без выходных.

Надеемся, что этот документ поможет новым пользователям Sagemaker при использовании экземпляра ноутбука и сэкономит организации. Дайте мне знать, если вы обнаружите какую-то ошибку или считаете, что что-то не так в посте.