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

Во время моего исследования, связанного с MLOps и внедрением моделей ML в производство, я видел много общих блогов, связанных с MLOps, но не приводил конкретных примеров. Конечно, один пример не может служить каждому варианту использования, но всегда можно лучше понять/узнать и получить знания из таких примеров, которые можно перенести в другие проекты.

Учитывая сложность развертывания и обслуживания модели машинного обучения в производственной среде, объем проекта не ограничивался разработкой наилучшей модели для задачи, а полной производственной реализацией задачи, которая включает в себя непрерывное обучение, развертывание и интеграцию с использованием лучших Практики MLOps на облачной платформе. Приведенная выше архитектура является окончательным результатом этого проекта.

В этом блоге я вкратце коснусь каждого сегмента архитектуры и погружаюсь глубже там, где это необходимо. Само собой разумеется, что есть несколько способов добиться одинаковых результатов, и этот блог представляет один из них. Этот проект был развернут на Google Cloud Platform (GCP); однако концепцию архитектуры можно легко перенести на других облачных провайдеров, таких как AWS или Azure.

Цели

Проект можно разделить на следующие три этапа:

  1. Основной:
  • Обучите модель глубокого обучения S-O-T-A для чат-бота FAQ на основе данных финансовой области, чтобы получить ближайший ответ на заданный запрос.

2. Промежуточный уровень:

  • Создание чат-бота для часто задаваемых вопросов
  • Непрерывное обучение и мониторинг с использованием лучших практик MLOps
  • Непрерывное развертывание и интеграция сервисов с облачной платформой

3. Предварительно:

  • Сделайте архитектуру воспроизводимой для других данных предметной области, например. его можно легко адаптировать для медицины, образования и т. д.

1. Basic — часто задаваемые вопросы Модель BERT чат-бота

Как упоминалось ранее, цель чат-бота FAQ — получить наиболее близкий ответ из базы знаний на заданный вопрос. Для обслуживания этого бизнес-кейса, связанного с финансами, изначально использовались обучающие данные FiQA-2018:Задача 2 — QA на основе мнений. Эти данные содержали тысячи пар вопросов и ответов, связанных с финансами, просканированных с различных финансовых веб-сайтов.

Чтобы выбрать наилучший подход к разработке FAQ Chatbot, обзор литературы охватывал архитектуру FAQ Chatbot от использования простой разработки функций / формул до Transformer. Учитывая производительность, эффективность и превосходство архитектуры на основе Transformer, различные стратегии обучения/тонкой настройки w.r.t. Были проведены эксперименты с моделями поиска ответов на основе BERT с использованием данных FiQA-2018.

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

В одном из экспериментов для передачи и адаптации к набору данных FiQA-2018 с использованием подхода парного обучения использовалась большая модель BERT, настроенная на наборе данных MS MARCO (извлечение пассажей). Эта модель показала наиболее многообещающие результаты по сравнению с другими моделями, представленными в таблице ниже.

Процесс поиска ответа разделен на два этапа, так как модели преобразователя потребуют очень больших ресурсов и времени для получения наиболее близкого ответа на заданный вопрос из огромной базы знаний. Первый этап поиска, то есть извлечение ответов, выполняется с использованием алгоритма на основе BM25, где документы индексируются с использованием Pyserini в Python, и на этом этапе выбираются 50 лучших ответов-кандидатов на основе запроса пользователя. А затем для повторного ранжирования ответов с использованием показателя достоверности используется доработанная модель на основе BERT. На выходе модели представлены 1–3 наиболее релевантных ответа.

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

2. Средний — непрерывное обучение и обслуживание.

Существуют различные фреймворки и оркестраторы MLOps, такие как TFX, MLFlow, KubeFlow, Airflow и т. д. Некоторые из этих инструментов, таких как TFX и KubeFLow, сложны и требуют очень больших вычислительных ресурсов. Вместо этого я создал пользовательскую настройку, чтобы следовать рекомендациям MLOps по непрерывному созданию и обработке новых данных, постоянному обучению и развертыванию новой модели и постоянному мониторингу результатов, делая результаты экспериментов отслеживаемыми, как показано на изображении ниже.

Вся установка была развернута на Google Cloud Platform (GCP) с использованием учетной записи бесплатного уровня.

2.1 Парсинг данных — Scrapy

Добавление новых данных было выполнено путем удаления данных из сообщения финансового веб-сайта с получением необходимых разрешений. Scrapy, платформа веб-краулера на основе Python, была настроена и развернута на экземпляре GCP для удаления вопросов и ответов с этого веб-сайта. Scrapy будет ежедневно или еженедельно удалять вопросы и ответы и сбрасывать их в структурированную папку на основе даты в сегменте хранилища на GCP, как показано на рисунке ниже.

Здесь question.tsv и answer.tsv содержат удаленные вопросы и ответы, а ques_ans.tsvсодержит сопоставление вопросов и ответов. Папка '2000-01-01' содержит необработанный набор данных FiQA-2018 в файле с табличным разделением. В файле metadata.json хранится последняя информация об обучении модели FAQ Chatbot. Требуется человеческий мониторинг удаленных данных, прежде чем использовать их для переобучения модели чат-бота FAQ и добавления ответов в базу знаний.

Как и исходные данные, модель BERT — MS MARCO, показавшая наилучшие результаты, используется для обучения модели чат-бота FAQ по стратегии «Перенос и адаптация». Эта модель сохраняется в той же корзине Cloud Storage по пути: faqbot_bucket -›faq_model -›model -›pre_trained_model -›bert-msmarco.

2.2 Непрерывное обучение — Воздушный поток

По мере добавления новых данных производительность чат-бота FAQ для получения ответов на основе вновь добавленных данных снижается. Например, если чат-бот часто задаваемых вопросов в основном обучен вопросам-ответам, связанным с банковской деятельностью, то та же модель не будет хорошо работать с вопросами, связанными с инвестициями. Следовательно, при добавлении новых данных необходимо повторное обучение модели, чтобы поддерживать ее высокую производительность и больше обобщать. Для непрерывного обучения пакет тренера-оценщика Pytorch был докеризирован и помещен в реестр контейнеров Google Cloud с использованием конвейера CD/CI — GitHub Actions. Это изображение позже используется Vertex AI для запуска тонкой настройки чат-бота FAQ.

Для Airflow настраиваемый образ докера используется для развертывания Airflow с его зависимостями от машины виртуального экземпляра Google Cloud для экономической эффективности вместо использования «Cloud Composer» — Airflow, управляемого GCP. Разработанный конвейер обучения Airflow выглядит следующим образом.

Основной обязанностью конвейера Airflow является сбор, предварительная обработка, дедупликация и форматирование вновь удаленных данных. На следующих этапах индексы Lucene для этапа получения ответов, обработанные данные (выбранные) — набор данных для обучения, проверки и тестирования для обучения модели повторного ранжирования ответов и обновленная база знаний — коллекция ответов экспортируются в корзину облачного хранилища. .

Конвейер Airflow запускается ежедневно или еженедельно и проверяет наличие значительного объема новых данных, добавленных с момента последнего обучения (для этого используется файл metadata.json ), например. добавлено не менее 200-500 новых пар вопрос-ответ. Только при выполнении условия выполняются все дальнейшие этапы предварительной обработки, генерации и экспорта данных. На последнем этапе конвейера Airflow отправляется обучающее задание на платформу Vertex AI/AI, о чем рассказывается в следующем разделе.

2.3 Непрерывное обучение — Vertex AI/AWS Batch

Чтобы проводить непрерывное обучение в облаке, можно использовать экземпляры виртуальных машин для индивидуального обучения. Однако поддерживать работающую виртуальную машину, когда модель не обучается, становится слишком дорого. Можно написать сценарии для включения и отключения экземпляров ВМ на время обучения, но это усложняет архитектуру. Vertex AI обеспечивает высокую гибкость и масштабируемость благодаря поддержке GPU и TPU. Это позволяет обучать модели с использованием пользовательских изображений с оптимизацией гиперпараметров и упрощает интеграцию со средами CI/CD и выполнение откатов.

Как упоминалось ранее, настраиваемый образ контейнера модуля обучения и оценки модели чат-бота FAQ создается с помощью Docker и передается в реестр контейнеров для службы обучения AI Platform/Vertex AI. С изображением в репозитории облачных контейнеров приведенная ниже команда на последнем этапе Airflow запускает обучение модели, то есть инициирует задание обучения платформы AI.

Здесь набор гиперпараметров получается путем экспериментов и настройки гиперпараметров. В рамках обучения изначально все необходимые входные файлы, такие как файлы обучения, проверки и проверки, загружаются в образ контейнера из облачного хранилища. Кроме того, модель BERT MS MARCO загружается в контейнер в соответствии с переданными аргументами. После обучения и оценки окончательная доработанная модель, результаты оценки, метаданные и т. д. экспортируются в корзину облачного хранилища в формате папки с меткой времени, как показано на рисунке ниже.

Эта настройка также позволяет выполнять точную настройку других предварительно обученных моделей, таких как FinBERT, путем изменения всего одного параметра, т. е. bert_model_name. Затем окончательная доработанная модель экспортируется в папку «finbert» в той же структуре папок, что и на изображении выше. Следовательно, настройка становится очень гибкой для принятия новых стратегий обучения моделей и экспорта точно настроенных моделей и оценок оценки в сегменты облачного хранилища. Та же модель постоянно развертывается и используется API Flask, который обслуживает запросы пользователей.

2.4 Непрерывное развертывание и обслуживание модели — Flask API

Поскольку непрерывное обучение модели успешно настроено, модель чат-бота часто задаваемых вопросов может быть передана через API, где входные параметры передаются модели, а прогнозируемые обработанные результаты возвращаются конечному пользователю. Обслуживание модели осуществляется Flask API. Конечная точка API с методом запроса GET принимает запрос пользователя в качестве входных данных и возвращает top_nнаиболее релевантные ответы вместе с их оценкой вероятности, используя метод воронки, упомянутый ранее. Значение по умолчанию для параметра top_n установлено в файле конфигурации равным 3 и может быть обновлено в соответствии с требованиями.

Это приложение Flask API развернуто на экземпляре виртуальной машины на базе Ubuntu с поддержкой графического процессора. Поскольку Flask не является готовым к работе сервером, поверх службы Flask устанавливается HTTP-сервер Apache, который передает пользовательский запрос в API Flask с использованием протокола WSGI. Экземпляр виртуальной машины Flask API развертывается как часть группы экземпляров в Google Cloud для упрощения масштабирования на основе использования ЦП, и эта группа экземпляров дополнительно подключается к балансировщику нагрузки.

Установка и модель также могут извлекать правильные ответы, для которых вопрос не существовал, как часть обучающих данных вопрос-ответ. Например, в обучающих данных не было вопроса «Что такое производные?» ’, но модель чат-бота с часто задаваемыми вопросами смогла получить правильный ответ из базы знаний на основе этого вопроса, как показано на изображении ниже. Следовательно, создание языковой модели на основе преобразователя здесь очень выгодно.

При каждом успешном запуске конвейера Airflow модель и зависимые файлы должны обновляться в приложении Flask. Простое задание cron настраивается как часть развертывания приложения Flask для непрерывного развертывания последней отлаженной модели чат-бота с часто задаваемыми вопросами, последней базы знаний и обновленного индекса Lucene из предыдущего этапа. Задание cron запускает скрипт Python каждые nминут, который проверяет и сравнивает последнюю модель и связанные файлы в корзине Cloud Storage с теми, которые используются в Flask API.

Предположим, доступна недавно обученная/отлаженная модель чат-бота FAQ, а также обновленная база знаний и индексы Lucene. В этом случае скрипт Python загружает и заменяет текущую модель и связанные файлы последними версиями из корзины Cloud Storage. Таким образом, Flask API всегда использует самые последние модели и файлы, созданные после успешного запуска конвейера Airflow. Это гарантирует непрерывное обучение и развертывание модели FAQ Chatbot BERT в соответствии с лучшими практиками MLOps; следовательно, выполнение одной из основных промежуточных целей, поставленных в начале блога.

2.5 Непрерывная интеграция, доставка и развертывание

В предыдущем разделе основное внимание уделялось развертыванию основных сервисов для реализации сквозного чат-бота финансового помощника, обученного по модели на основе BERT. Также обсуждалось непрерывное обучение и развертывание модели глубокого обучения на основе BERT. Помимо непрерывного обучения/развертывания модели глубокого обучения, необходимо автоматически обновлять образ контейнера модуля инструктора-оценщика модели, API Flask, службы Scrapy и DAG Airflow каждый раз, когда в их код вносятся новые изменения и обновления. .

Поскольку GitHub используется в качестве репозитория кода для всех сервисов, CD/CI этих сервисов выполняется с помощью GitHub Actions. Например, после существенных изменений в модуле часто задаваемых вопросов тренера-оценщика чат-бота создается новый образ, который передается в реестр контейнеров с помощью действий GitHub. Это последнее изображение затем используется AI Platform/Vertex AI для обучения и оценки при запуске конвейером Airflow.

Наряду с непрерывным развертыванием и интеграцией сервисов на экземплярах ВМ Google Cloud были созданы сценарии запуска для автоматического создания и настройки среды для плавного первоначального развертывания и запуска этих сервисов на любом экземпляре ВМ Google Cloud. Это позволяет очень легко масштабировать, заменять или восстанавливать экземпляры виртуальных машин. Пример сценария запуска для автоматического развертывания и инициализации Airflow показан ниже.

GITHUB_ACCESS_TOKEN=$(cat /tmp/github_token.txt)
if [ -z “$GITHUB_ACCESS_TOKEN” ]; then
   echo “github token is empty”
   exit 1
fi
echo “Github access token fetched”
apt-get update > /dev/null 2>&1
python3 –version
apt install python3-pip -y
echo “=============================================================”
echo “Installing Java”
echo “=============================================================”
apt-get install openjdk-11-jdk
echo “=============================================================”
echo “Setting Docker and Docker-compose”
echo “=============================================================”
apt install docker.io -y
docker version
curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose — version
echo “=============================================================”
echo “Setting Gitpull script”
echo “=============================================================”
[ -d “/etc/gitpull” ] && rm -r /etc/gitpull
mkdir /etc/gitpull
gsutil -m rsync -r gs://*********_airflow/gitpull /etc/gitpull
chmod +x /etc/gitpull/pull.sh
echo “=============================================================”
echo “Setting cronjobs”
echo “=============================================================”
cp /etc/gitpull/crontab /etc/crontab
echo “=============================================================”
echo “Cloning repo”
echo “=============================================================”
[ -d “/var/www/airflow” ] && rm -r /var/www/airflow
git clone “https://*********_airflow:${GITHUB_ACCESS_TOKEN}@github.com/****/*********_airflow.git" /var/www/airflow
cd /var/www/airflow
make start-airflow

Настройка Flask API и сервера Apache также выполняется с помощью скрипта запуска. Сценарии запуска и связанные зависимости загружаются в корзину Google Storage, а их расположение указывается при создании шаблона группы экземпляров ВМ. Когда экземпляр виртуальной машины инициализируется, он загружает скрипт из заданного места и выполняет его с правами администратора. GitHub Actions регулярно отправляет эти сценарии запуска и зависимости в папку корзины Google Cloud Storage всякий раз, когда новые изменения вносятся в основную ветвь хранилища сценариев запуска.

3. Повторное использование Advanced-Architecture

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

С изменениями в необработанном наборе данных тонкая настройка модели может быть отвлечена, чтобы заставить модель на основе BERT обучаться и точно настраивать веса на основе необработанного набора данных вопрос-ответ нового домена, а все остальное остается точно таким же. Конвейер непрерывного обучения выполнит предварительную обработку и все этапы, упомянутые в конвейере, а затем использует новые данные для точной настройки модели на основе BERT с помощью стратегии обучения «Перенос и адаптация». После успешного обучения новая модель, база знаний и новые индексы Lucene будут автоматически развернуты и использованы Flask API для обслуживания запроса пользователя. Производительность новой модели можно оценить, поскольку весь процесс остается прежним.

Поскольку новые данные адаптируются к точно настроенной модели, основанной на задаче ранжирования прохождения (MS MARCO), обученная модель, как правило, работает хорошо и не требует изменений в предварительно обученной модели BERT. Однако в случае экспериментов установку можно легко использовать с другими предварительно обученными моделями на основе BERT или Transformer. Результаты обучения и оценки модели сохраняются в корзине облачного хранилища, которую можно использовать для оценки производительности и выбора.

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

Заключение

Я надеюсь, что мне удалось концептуализировать и разработать хороший пример и экономичное комплексное решение, которое можно полностью или частично применить к нескольким вариантам использования машинного обучения. Кроме того, из-за ограничения бесплатного уровня облака используемые службы лучше всего соответствовали этим ограничениям. Я уверен, что таких же результатов можно добиться, используя разные сервисы или аналогичные сервисы в GCP, AWS или Azure.

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

Я не хотел останавливаться после создания лучшей модели SOTA для финансового FAQ Chatbot. Но также хотел реализовать его в облаке, следуя передовым методам MLOps, которые остаются одной из самых сложных частей в области машинного обучения. Поэтому была предпринята попытка реализовать комплексный чат-бот финансового помощника с использованием облачных сервисов.

В настоящее время я исчерпал использование бесплатного уровня, и поэтому настройка на некоторое время отключена. Также через этот блог не удалось углубиться в каждый компонент; однако, если вы хотите узнать больше, вы всегда можете связаться со мной в LinkedIn здесь: Shantanu Ladhwe

Заинтересованы в присоединении к нашей команде? Просмотрите наши открытые вакансии или посмотрите, чем мы занимаемся на HeyJobs.