Настройте инструмент управления рабочим процессом для воссоздания моделей через равные промежутки времени в течение 13 минут.

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

Непрерывное обучение особенно важно для обновления моделей. Предположим, вас наняли специалистом по обработке данных в производственную компанию, которая производит гантели, такие как Nautilus. Ваша цель - спрогнозировать выручку и продажи в следующем квартале. С марта 2017 г. по март 2020 г. ваша модель оценивалась с точностью 95% по прогнозу доходов. Однако с марта 2020 года по январь 2021 года точность вашей модели составляла 40%. Что случилось?

Основным событием, произошедшим с марта 2020 года по январь 2021 года, стал коронавирус. Правила карантина заставляли людей оставаться дома и не выходить часто. Энтузиасты фитнеса, которые больше не могли ходить в тренажерный зал, должны были создать свои внутренние тренажерные залы, чтобы не отставать от своего режима упражнений. Nautilus - ведущая компания по производству гантелей и оборудования для домашнего фитнеса, поэтому продажи резко выросли во время пандемии¹. В этом случае модель, созданная вами в 2017 году, сильно занижает объем продаж, прогнозируемый на 2020 год. Это яркий пример того, почему модель необходимо переобучать на недавних и появляющихся текущих данных. Мир движется невероятно быстро, и данные, полученные 3 года назад, могут не применяться к развивающимся данным.

Возможно, вы осознали, что необходимо создать 3 отдельные модели: одну обучить на данных до пандемии (до марта 2020 года), одну обучить на данных во время пандемии (март 2020 года - май 2021 года), а одну обучить на данных после пандемии (май 2021-настоящее время). Однако у вас может не быть роскоши четко разделить набор данных на определенные периоды времени. Поскольку вы можете делать предположения о дате начала и окончания пандемии (например, предполагая, что конец пандемии наступит, когда вакцины начнутся), вы точно знаете, где разделить набор данных.

Различные наборы данных могут незначительно изменяться с течением времени, и вам нужно будет применить подход непрерывного обучения, чтобы ваша модель могла учиться с представлением новой информации. Эти данные отражают как динамическую среду, в которой были собраны данные, так и форму и формат, в которых они предоставляются. В качестве примера последней эволюции рассмотрим классификатор изображений, который определяет, является ли страница из 1000-страничного PDF-файла текстом или формой. Со временем формат формы изменяется до такой степени, что исходный классификатор изображений распознает его как текст. Поскольку вы не знаете точно, когда формы изменились, вам нужно обучить одну модель на всех текущих данных. Кроме того, классификатор изображений должен быть переобучен на более новых данных формы, отслеживая при этом старые данные формы.

Для переобучения и обновления модели на основе новых данных необходим подход непрерывного обучения. При этом математическая реализация этого подхода для моделей глубокого обучения и рекуррентных нейронных сетей может быть очень сложной. Многие специалисты по данным не обладают знаниями, чтобы создавать такие пользовательские модели в установленные компанией сроки. Однако есть способ имитировать непрерывное обучение с помощью инструмента управления рабочим процессом, такого как Airflow². По расписанию Airflow может получать новые обучающие данные и перестраивать модель, используя предыдущие и новые данные. Затем специалисты по обработке данных могут создавать простые модели (будь то простые нейронные сети PyTorch³, которые они создали сами, или используют ли они существующие библиотеки машинного обучения для Python, такие как scikit-learn), и сосредоточиться на обновлении данные обучения на постоянной основе.

В этой статье будет рассмотрен пример того, как применять непрерывное обучение с помощью Airflow к моделям временных рядов. Наши модели будут использовать ARIMA для анализа исторических данных фондового рынка для двух акций: Fastly и Nautilus.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Это не совет по инвестированию. При этом я владею этими двумя акциями. Так что я склонен продвигать их только для того, чтобы извлечь выгоду. Изучите, прежде чем тратить с трудом заработанные деньги.

Кроме того, ознакомьтесь с дополнительными сведениями о временных рядах, прежде чем вы решите делать прогнозы фондового рынка с помощью ARIMA. Модели временных рядов эффективны, когда в наборе данных есть узнаваемый образец. Я не удосужился проанализировать, подходит ли ARIMA для прогнозирования исторических данных по акциям Fastly и Nautilus. В этой статье обсуждается построение архитектуры непрерывного обучения с точки зрения инженерии данных. ARIMA и временные ряды были использованы, чтобы показать, что эта архитектура может использоваться на различных типах моделей (временные ряды, классификация, нейронные сети). Анализ прогнозных метрик таких моделей временных рядов следует рассматривать вне рамок данной статьи.

Почему Airflow?

Airflow - это инструмент управления рабочим процессом с открытым исходным кодом, написанный на Python. Он стал отраслевым стандартом, и его довольно легко настроить. У Airflow есть недостатки при работе со сложными и динамическими рабочими процессами, и лучше использовать другой инструмент рабочего процесса, например Prefect. В этом руководстве мы создаем простой рабочий процесс. Таким образом, Airflow идеален.

Мы настроим Airflow на AWS EC2. Вы также можете использовать AWS MWAA (Amazon Managed Workflows For Apache Airflow), если хотите. Однако имейте в виду, что AWS MWAA может быть дорогостоящим для бюджетов некоторых разработчиков. Например, с меня взимали 27 долларов в день только за то, чтобы оставить его в рабочем состоянии, и 80 долларов в месяц за использование других облачных сервисов AWS Elastic (например, шлюзов NAT).

Терминология

  • AWS MWAA - рабочие процессы, управляемые Amazon для Apache Airflow. Обрабатывает все настройки и конфигурации для Airflow, но требует больших затрат в обслуживании.
  • AWS EC2 - виртуальный сервер для запуска приложений.
  • AWS S3 - Ковш для хранения маринованных моделей.
  • ARIMA - интегрированная скользящая средняя с авторегрессией. Это класс моделей, который захватывает набор различных стандартных временных структур в данных временных рядов.

Рекомендуемое чтение

В этом руководстве предполагается, что вы имеете базовое представление о Airflow и DAG. Если нет, прочтите Airflow: как и когда использовать.

Чтобы понять архитектуру Airflow, прочтите Обзор архитектуры Apache Airflow.

В этом руководстве для анализа временных рядов используется ARIMA. Эта тема выходит за рамки данной статьи. Если вы хотите лучше понять временные ряды и ARIMA, я рекомендую Введение в Arima: несезонные модели.

Архитектура

Руководство

В этом руководстве мы установим Airflow на Linux Ubuntu Server 20.04 LTS. Мы можем создать образ AWS EC2, используя тип t2.medium. Чтобы узнать больше об AWS EC2, я рекомендую учебник Amazon, доступный здесь.

Airflow должен запускать и веб-сервер, и планировщик, поэтому ему потребуется больше памяти, чем предоставляется на уровне бесплатного пользования. У t2.medium достаточно ресурсов для установки и запуска Airflow.

Мы также используем Ubuntu, потому что это одна из немногих операционных систем Linux, подходящих для машинного обучения. Другие операционные системы Linux (включая AWS Linux) не будут иметь точных пакетов и зависимостей, необходимых для некоторых библиотек машинного обучения, включая Facebook Prophet. У них есть альтернативы этим пакетам, но это не имеет значения, если Facebook Prophet не сможет их правильно скомпилировать. Facebook Prophet требует стандарта C ++, известного как C ++ 14, только для компиляции всех его зависимостей. C ++ 14 поддерживается в Ubuntu (и Mac OS), но не в CentOS или AWS Linux. Ubuntu и MacOS очень полезны для загрузки будущих пакетов машинного обучения и их правильной компиляции.

Создать экземпляр EC2

Войдите в Консоль AWS и перейдите в раздел EC2 ›Экземпляр› Запустить экземпляр. Настройте свой экземпляр так, чтобы он соответствовал приведенному ниже.

ПРИМЕЧАНИЕ. Я удалил свой IP-адрес в разделе "Источник" в группах безопасности. Но чтобы обезопасить свой экземпляр и убедиться, что никто другой не имеет к нему доступа, убедитесь, что вы выбрали My IP вместо Anywhere)

РЕДАКТИРОВАТЬ: В дополнение к этим группам безопасности вы должны ТАКЖЕ добавить HTTP, TCP, порт 8080. Этот порт по умолчанию используется веб-сервером воздушного потока. Вам следует изменить порт, если вы хотите использовать другой порт веб-сервера воздушного потока.

При запуске экземпляра он спросит вас, где скачать файл .pem. Назовите этот airflow_stock.pem и сохраните его в папке по вашему выбору.

Подождите, пока запустится экземпляр EC2, а затем вызовите эту команду на своем локальном терминале.

ssh -i "airflow_stock.pem" [email protected]

SSH - это протокол Secure Shell, который позволяет вам войти в облачный экземпляр из вашей локальной командной строки. Для подтверждения того, что вы можете войти на сервер, нужен файл .pem.

ПРИМЕЧАНИЕ. Если вы получаете сообщение об ошибке Незащищенный закрытый ключ, это означает, что ваш .pem виден всем. Вам просто нужно настроить разрешения для файла .pem. Запустите эту команду перед выполнением

chmod 400 airflow_stock.pem

Подробнее об этой ошибке читайте в статье здесь.

Установите Pip и Airflow

Предполагая, что у вас чистый экземпляр Ubuntu, вам нужно установить и pip, и apache-airflow. Чтобы установить pip, выполните следующие команды

sudo apt update
sudo apt install python3-pip

Мы будем использовать Python 3 для учебника. Чтобы установить apache-airflow, запустите эту команду

pip3 install apache-airflow

Следующим шагом будет создание файлов в рамках проекта Airflow.

Создать структуру папки

Вы можете создать следующие файлы ниже или получить их из репозитория git.

В этой папке есть 4 компонента: сценарий bash для добавления переменных среды воздушного потока (add_airflow_env_variables.sh), текст требований для установки пакетов pip (requirements.txt), сценарий запуска воздушного потока (start_airflow.sh), сценарий остановки воздушного потока (stop_airflow. sh), а также папку dags, которая извлекает данные о запасах и перестраивает модели временных рядов ARIMA из всех данных.

add_airflow_env_variables.sh содержит все переменные среды, которые нам нужно установить перед запуском воздушного потока. На данный момент он просто перечисляет AIRFLOW_HOME, путь, по которому мы храним журналы / выходные данные / базу данных для воздушного потока. Я клонировал репозиторий в свой экземпляр ec2, поэтому я использую путь к файлу из этого репозитория на github.

Файл requirements.txt содержит все необходимые нам пакеты pip.

statsmodels
pandas
pandas_datareader
boto3
awscli

Чтобы установить все пакеты в файле requirements.txt, просто запустите

pip3 install -r requirements.txt

start_airflow.sh содержит все команды для запуска воздушного потока на сервере EC2.

stop_airflow.sh содержит все команды для остановки текущего веб-сервера воздушного потока и планировщика, работающего на сервере EC2.

stock_data_dag.py будет содержать логику для запуска рабочего процесса. Рабочий процесс разбит на две функции: извлечение и загрузка.

Извлечь (get_stock_data) получит все исторические цены акций из TIINGO с 1 января 2015 года до дня срабатывания триггера. Для целей этого руководства этой платформы достаточно. Однако в производственной среде платформе потребуется получать данные только за текущий день и добавлять их к предыдущим историческим данным, хранящимся в S3.

Загрузка (store_arima_model_in_s3) создает модели ARIMA на основе исторических цен акций и сохраняет обработанные файлы в корзине s3. Мы можем получить те новые модели, которые были переобучены на новых обучающих данных.

ПРИМЕЧАНИЕ. Вам потребуется создать учетную запись TIINGO, чтобы получить ключ API, используемый в get_stock_data (строка 25).

Рассматривайте функции Python get_stock_data и store_arima_model_in_s3 как задачи. Чтобы вызывать эти задачи в группе DAG, нам нужно использовать операторы. Операторы - это основные строительные блоки DAG, которые выполняют определенные функции / скрипты / apis / запросы / и т. Д. В этом примере мы создаем 4 разных оператора Python:

  • get_NLS_stock_data
  • store_NLS_arima_model_in_s3
  • get_FSLY_stock_data
  • store_FSLY_arima_model_in_s3

Расписание рабочего процесса отформатировано в crontab: 0 17 * * 1–5. Это означает, что этот рабочий процесс будет запускаться в 17:00 каждый будний день.

В stock_data_dag перечислены две разные задачи для каждой акции: get_stock_data и от store_stock_arima_model до s3. get_stock_data извлекает исторические данные о запасах TIINGO с 1 января 2015 года и сохраняет их в формате JSON. store_stock_arima_model извлекает JSON акций, получает скорректированные цены закрытия для всех дней, строит модель ARIMA на основе этих цен и сохраняет модель ARIMA в корзине S3 под названием stock-model. Затем мы можем загрузить модели из S3 и использовать их для прогнозирования цены на следующий день.

ПРИМЕЧАНИЕ. Эта архитектура предназначена не только для моделей ARIMA. Различные другие модели и алгоритмы skikit-learn, такие как XGBoost, RandomForest, NaiveBayes, LinearRegression, LogisticRegression и SVM, могут извлечь выгоду из этого подхода непрерывного обучения. Вы можете просто повторно использовать функцию store_arima_model_in_s3 файла stock_data_dag.py или напрямую отредактировать python DAG и изменить строку 44 на желаемую модель выбора. Вы даже можете добавить свою собственную логику нейронной сети вместо модели skikit-learn. При этом вам придется переосмыслить, на каких данных вы тренируете свои модели регрессии / классификации. Возможно, вам придется изменить get_stock_data, чтобы получить другой набор данных для вашей модели. Независимо от того, какую бизнес-проблему вы пытаетесь решить, эта архитектура непрерывного обучения Airflow является взаимозаменяемой, чтобы работать в различных сценариях использования.

Теперь у нас есть все файлы, необходимые для вычислений в этом руководстве. Следующим шагом является выполнение определенных сценариев и настройка воздушного потока для запуска.

Создать корзину AWS S3

Мы хотим создать корзину S3 для хранения наших моделей. Перейдите к S3 и создайте новую корзину с именем stock-model. Затем мы настроим учетные данные EC2 aws, чтобы мы могли использовать boto3 для хранения моделей из Airflow в S3.

Настроить AWSCLI

Мы хотим хранить наши модели ARIMA в корзине S3. Для этого нам нужно настроить локальные настройки AWS на экземпляре EC2, чтобы он распознавал нужную учетную запись AWS.

Сначала перейдите на страницу Учетные данные безопасности консоли управления IAM: Консоль управления IAM (amazon.com).

Если вы еще не сделали этого, прокрутите вниз до раздела «Ключи доступа» и нажмите «Создать новый ключ доступа». Это сгенерирует файл Excel, который вы можете загрузить, чтобы получить как ключ доступа, так и секретный ключ доступа. НЕ ПРЕДОСТАВЛЯЙТЕ ДАННЫЙ ФАЙЛ НИКОМУ. В СЛУЧАЕ ДЕЙСТВИЯ ВАШЕГО АККАУНТА AWS БУДУТ РИСКОВАТЬСЯ ВЗЛОМОМ И ВОЗМОЖНЫМ ПЕРЕПОЛНЕНИЕМ.

На EC2 введите

aws configure

AWS запросит у вас ключ доступа и секретный ключ доступа. Поместите туда значения из файла Excel. Вы можете нажать Enter для имени региона по умолчанию и вывода по умолчанию.

Учетные данные AWS теперь настроены на EC2, чтобы вы могли создавать сеансы boto3.

Настроить воздушный поток

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

source add_airflow_env_variables.sh
bash add_airflow_env_variables.sh

Если вы хотите проверить, добавлена ​​ли переменная среды AIRFLOW_HOME, запустите env в командной строке.

Следующим шагом является создание базы данных воздушного потока для хранения прогонов. Если вы создаете базу данных воздушного потока впервые, выполните команду ниже в пути AIRFLOW_HOME.

airflow db init

Вы также захотите добавить пользователя, так как Airflow предложит пользователю войти в систему. Приведенная ниже команда взята из примера из документации Локальный запуск Airflow.

airflow users create \
    --username admin \
    --firstname Peter \
    --lastname Parker \
    --role Admin \
    --email [email protected]

Вам будет предложено ввести пароль по вашему выбору.

Затем установите все пакеты в файле requirements.txt, используя

pip3 install -r requirements.txt

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

bash start_airflow.sh

Это без проблем запустит планировщик воздушного потока и веб-сервер. Чтобы проверить, работает ли пользовательский интерфейс, перейдите по этому URL-адресу.

http://ec2–11–111–111–11.us-east-1.compute.amazonaws.com:8080

ec2–11–111–111–11.us-east-1.compute.amazonaws.com - это выдуманный общедоступный IPv4-адрес Ec2. Вы сможете получить его для своего экземпляра EC2 на вкладке «Подробности» в консоли EC2 - ›Экземпляры. Убедитесь, что вы используете http (НЕ https) и порт 8080 (если вы настроили воздушный поток для использования этого порта, в противном случае используйте любой порт, который вы настроили).

Вы должны увидеть всплывающую страницу входа. Введите учетные данные пользователя, используемые для создания учетной записи в Airflow (имя пользователя: admin, пароль: все, что вы ввели). Теперь вы должны увидеть все перечисленные группы Airflow DAG, в том числе stock_data DAG, которые мы создали ранее.

Нажмите на ярлык stock_data. Затем вы можете увидеть пользовательский интерфейс этого тега в графическом представлении.

В правом углу типа (под расписанием) вы увидите кнопку воспроизведения. Нажатие на эту кнопку вручную запускает DAG. Если все работает, как задумано, все операторы должны быть отмечены зеленым цветом «Успешно». Если есть ошибки (не удалось, можно повторить попытку), щелкните операторов, чтобы просмотреть журналы.

Теперь давайте перейдем к сегменту S3 stock-model и посмотрим, были ли добавлены наши модели.

Если вы оставите EC2 работать на ночь, а планировщик воздушного потока и веб-сервер не будут прерывать работу, вы увидите, что эти две модели в последний раз изменялись примерно 23 июля, 17:00 UTC-05: 00.

Примечание. Обязательно отключите EC2, когда закончите.

Вывод

В этом руководстве объясняется, как построить архитектуру непрерывного обучения с использованием инструмента рабочего процесса для восстановления моделей ARIMA на текущих и новых данных обучения. Мы узнали, как использовать Airflow, чтобы создать эту архитектуру непрерывного обучения для прогнозирования цен закрытия для двух разных акций: Nautilus и Fastly. Мы узнали, как развернуть Airflow на Amazon EC2 и хранить новые модели на S3.

Непрерывное обучение не обязательно предполагает создание повторяющихся нейронных сетей с нуля. Это более простая альтернатива созданию модели непрерывного обучения с использованием популярного инструмента разработки данных. Специалисты по данным начального уровня, которые все еще изучают тонкости нейронных сетей, могут прибегнуть к этому решению, чтобы создать надежную, устойчивую архитектуру для моделей, «обучающихся» на новых данных. Кроме того, эта архитектура может быть воспроизведена с помощью различных алгоритмов: временных рядов, линейной регрессии и алгоритмов классификации. Хотя логику чтения и обучения моделей на данных необходимо изменить, общая архитектура должна учитывать различные бизнес-задачи.

Репозиторий Github: Data-Science-Projects / Medium / Airflow_CL / airflow at master · hd2zm / Data-Science-Projects (github.com)

Ссылки:

1. Наутилус сообщает о скачке продаж на 94%, поскольку пандемия подпитывает тенденцию к домашним упражнениям, Мэтью Киш

2. Apache Airflow - инструмент управления рабочим процессом с открытым исходным кодом

3. PyTorch - платформа машинного обучения с открытым исходным кодом

Если вы не являетесь участником со средним уровнем оплаты, но заинтересованы в подписке на Towards Data Science только для того, чтобы читать подобные руководства и статьи, нажмите здесь, чтобы зарегистрироваться в членстве. Регистрация по этой ссылке означает, что мне платят за направление вас на Medium.