Постановка проблемы. Развертывайте модели машинного обучения на 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.