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

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

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

В этом сообщении блога я рассказываю, как использовать конфигурацию жизненного цикла.

Конфигурация жизненного цикла состоит из двух частей
1. Запуск записной книжки при запуске: используйте nbconvert для запуска нескольких записных книжек Python в экземпляре Sagemaker
2. Остановите записную книжку Sagemaker: используйте auto-stop-idle »Конфигурация, широко доступная в блогах git и AWS. Однако я намерен уловить некоторые нюансы.

Часть 1. Запуск записной книжки при запуске

Некоторые служебные правки в записной книжке, поскольку они не поддерживаются конфигурациями nbconvert и жизненного цикла
1. Удалите все установки пакетов из ячеек записной книжки
2. Удалите matplotlib и все связанные визуализации

Сценарий конфигурации жизненного цикла

set -e
ENVIRONMENT=python3
#Declare all the jupyter notebooks that need to run, within the Sagemaker instance
FILE1="/home/ec2-user/SageMaker/Notebook1.ipynb"
FILE2="/home/ec2-user/SageMaker/Notebook2.ipynb"
FILE3="/home/ec2-user/SageMaker/Notebook3.ipynb"
#Activate python environment. The lifecycle configuration cannot autodetect the environment
source /home/ec2-user/anaconda3/bin/activate "$ENVIRONMENT"
#Install packages here instead of putting them inside the notebooks
pip install --upgrade pip
pip install PyAthena
#Execute the notebook in background
nohup jupyter nbconvert "$FILE1" "$FILE2" "$FILE3" --ExecutePreprocessor.kernel_name=python3 --to notebook --inplace  --ExecutePreprocessor.timeout=7200 --execute &
#Deactivate the python environment
source /home/ec2-user/anaconda3/bin/deactivate

Расшифровка скрипта

nohup

nohup jupyter nbconvert "$FILE1" "$FILE2" "$FILE3" --ExecutePreprocessor.kernel_name=python3 --to notebook --inplace  --ExecutePreprocessor.timeout=7200 --execute &

На выполнение конфигурации жизненного цикла дается 5 минут. Если он не завершается, ноутбук не запускается. Однако использование «nohup» заставляет ноутбук работать в фоновом режиме, в то время как он также запускается в консоли. Если вашему ноутбуку требуется менее 5 минут для работы, не обращайте на это внимания.

nbconvert

nohup jupyter nbconvert "$FILE1" "$FILE2" "$FILE3" --ExecutePreprocessor.kernel_name=python3 --to notebook --inplace  --ExecutePreprocessor.timeout=7200 --execute &

Запускает записную книжку и сохраняет ее в формате HTML, который является форматом вывода по умолчанию для nbconvert. Чтобы запускать записные книжки последовательно, объедините их все в одном nbconvert; однако, чтобы запускать их параллельно, используйте несколько операторов nbconvert.

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

nohup jupyter nbconvert "$FILE1" "$FILE2" "$FILE3" --ExecutePreprocessor.kernel_name=python3 --to notebook --inplace  --ExecutePreprocessor.timeout=7200 --execute &

Обновляет ту же записную книжку после завершения работы с записной книжкой. Если не использовать «inplace», результат будет сохранен в другой копии записной книжки .ipynb.

тайм-аут

nohup jupyter nbconvert "$FILE1" "$FILE2" "$FILE3" --ExecutePreprocessor.kernel_name=python3 --to notebook --inplace  --ExecutePreprocessor.timeout=7200 --execute &

Аргументы, переданные в ExecutePreprocessor, являются параметрами конфигурации, называемыми трейтлетами. Параметр timeout определяет максимальное время (в секундах), в течение которого каждая ячейка записной книжки может запускаться, если выполнение занимает больше времени, будет вызвано исключение. Значение по умолчанию - 30 с, поэтому в случае длительных ячеек вы можете указать более высокое значение. Параметр timeout также может быть установлен на None или -1, чтобы снять любое ограничение на время выполнения.

Для дальнейшей настройки подробная документация по nbconvert доступна онлайн.

Ошибки отладки

1. Отслеживайте журналы в Cloudwatch, щелкнув «Просмотр журналов» по ​​ссылке под настройкой жизненного цикла.

2. Выполните команды в следующем порядке одну за другой в терминале.

$ cd Sagemaker\YourNotebook
$ source /home/ec2-user/anaconda3/bin/activate python3
$ pip install <packages> 
$ jupyter nbconvert TestNotebook.ipynb --ExecutePreprocessor.kernel_name=python3 --to notebook --inplace --execute
$ source /home/ec2-user/anaconda3/bin/deactivate

Часть 2: остановите блокнот Sagemaker

Добавление следующего в конфигурацию жизненного цикла остановит записную книжку по истечении времени, указанного в IDLE_TIME.

IDLE_TIME=7200  # 2 hrs
echo "Fetching the autostop script"
wget https://raw.githubusercontent.com/aws-samples/amazon-sagemaker-notebook-instance-lifecycle-config-samples/master/scripts/auto-stop-idle/autostop.py
echo "Starting the SageMaker autostop script in cron"
(crontab -l 2>/dev/null; echo "*/1 * * * * /usr/bin/python $PWD/autostop.py --time $IDLE_TIME --ignore-connections") | crontab

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

Ошибка недопустимого символа

Вам должно быть интересно, где в вашем коде символы ^ M и / r, которые отображаются в журналах. Это не ваша проблема, это проблема взаимодействия unix / windows, когда новая строка в Windows плохо интерпретируется Unix. Есть несколько способов справиться с этим - используйте редактор кода Visual Studio, используйте блокнот ++ ИЛИ скопируйте код прямо из git.