Тратьте меньше времени на построение рабочих процессов и больше времени на разработку моделей

Как специалист по данным, одно из моих нелюбимых занятий - установка пакетов и построение рабочих процессов для поддержки моих моделей машинного обучения. Чем быстрее я смогу настроить свою инфраструктуру, тем больше у меня будет времени для исследования данных и разработки моделей. Кроме того, переход с моего Mac на HPC или облако означает больше времени, потраченного на настройку этих множественных инфраструктур. Итак, я был заинтригован тем, как последнее предложение от Amazon под названием Sagemaker может помочь мне быстрее перейти на этапы построения, тестирования и развертывания модели. Пожалуйста, прочтите эту отличную статью, чтобы лучше понять мотивацию sagemaker. Также информативны эти ролики с Amazon. Хотя sagemaker легко начать создавать и развертывать модели, использующие несколько фреймворков глубокого обучения, таких как Keras и PyTorch, становится немного сложно, когда вам нужно установить свои собственные пакеты поверх этих предустановленных фреймворков. Здесь я попытался обобщить один из способов сделать это, прочитав другие отличные сообщения методом проб и ошибок. Надеюсь, это поможет сэкономить ваше время,

В этой статье я попытаюсь рассказать, как я использовал sagemaker для обучения и развертывания модели НЛП, которая требует установки дополнительных пакетов поверх существующей инфраструктуры PyTorch. В частности, я попытаюсь реализовать модель Genomic-ULMFiT для классификации промоторных последовательностей E. Coli, разработанную Karl Heyer. Алгоритм и само приложение здесь не имеют значения, а методологию можно легко распространить на любые модели и приложения. Однако, если вы хотите узнать больше о моделях ULMFiT, прочтите здесь. А если вам интересно узнать больше о промоутерах, читайте здесь. Вкратце, промоторы - это особые биологические последовательности, которые помогают регулировать гены в организме, и синтетическая биология всегда находится в поисках новых промоторов, которые были бы надежнее и лучше, чем встречающиеся в природе промоторы. Один из способов конструирования новых промоторов - использование прогностических моделей, которые могут изучить грамматику промоторов и тем самым помочь нам классифицировать новую последовательность как потенциальный промотор или как непромотор. На этом давайте углубимся в детали использования sagemaker для этого конкретного приложения Genomic-ULMFiT. В частности, мы будем использовать только модель наивной классификации, реализованную здесь. Пусть вас не смущает наивный дескриптор в названии: это все еще сложная модель LSTM с выпадениями :).

В основном машинное обучение состоит из двух этапов: исследование данных / модели и развертывание модели. И sagemaker может помочь на обоих этих этапах. Наиболее удобный фреймворк для первого этапа исследования данных / модели - это Блокноты Jupyter.

Настройка среды Jupyter Notebook в Sagemaker

Модель Genomic-ULMFiT использует fast.ai инфраструктуру API, расширяющую среду PyTorch, немного похожую на Keras для TensorFlow, но с некоторыми важными отличиями. На данный момент в ноутбуках Sagemaker нет предустановленного ядра fast.ai, и нам необходимо это сделать. Модель также полагается на пакет BioPython, который выполняет тяжелую работу с геномными последовательностями. Чтобы предварительно установить эти библиотеки перед запуском записной книжки Jupyter, мы используем Конфигурации жизненного цикла sagemaker. Сценарий конфигурации жизненного цикла (оболочки) позволяет нам устанавливать новые пакеты при создании / запуске экземпляра записной книжки. Скрипты, которые я использую, основаны на этом руководстве от Amazon с некоторыми изменениями. Есть два сценария, которые вы можете использовать как часть конфигурации жизненного цикла: один называется сценарием Создать записную книжку и запускается только при создании записной книжки в первый раз. Любые файлы, созданные сценарием, хранятся в папке / home / ec2-user / SageMaker /, которая сохраняется до тех пор, пока записная книжка не будет удалена. Напротив, папка / home / ec2-user / не сохраняется. Вот сценарий Создать записную книжку, который клонирует репозиторий fast.ai:

#!/bin/bash
set -e
sudo -i -u ec2-user bash << EOF
git clone https://github.com/fastai/fastai.git /home/ec2-user/SageMaker/fastai
mkdir /home/ec2-user/SageMaker/fastai/courses/dl1/data
EOF

Второй сценарий под названием «Запустить записную книжку» будет запускаться каждый раз, когда мы перезагружаем записную книжку. Я хочу создать здесь среду conda для всех своих пакетов и убедиться, что ядро ​​для этой среды добавлено в список доступных ядер для ноутбуков Jupyter:

#!/bin/bash
set -e
echo "Creating fast.ai conda enviornment"
cat > /home/ec2-user/fastai-setup.sh << EOF
#!/bin/bash
cd /home/ec2-user/SageMaker/fastai
conda env update
PYTHON="3.6"
conda create --yes --name ulmfit python="$PYTHON"
echo "Finished creating fast.ai conda environment"
EOF
chown ec2-user:ec2-user /home/ec2-user/fastai-setup.sh
chmod 755 /home/ec2-user/fastai-setup.sh
sudo -i -u ec2-user bash << EOF
echo "Creating fast.ai conda env in background process."
source activate ulmfit
nohup pip install http://download.pytorch.org/whl/cpu/torch-1.0.0-cp36-cp36m-linux_x86_64.whl &
nohup pip install fastai &
nohup pip install biopython &
nohup pip install networkx &
nohup pip install --quiet boto3 &
pip install ipykernel
python -m ipykernel install --user --name ulmfit --display-name "conda_ulmfit"
EOF

Убедитесь, что в приведенном выше скрипте используется «активация источника», а не «активация conda», если вы не хотите тратить пару часов, пытаясь исправить загадочное сообщение об ошибке. Кроме того, команда «nohup install… &» важна для предотвращения появления сообщений об ошибках тайм-аута при запуске экземпляра ноутбука.

Когда у нас будут готовы эти два сценария, давайте создадим экземпляр записной книжки и добавим эту «конфигурацию жизненного цикла» к настройкам. Помимо конфигурации жизненного цикла, вы также можете выбрать хранилище EBS и настройки разрешений. Мы вернемся к роли IAM позже в этом посте. Еще одна приятная особенность экземпляров записных книжек sagemaker - мы можем добавлять к ним репозитории. Например, я добавил в этот блокнот разветвленную ветвь Genomic-ULMFiT Карла Хейера.

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

Лучший способ ИМО использовать sagemaker - использовать ноутбуки для выполнения некоторых легких вычислительных задач, таких как исследование данных и рабочие процессы тестирования. В идеале тяжелая работа по обучению модели должна выполняться путем вызова конечной точки на более «способном» типе экземпляра.

Замечание об экземплярах записных книжек Sagemaker: они также предоставляют удобный способ открыть терминал и делать все полезные вещи, которые вы хотели бы делать в терминале, не покидая jupyter lab.

Настройка среды обучения / развертывания в Sagemaker

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

Чтобы получить хорошее представление обо всех элементах, участвующих в обучении и развертывании моделей машинного обучения с помощью sagemaker, прочтите, пожалуйста, это. Важными частями являются обучающие данные и другие соответствующие данные, расположенные в корзине S3, а также образ докера для обучения и развертывания, хранящийся в Elastic Container Registry (ECR). Общие алгоритмы, модели и фреймворки уже упакованы как часть предварительно созданных контейнеров докеров. Sagemaker неявно обрабатывает эти вызовы за вас. В настоящее время у Sagemaker есть предварительно созданные док-контейнеры для Tensorflow, MXNet, PyTorch и Chainer. Однако, если мы хотим создать собственные рабочие процессы и / или модели, мы должны либо расширить существующий контейнер sagemaker, либо создать свой собственный. Здесь я расширю контейнер PyTorch sagemaker для установки библиотек fast.ai и других пакетов, которые мы указали в сценариях конфигурации жизненного цикла для нашего экземпляра ноутбука.

Расширение существующего контейнера PyTorch Sagemaker

Хорошее руководство о том, почему и как расширить контейнер sagemaker, можно найти здесь. Основным каталогом в контейнере является каталог / opt / ml, который имеет следующую структуру (из: https://docs.aws.amazon.com/sagemaker/latest/dg/amazon-sagemaker-containers.html):

/ opt / ml
├── input
│ ├── config
│ │ ├── hyperparameters.json
│ │ └── resourceConfig.json
│ └── данные
│ └── ‹channel_name›
│ └── ‹входные данные›
├── модель

├── code
│ └── ‹файлы скриптов›

└── вывод
└── сбой

Мы скопируем наши обучающие скрипты в / opt / ml / code, а любые вспомогательные данные - в opt / ml / input. Вот полный файл DockerFile, который я использовал:

# Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
#     http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
# For more information on creating a Dockerfile
# https://docs.docker.com/compose/gettingstarted/#step-2-create-a-dockerfile
# https://github.com/awslabs/amazon-sagemaker-examples/master/advanced_functionality/pytorch_extending_our_containers/pytorch_extending_our_containers.ipynb
# SageMaker PyTorch image
FROM 520713654638.dkr.ecr.us-west-2.amazonaws.com/sagemaker-pytorch:1.0.0-gpu-py3
# RUN pip install http://download.pytorch.org/whl/cpu/torch-1.0.0-cp36-cp36m-linux_x86_64.whl
RUN pip install fastai==1.0.60
RUN pip install biopython
RUN pip install networkx
RUN pip install seaborn
ENV PATH="/opt/ml/code:${PATH}"
# /opt/ml and all subdirectories are utilized by SageMaker, we use the /code subdirectory to store our user code.
COPY  /naive_model /opt/ml/code
RUN mkdir -p /opt/ml/input/supporting_data
COPY  /Data/e_coli /opt/ml/input/supporting_data
# this environment variable is used by the SageMaker PyTorch container to determine our user code directory.
ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code
# this environment variable is used by the SageMaker PyTorch container to determine our program entry point
# for training and serving.
# For more information: https://github.com/aws/sagemaker-pytorch-container
# ENV SAGEMAKER_PROGRAM E_coli_1_Naive_Model.py
ENV SAGEMAKER_PROGRAM E_coli_2_Genomic_Pretraining_Model.py

Строка FROM 520713654638.dkr.ecr.us-west-2.amazonaws.com/sagemaker-pytorch:1.0.0-gpu-py3 вытянет общедоступный образ ECR для PyTorch. Все общедоступные образы ECR находятся под учетной записью: 520713654638. Измените регион и имя контейнера в зависимости от того, какую структуру вы хотите использовать. Мой код извлекает версию изображения PyTorch для графического процессора из региона us-west-2. В других интересных строках приведенного выше кода мы копируем код, содержащий локальные папки, в / opt / ml / code в контейнере, а вспомогательные данные, содержащие локальные папки, в / opt / ml / input / support_data в контейнере. Мы также указываем пару переменных окружения, которые будут определять точки входа для контейнера. В частности, мы будем использовать переменную среды SAGEMAKER_PROGRAM для запуска нашего скрипта.

Как только у нас будет готов DockerFile, нам нужно создать образ и отправить его в ECR. Я использовал сценарий оболочки (запускаемый в блокноте jupyter) ниже, чтобы сделать это, вдохновленный этим постом:

%%sh
# The name of our algorithm
algorithm_name=pytorch-extending-fastai
cd ../../Container
ls
account=$(aws sts get-caller-identity --query Account --output text)
# Get the region defined in the current configuration (default to us-west-2 if none defined)
region=$(aws configure get region)
region=${region:-us-west-2}
fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest"
# If the repository doesn't exist in ECR, create it.
aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1
if [ $? -ne 0 ]
then
    aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null
fi
# Get the login command from ECR and execute it directly
$(aws ecr get-login --region ${region} --no-include-email)
# Get the login command from ECR in order to pull down the SageMaker PyTorch image
$(aws ecr get-login --registry-ids 520713654638 --region ${region} --no-include-email)
# Build the docker image locally with the image name and then push it to ECR
# with the full name.
docker build  -t ${algorithm_name} . --build-arg REGION=${region}
docker tag ${algorithm_name} ${fullname}
docker push ${fullname}

Однако вам нужно будет изменить роль IAM, связанную с вашим экземпляром записной книжки jupyter, прежде чем вы сможете запустить приведенный выше код из записной книжки. Обычно я использую роль IAM, которая дает мне полный доступ. См. Этот пост S tackOverflow о том, как создавать собственные роли IAM, связанные с вашим экземпляром записной книжки. Теперь вы сможете создать собственный контейнер докеров в своем репозитории ECR.

Запуск сценариев с использованием настраиваемого контейнера PyTorch

Теперь, когда у нас есть собственный контейнер в нашем репозитории ECR, мы готовы запустить наш скрипт, который автоматически запустится после запуска контейнера. Однако я особо не упомянул, как писать этот сценарий. Фактически, это может быть любой скрипт Python, включая логический вывод и обучение в одном скрипте. Я сделал это просто и просто включил обучение. Чтобы запустить скрипт python из нашего настраиваемого контейнера, вы можете использовать код, похожий на этот:

role = sagemaker.get_execution_role()
instance_type = 'your_instance_type'
from sagemaker.estimator import Estimator
 naive_estimator = Estimator(image_name='your_container_name',
                         role=role,
                         train_instance_count=1,
                         train_instance_type=instance_type)
naive_estimator.fit('S3 path to your datasets')

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