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

Традиционно обслуживание моделей pytorch в производственной среде было сложным, поскольку для этой задачи не существовало стандартной платформы. Этот пробел позволил его основному конкуренту tensorflow сохранить сильные позиции во многих производственных системах, поскольку он предоставил надежный инструментарий для таких развертываний в своей структуре tensorflow/serving.

Однако в настоящее время большинство новых моделей и подходов, как правило, сначала разрабатываются и становятся доступными в pytorch, поскольку исследователи пользуются его гибкостью для прототипирования. Это создает разрыв между современными разработками, разработанными в исследовательских лабораториях, и моделями, которые обычно внедряются в производство в большинстве компаний. В быстро развивающихся областях, таких как обработка естественного языка (NLP), этот разрыв может быть весьма заметным, несмотря на усилия таких фреймворков, как huggingface/transformers, по обеспечению совместимости моделей для обоих фреймворков. На практике разработка и внедрение новых подходов, как правило, происходит сначала в pytorch, а к тому времени, когда фреймворки и продуктивные системы догоняют и интегрируют версию tensorflow, новую и более улучшенную. модели уже устарели.

Совсем недавно разработчики pytorch выпустили новую платформу обслуживания pytorch/serve, чтобы решить эти проблемы простым способом.

TorchServe – это гибкий и простой в использовании инструмент для обслуживания моделей PyTorch.

TorchServe (репозиторий: pytorch/serve) — это недавно (4 дня назад на момент написания статьи) выпущенная платформа, разработанная разработчиками pytorch для простого и эффективного производства обученных моделей pytorch.

Я рекомендую прочитать эту запись в блоге AWS для подробного обзора TorchServe.

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

Поскольку это очень популярный фреймворк со многими активными пользователями (>25 тысяч звезд на Github) из разных доменов, неудивительно, что уже есть интерес (например, здесь, здесь и здесь) к обслуживанию BERT. и другие модели трансформаторов с использованием TorchServe.

В этой статье объясняется, как обслуживать обученную модель трансформатора с помощью TorchServe.

Предпосылки

Чтобы избежать излишнего раздувания этого поста, я сделаю предположение: у вас уже есть обученная контрольная точка BERT (или другая модель классификатора предложений трансформеров).

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

Установка TorchServe

TorchServe предоставляет простое руководство по установке с помощью pip, conda или docker. В настоящее время установка примерно состоит из двух этапов:

  • Установите Java JDK 11
  • Установите torchserve с его зависимостями от Python.

Ознакомьтесь с руководством по установке, приведенным выше, чтобы убедиться, что TorchServe установлен на вашем компьютере.

Обучение классификатора предложений BERT с обнимающимся лицом

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

Простой способ получить обученную контрольную точку BERT — использовать пример GLUE huggingface для классификации предложений:

https://github.com/huggingface/transformers/blob/master/examples/run_glue.py

В конце обучения убедитесь, что вы разместили контрольную точку обученной модели ( pytorch.bin), файл конфигурации модели ( config.json) и файл словаря токенизатора ( vocab.txt) в том же каталоге. Ниже я буду использовать обученную контрольную точку «bert-base-uncased» и хранить ее вместе со словарем токенизатора в папке «./bert_model».

Для справки, мой выглядит так:

Папка контрольной точки модели, несколько файлов являются необязательными

Определение обработчика TorchServe для нашей модели BERT

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

Вот мой шаблон очень простого обработчика TorchServe для классификаторов BERT/transformer:

Несколько вещей, которые мой обработчик не делает, но ваш может захотеть сделать:

  • Пользовательская предварительная обработка текста (здесь мы просто токенизируем)
  • Любая постобработка прогнозов BERT (их можно добавить в функцию postprocess).
  • Загрузите ансамбль моделей. Одним из простых способов добиться этого является загрузка дополнительных контрольных точек в функцию initialize и предоставление логики ансамблевого прогнозирования в функции inference.

Преобразование обученной контрольной точки в файл TorchServe MAR

TorchServe использует формат под названием MAR (Архив моделей) для упаковки моделей и их версий в своем хранилище моделей. Чтобы сделать его доступным из TorchServe, нам нужно преобразовать нашу обученную контрольную точку BERT в этот формат и прикрепить наш обработчик выше.

Следующая команда делает свое дело:

torch-model-archiver --model-name "bert" --version 1.0 --serialized-file ./bert_model/pytorch_model.bin --extra-files "./bert_model/config.json,./bert_model/vocab.txt" --handler "./transformers_classifier_torchserve_handler.py"

Эта команда прикрепляет сериализованную контрольную точку вашей модели BERT (./bert_model/pytorch_model.bin) к нашему новому пользовательскому обработчику transformers_classifier_torchserve_handler.py, описанному выше, и добавляет дополнительные файлы для словарь конфигурации и токенизатора. Он создает файл с именем bert.mar, который может быть понят TorchServe.

Далее мы можем запустить сервер TorchServe (по умолчанию он использует порты 8080 и 8081) для нашей модели BERT с модельным хранилищем, которое содержит наш только что созданный файл MAR:

mkdir model_store && mv bert.mar model_store && torchserve --start --model-store model_store --models bert=bert.mar

Вот и все! Теперь мы можем запросить модель с помощью API вывода:

curl -X POST http://127.0.0.1:8080/predictions/bert -T unhappy_sentiment.txt

В моем случае unhappy_sentiment.txt — это файл, содержащий примеры предложений с негативным настроением. Моя модель правильно предсказала негативное отношение к этому тексту (класс 0).

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

Удачного кодирования и обслуживания!

Первоначально опубликовано на https://medium.com 28 апреля 2020 г.