И развертывание в Google Chrome с помощью FastAPI и Docker.

Недавно я закончил фантастическую новую книгу Обработка естественного языка с помощью трансформеров, написанную несколькими парнями из команды Hugging Face, и был вдохновлен применить некоторые из моих новых знаний в небольшом проекте, основанном на НЛП. В поисках некоторых идей я наткнулся на отличную запись в блоге Тезана Саху, в которой он создал расширение Microsoft Edge для перефразирования текста, выделенного на вашем экране. Я хотел сделать еще один шаг вперед:

  • а) оптимизация вывода модели с помощью среды выполнения ONNX и квантования
  • b) включать такие функции, как суммирование, распознавание объектов имен (NER) и извлечение ключевых слов.

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

TL;DR: Этот репозиторий содержит весь код, упомянутый в этой статье. Материалы ML можно найти в папке src, а материалы расширения Chrome — в папке extension.

Модели

В этом расширении действуют четыре разные модели (и токенизаторы), три из которых были найдены на Hugging Face!

Модель перефразирования T5

Это была самая крупная из использованных моделей — 2,75 ГБ (!), и она была настроена для перефразирования Рамсри Гутамом. T5 – это модель кодировщика-декодера, предварительно обученная на многозадачной смеси неконтролируемых и контролируемых задач, для которой каждая задача преобразуется в формат преобразования текста в текст.

Сначала текст разбивается на предложения с помощью токенизатора предложений NLTK sent_tokenize. Затем каждое предложение пропускалось через модель T5, и перефразированный вывод для каждого предложения объединялся, чтобы получить новый перефразированный абзац.

Некоторый пример вывода:

Конечная проверка ваших знаний — это ваша способность передать их другому =›Ваша способность передавать их от одного к другому — это высшая мера вашего интеллекта.

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

Модель суммирования BART

BART также представляет собой модель кодировщик-декодер (seq2seq) с двунаправленным кодировщиком (например, BERT) и авторегрессионным (например, GPT) декодером. BART предварительно обучается путем (1) искажения текста с помощью произвольной функции шумоподавления и (2) изучения модели для восстановления исходного текста.

Например, недавняя новостная статья длиной в 250 слов о соблюдении правил USB-C в ЕС кратко изложена в 55 словах:

К осени 2024 года все портативные электронные устройства, продаваемые в ЕС, должны будут заряжаться через порт USB Type-C. Цель состоит в том, чтобы уменьшить электронные отходы и сделать их более удобными для потребителей, имея только одно «обычное зарядное устройство». Наибольшее влияние окажут iPhone и iPad от Apple, которые больше не смогут использовать кабели Lightning.

Ух ты! Он отлично сработан и лаконично выделяет все ключевые моменты, изложенные в статье.

Модель DistilBERT NER

Была использована базовая модель DistilBERT без учета оболочки, точно настроенная для NER с использованием набора данных conll03 English. DistilBERT — это модель меньшего размера и более быстрая, чем BERT, которая была предварительно обучена на том же корпусе в режиме самоконтроля с использованием базовой модели BERT в качестве учителя. Модель NER представляет собой просто кодировщик DistilBERT с классификационным заголовком маркера, добавленным в конец для прогнозирования каждого объекта: человека, местоположения, организации и прочего.

В расширении для Chrome результаты NER отображались в HTML с использованием SpaCy. Ниже приведен пример вывода.

Модель извлечения ключевых слов KeyBERT

Эта модель использует встраивание текста BERT и косинусное сходство для поиска подфраз в документе, наиболее похожих на сам документ. Идея состоит в том, что эти подфразы являются наиболее важными фразами в тексте.

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

Ключевые слова и связанные с ними синонимы в предложении «Окончательная проверка ваших знаний — это ваша способность передавать их другому»:

  • Знание: понимание, познание, схватывание
  • Convey: перевозить, перевозить, доставлять

Оптимизация модели

Начальная производительность моделей была нормальной при выполнении логических выводов на графическом процессоре, но очень низкой при работе на центральном процессоре. Даже вывод GPU был не таким быстрым, как хотелось бы, поскольку модели декодера должны последовательно декодировать вывод модели, который нельзя распараллелить. Память также была проблемой, так как я хотел иметь возможность использовать это расширение на устройствах с ограниченными памятью и вычислительными ресурсами (я имею в виду мой древний MacBook Pro 2015 года…), а две модели были старше 1,5. ГБ размером! Моя цель состояла в том, чтобы максимально сократить объем памяти, занимаемой этими моделями, и оптимизировать производительность при выводе ЦП, сохраняя при этом производительность модели.

Квантование и дистилляция – это два метода, обычно используемые для решения проблем с размером и производительностью. Дистилляция уже использовалась с моделью NER, так как DistilBERT представляет собой дистиллированную версию O.G. модель БЕРТ. В моем случае о дистилляции T5/BART не могло быть и речи из-за моих ограниченных вычислительных ресурсов.

Первым шагом, который я предпринял, было преобразование моделей PyTorch в ONNX, открытый формат представления для алгоритмов машинного обучения, что позволяет нам оптимизировать вывод для целевого устройства (в данном случае ЦП). Библиотека Hugging Face Transformer включает инструмент для простого преобразования моделей в ONNX, который использовался для преобразования модели DistilBERT. Преобразование моделей кодер-декодер было немного сложнее, поскольку преобразования seq2seq в настоящее время не поддерживаются конвертером ONNX от Hugging Face. Однако я смог использовать этот фантастический репозиторий GitHub, который преобразует кодировщик и декодер отдельно и заключает две преобразованные модели в класс Seq2SeqLMOutput Hugging Face.

После того, как модели были преобразованы в ONNX, квантование QInt8 использовалось для аппроксимации чисел с плавающей запятой с числами с меньшей разрядностью, что значительно уменьшило объем памяти, занимаемой моделью, и повысило производительность, поскольку вычисления могут быть дополнительно оптимизированы. Однако квантование может привести к потере производительности, поскольку мы теряем информацию при преобразовании, но было широко продемонстрировано (например, см. здесь), что веса могут быть представлены в виде 8-битных целых чисел без значительного снижения производительности. Неудивительно, что квантование моделей ONNX очень просто!

Затем мы можем оптимизировать вывод модели для использования ЦП!

Результаты оптимизации модели показаны ниже. Мы видим, что наши усилия привели к уменьшению размера примерно в 2 раза и увеличению задержки примерно в 3 раза!

Развертывание конечной точки модели с помощью FastAPI + Docker

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

Используя FastAPI, мы упаковываем модель и создаем API для связи с ней. Мы также используем Pydantic для проверки пользовательского ввода и вывода модели, мы никогда не можем быть слишком осторожными! Например, мы гарантируем, что входной текст является строкой, ответом модели суммирования является строка, а модель извлечения ключевых слов возвращает словарь, содержащий список строк.

Затем Docker используется для контейнеризации сервера API, что позволяет нам запускать приложение на любом компьютере, не беспокоясь о том, что нужно воспроизвести мою точную среду. Чтобы создать Docker-образ сервера, я создал Dockerfile в корневой папке проекта.

Для размещения расширения в Интернете мы можем использовать либо Azure’s Container Service, либо AWS’ Elastic Container Service. Я еще не дошел до этого, но планирую сделать это в ближайшее время!

Создание расширения Google Chrome

Последней частью головоломки было создание расширения для Chrome, которое состояло из 3 частей:

  • manifest.json, содержащий конфигурацию расширения
  • popup.html и style.css, определяющие пользовательский интерфейс
  • popup.js для связи с API и реализации фактической функциональности расширения.

Я следовал этому фантастическому руководству по созданию веб-расширения, поэтому, пожалуйста, ознакомьтесь с ним, если вы хотите сделать что-то подобное. Единственное, что я изменил сам, это изменение вывода, чтобы включить больше моделей и отобразить результаты NER в HTML. Вот как выглядит конечный продукт для некоторого примера текста, найденного в Интернете!

Заключительные замечания

В этом сообщении блога я показал, как можно использовать современные модели преобразования для создания «умных» текстовых приложений. Я начал с поиска подходящих моделей для перефразирования, суммирования, распознавания сущностей имен и извлечения ключевых слов, прежде чем оптимизировать их для вывода моделей на ЦП. Затем я развернул модели в конечной точке API с помощью FastAPI и поместил приложение в контейнер для воспроизводимости.

Весь код этого проекта можно найти в этом репозитории GitHub.

Не стесняйтесь обращаться ко мне в LinkedIn!