Вступление

TorchServe - это новый крутой фреймворк для обслуживания моделей пторчей в производстве. Это упрощает масштабное развертывание моделей PyTorch в производственных средах и обеспечивает легкое обслуживание с низкой задержкой, то есть с высокой производительностью. Он имеет несколько мощных функций, таких как обслуживание нескольких моделей, управление версиями моделей для A / B-тестирования, метрики для мониторинга и конечные точки RESTful для интеграции приложений, вы можете быстро перенести свои модели из исследования в производство. И вы можете легко настроить его на любой машине, следуя инструкциям по установке, приведенным на странице TorchServe на github.

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

Этот пост поможет вам в обслуживании вашей пользовательской модели НЛП с помощью torchserve. Я покажу вам пример модели классификации токенов, обученной для задачи распознавания именованных сущностей (NER) и обслуживающей ее с помощью TorchServe.

Компоненты, необходимые для обслуживания модели с использованием torchserve:
a) Файл определения класса модели.

б) Сериализуемый файл обученной модели (для модели BERT у нас будет файл .bin, файл словаря и файл конфигурации)

c) Файл-обработчик с тремя основными методами предварительной обработки, вывода и постобработки.

Модель NER

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

В этом посте я собираюсь предположить, что мы уже настроили BERT для модели классификации токенов на JNLPBA (набор биомедицинских данных, который состоит из таких объектов, как белок, клеточная линия, РНК, ДНК и клеточная линия). Типа) данные . Ярлыки, используемые для обучения, приведены ниже:

Если у вас нет настроенной модели, вы можете использовать пример, приведенный в репозитории huggingface или мой репозиторий github для точной настройки scibert для любых данных NER.

Мой собственный класс модели для классификации токенов BERT for выглядит следующим образом (этим классом модели может быть любая модель, например BERTCRF для классификации токенов и т. Д.):

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

Теперь давайте продолжим, предполагая, что у нас есть pytorch_model.bin, config.json и vocab.txt, которые необходимы для загрузки нашей модели. Как вы можете видеть, в классе модели есть еще несколько параметров classification_layer_sizes и num_labels, которые будут определены в другом файле конфигурации.

Сохраненные файлы хранятся в папке model_related_data и будут выглядеть следующим образом:

bert_config.json: конфигурация, используемая для инициализации слоев BERT модели.

bert_for_token_classification_config.json: конфигурация, используемая для инициализации других параметров модели, кроме слоя BERT, например c lassification_layer_sizes.

labels_file.txt: файл, содержащий метки, используемые при обучении модели.

pytorch_model.bin: веса обученной модели

vocab.txt: файл, используемый для инициализации токенизатора BERT для модели.

Определение класса обработчика NER для TorchSeve

Сначала я покажу вам код, а затем расскажу, что делает каждый класс и метод.

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

list_classes_from_module: помогает импортировать определение класса модели в скрипт обработчика.

_is_whitespace: помогает в правильной разметке заданного текста в слова.

get_labels: помогает прочитать файл labels_file.txt и подготовить список ярлыков.

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

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

Основные методы класса обработчика:

инициализировать: инициализирует модель и другие атрибуты, такие как bert_tokenizer, ber_config, model_config_dict, max_sequence_length и num_special_tokens, метки. Обратите внимание, как list_classes_from_module используется для загрузки определения модели в обработчик. Здесь вы можете инициализировать все имена файлов, которые требуются для запуска модели на ваших данных.

preprocess: метод, который обрабатывает данное предложение и подготавливает входной формат для модели.

вывод: метод, отвечающий за получение прогнозов из модели.

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

Ниже приведены вспомогательные методы, которые вызываются в упомянутых выше основных методах класса обработчика:

convert_sentence_to_example: используется для преобразования введенного предложения в пример объекта.

convert_sentence_to_example: используется для создания объекта функции из объекта примера.

align_out_label_with_original_sentence_tokens: этот метод выравнивает метки по каждому слову предложения.

convert_to_ents_dict: этот метод берет метки и слова и подготавливает объект dict с start_span и end_span в предложении для каждой идентифицированной сущности.

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

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

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

Чтобы сохранить файл .mar, мы создаем каталог с именем model_store.

mkdir model_store

Команда для изгиба модели нера приведена ниже:

torch-model-archiver --model-name ner_model --version 1.0 --model-file model.py --serialized-file model_related_data/pytorch_model.bin --export-path model_store/ --extra-files "model_related_data/bert_config.json,model_related_data/bert_for_token_classification_config.json,model_related_data/vocab.txt,model_related_data/labels_file.txt" --handler ner_torchserve_handler.py

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

- model-file: путь к файлу, в котором вы определили свой класс модели.

- serialized-file: путь весов модели

- export-path: каталог, в котором вы хотите сохранить файл .mar

- extra-files: добавьте все дополнительные файлы, необходимые для инициализации вашей модели.

- обработчик: путь к сценарию обработчика

Содержимое папки будет выглядеть так:

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

torchserve --start --ncs --model-store model_store/ --models ner_model.mar

Теперь вы можете взаимодействовать со своей моделью по указанному ниже URL-адресу http://127.0.0.1:8080/predictions/ner_model

Отображение примера вывода

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

В следующих статьях я расскажу о других функциях, например о пакетном выводе данных в Torch serve.

Вы можете просмотреть мой репозиторий на github, приведенный ниже, чтобы увидеть всю кодовую базу.



Ресурсы