Создайте локальный конвейер TFX, создайте модель анализа настроений с помощью архитектуры Transformer и обслуживайте модель с помощью TF Serving

1. Введение

В этой статье мы рассмотрим процесс создания конвейера для развертывания модели анализа тональности.

Эта статья является первой из двух частей. В этой части мы расскажем, как запустить наш конвейер локально. Во второй части CI/CD для пайплайнов TFX с Vertex и AI Platform мы расскажем, как сделать нашу модель доступной на Google Cloud Platform (GCP) и как разработать наш пайплайн CI/CD.

К концу этой статьи вы сможете:

  • Создайте модель анализа настроений
  • Создайте конвейер, объединяющий все компоненты
  • Обслуживайте свою модель локально через REST API
  • Проанализируйте метаданные конвейера

Код всего приложения доступен в этом репозитории GitHub.

2. TFX (расширенный TensorFlow) + MLOps

Для построения нашего пайплайна мы будем использовать TFX.

Согласно Руководству пользователя TFX¹, «TFX — это платформа машинного обучения (ML) в масштабах производства Google, основанная на TensorFlow. Он предоставляет структуру конфигурации и общие библиотеки для интеграции общих компонентов, необходимых для определения, запуска и мониторинга вашей системы машинного обучения».

По словам Ди Фанте⁵, в MLOps есть три очень важных понятия:

  • Происхождение данных: откуда берутся ваши данные, как они появились и какие методологии и процессы были отправлены.
  • Происхождение данных: последовательность шагов до достижения конца конвейера.
  • Метаданные: данные, которые описывают данные. Они служат для объяснения характеристик предмета, который мы наблюдаем.

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

3. Конвейер

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

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

3.1 Компоненты

В нашем случае мы решили не использовать компонент InfraValidator. Однако мы решили добавить в наш пайплайн еще один узел — Resolver. Resolver — это специальный узел TFX, который занимается разрешением особых артефактов, в нашем случае он использовался для указания последней базовой модели в компоненте Evaluator.

Внутри run_pipeline.py мы определяем конвейер TFX. Все компоненты и параметры будут находиться в этом файле.

3.1.1 Генерация примеров

Это начальный входной компонент конвейера, который обрабатывает и при необходимости разделяет входной набор данных. Использует файлы из внешних источников, таких как CSV, TFRecord, Avro, Parquet и BigQuery.

3.1.2 Генерация статистики

Вычисляет статистику набора данных.

3.1.3 SchemaGen

Изучите статистику и создайте схему данных.

3.1.4 Пример проверки

Ищет аномалии и пропущенные значения при обучении и доставке данных, например, обнаруживает отклонения данных.

3.1.5 Преобразование

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

3.1.6 Тюнер

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

3.1.7 Тренер

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

3.1.8 Преобразователь

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

3.1.9 Оценщик

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

3.1.10 Толкатель

Развертывает модель в инфраструктуре дисплея. Здесь мы указываем, где будет обслуживаться модель.

Итак, структура нашего приложения такова:

│   run_local_pipe.ipynb
│
├───modules
│   │   label_encoder.pkl
│   │   model.py
│   │   preprocessing.py
│   │
│   ├───best_hyperparameters
│   │       best_hyperparameter.txt
│   │
│   └───data
│           data.csv
│
└───tfx-pipeline
    │   kubeflow_v2_runner.py
    │   local_runner.py
    │
    └───pipeline
        │   configs.py
        │   run_pipeline.py

В каталоге tfx-pipeline у нас есть файлы, относящиеся к настройкам оркестраторов.

  • local_runner.py — определяет параметры и переменные для локального запуска конвейера.
  • kubeflow_v2_runner.py — определяет параметры и переменные для запуска конвейера локально/в облаке с использованием kubeflow в качестве оркестратора.

В tfx-pipeline/pipeline у нас есть файлы, относящиеся к настройкам конвейера.

  • configs.py — определяет глобальные настройки приложения, такие как имя конвейера и путь к файлу.
  • run_pipeline.py — определение конвейера TFX, определение всех компонентов и параметров.

В модулях у нас есть файлы, относящиеся к построению модели.

  • label_encoder.pkl — объект LabelEncoder из sci-kit учится кодировать/декодировать целевую переменную
  • model.py — построение модели классификации (компонент тренера)
  • preprocessing.py — преобразование и предварительная обработка переменных (компонент преобразования)
  • best_hyperparameter.txt — файл, полученный из компонента Tuner, содержащий гиперпараметры модели.

Наконец, с помощью run_local_pipe.ipynb мы можем создавать и запускать наш канал локально, в дополнение к анализу сгенерированных артефактов.

3.2 — Построение модели

Наша модель является адаптацией архитектуры Трансформер². Большим отличием этой архитектуры является введение механизма внимания, который анализирует входную последовательность и предоставляет контекст о важности каждой части последовательности. Таким образом, в отличие от рекуррентных нейронных сетей (RNN), эта архитектура позволяет распараллеливать данные, сокращая время обучения.

Модель была построена с помощью TensorFlow, и цель состоит в том, чтобы классифицировать предложение как положительное, отрицательное или нейтральное, поэтому это модель классификации.

Во время построения пайплайна есть два очень важных компонента: Transform и Trainer. Эти компоненты в нашей архитектуре представлены файлами preprocessing.py и model.py соответственно. Давайте обратимся к каждому из них, чтобы понять обработку переменных и построение нашей модели.

3.2.1 Данные

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

3.2.2 Предварительная обработка

Мы решили выполнить несколько преобразований входных данных. Функция ниже иллюстрирует преобразования входных данных.

Основное внимание уделяется удалению диакритических знаков, специальных символов, цифр и стоп-слов из входных строк.

3.2.3 Модель

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

Я просто хотел бы обсудить 2 важных момента в определении модели: архитектуру и сигнатуры.

Архитектура

Поскольку наша модель представляет собой адаптацию исходной архитектуры, мы решили сделать ее проще.

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

Наконец, мы передаем выходные данные в сеть прямой связи (FFN), простой слой, который помогает преобразовывать векторы внимания в удобоваримую форму между блоками. Мы добавили еще несколько подобных слоев, пока не определили выходной слой, активируемый функцией softmax, которая выводит вектор вероятностей, относящийся к 3 классам целевой переменной.

Таким образом, наша модель строится следующим образом:

Подписи

Делая модели машинного обучения доступными, нам нужно подумать о том, как наша модель будет получать данные для прогнозирования. Модели TensorFlow имеют формат SavedModel, что позволяет нам создавать несколько сигнатур, чтобы определить, как наша модель будет получать данные и делать прогнозы доступными.

Поэтому мы создали подпись, которая принимает ввод в виде строки вместо исходного примера TFX, который ожидает данные в формате tf.train.Example. Выходные данные нашей сигнатуры возвращают вероятности каждого класса, класс с наибольшей вероятностью и значение наибольшей прогнозируемой вероятности.

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

4. Локальное развертывание

Наконец, мы можем запустить наш конвейер. Блокнот run_local_pipe.ipynb был создан для того, чтобы мы могли создавать, запускать и анализировать наш конвейер.

Мы используем TFX-cli для создания конвейера, передавая в качестве аргумента локальный движок и путь к нужному файлу, в данном случае local_runner.py.

И, наконец, мы можем запустить его.

Теперь все наши компоненты будут работать, и наша модель доступна для прогнозов.

5. Обслуживание модели с помощью TensorFlow Serving

Существует несколько способов обслуживания модели для прогнозов, и один из них — TensorFlow Serving.

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

Во-первых, мы определяем, где находится наша модель, и загружаем пакет TF-Serving.

Затем мы запускаем TensorFlow Serving. Здесь мы определяем некоторые важные параметры:

rest_api_port: порт, который вы будете использовать для запросов REST.

имя_модели: вы будете использовать это в URL-адресе запросов REST. Это может быть что угодно.

- model_base_path: это путь к каталогу, в котором вы сохранили свою модель.

5.1 Выполнение запросов REST

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

6. Оцените артефакты воронки

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

Мы можем получить доступ к артефактам, созданным нашим конвейером, через наш репозиторий метаданных. Мы также можем фильтровать определенные типы артефактов, чтобы визуализировать и определить выходные пути этих артефактов.

И из этих артефактов мы можем визуализировать их графически. Давайте посмотрим, например, на результаты StatisticsGen.

Затем мы можем одновременно просматривать статистику данных обучения и проверки.

7. Заключение

Разработка локального конвейера — это первый шаг к интеграции нашего приложения и возможности стандартизировать обучение и вывод нашей модели. Чтобы развивать наш пайплайн, во второй части этой статьи мы разработаем и развернем его в облачной среде, в дополнение к применению методов CI/CD, что сделает его масштабируемым и простым в обслуживании.

8. Ссылки

[1] Руководство пользователя TFX (1 сентября 2021 г.), TensorFlow.

[2] Васвани, А.; Шазир, Н., Пармар, Н.; Ушкорейт, Дж.; Джонс, Л.; Гомес, А.Н.; Кайзер, Л.; Полосухин И. Внимание — это все, что вам нужно. (12 июня 2017 г.), препринт arXiv arXiv:1706.03762.

[3] Нандан, А. Классификация текста с помощью Transformer (10 мая 2020 г.), Keras.

[4] Обслуживание TF (28 января 2021 г.), TensorFlow.

[5] Ди Фанте, А. Л. Как я развернул свою первую модель машинного обучения (15 декабря 2021 г.), Medium.

[6] Амоатенг, Д. Конвейер классификации текста tfx local (1 января 2022 г.), GitHub.