Узнайте, как создать многоязычный бессерверный API ответов на вопросы BERT с размером модели более 2 ГБ, а затем протестировать его на немецком и французском языках.

Вступление

В настоящее время в мире проживает 7,5 миллиардов человек примерно в 200 странах. Только 1,2 миллиарда из них являются носителями английского языка. Это приводит к появлению большого количества неструктурированных текстовых данных не на английском языке.

Большинство учебных пособий и сообщений в блогах демонстрируют, как построить классификацию текста, анализ тональности, ответы на вопросы или модели генерации текста с архитектурой на основе BERT на английском языке. Чтобы преодолеть этот недостаток, мы собираемся создать многоязычный бессерверный API для ответов на вопросы.

Многоязычные модели описывают модели машинного обучения, которые могут понимать разные языки. Примером многоязычной модели является mBERT из исследования Google. Эта модель поддерживает и понимает 104 языка.

Мы собираемся использовать новую поддержку AWS Lambda Container Support для создания API для ответов на вопросы с xlm-roberta. Поэтому мы используем библиотеку Transformers от HuggingFace, Serverless Framework, AWS Lambda и Amazon ECR.

Особенностью этой архитектуры является то, что мы предоставляем современную модель объемом более 2 ГБ, которая обслуживается в бессерверной среде.

Прежде чем мы начнем, я хотел бы посоветовать вам прочитать мой блог philschmid.de, где я уже написал несколько сообщений о бессерверном, о том, как развернуть BERT в бессерверной среде или Как настроить модели BERT. ».

Вы можете найти его полный код в этом репозитории Github.



Услуги, включенные в это руководство

Библиотека трансформеров от Huggingface

Библиотека Transformers предоставляет современные архитектуры машинного обучения, такие как BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet, T5 для понимания естественного языка (NLU) и генерации естественного языка (NLG). Он также предоставляет тысячи предварительно обученных моделей на более чем 100 разных языках.

AWS Lambda

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

Реестр Amazon Elastic Container

Amazon Elastic Container Registry (ECR) - это полностью управляемый реестр контейнеров. Это позволяет нам хранить образы контейнеров докеров, управлять ими и делиться ими. Вы можете делиться контейнерами докеров как в частной организации, так и во всем мире для кого угодно.

Бессерверная структура

The Serverless Framework помогает нам разрабатывать и развертывать функции AWS Lambda. Это интерфейс командной строки, который предлагает структуру, автоматизацию и передовые методы прямо из коробки.

Руководство

Прежде чем мы начнем, убедитесь, что у вас настроена и настроена Serverless Framework. Вам также понадобится рабочая docker среда. Мы используем docker для создания собственного пользовательского образа, включающего все необходимые Python зависимости и нашу многоязычную xlm-roberta модель, которую затем используем в нашей функции AWS Lambda. Кроме того, вам необходим доступ к учетной записи AWS для создания пользователя IAM, реестра ECR, шлюза API и функции AWS Lambda.

Мы проектируем API следующим образом:

Отправляем контекст (небольшой абзац) и вопрос к нему и отвечаем ответом на вопрос. В качестве модели мы будем использовать xlm-roberta-large-squad2, обученный deepset.ai из transformers model-hub. Размер модели больше 2ГБ. Это огромная.

Что мы собираемся делать:

  • создайте Python лямбда-функцию с помощью Serverless Framework.
  • добавляем многоязычную xlm-roberta модель в нашу функцию и создаем конвейер вывода.
  • Создайте собственное docker изображение и протестируйте его.
  • Разверните собственный docker образ в ECR.
  • Разверните функцию AWS Lambda с пользовательским docker образом.
  • Протестируйте наш многоязычный бессерверный API.

Вы можете найти полный код в этом репозитории Github.

Создайте Python лямбда-функцию с помощью Serverless Framework

Сначала мы создаем нашу функцию AWS Lambda, используя бессерверный интерфейс командной строки с шаблоном aws-python3.

Эта команда CLI создаст новый каталог, содержащий файлы handler.py, .gitignore и serverless.yaml. handler.py содержит базовый шаблонный код.

Добавьте многоязычную xlm-roberta модель в нашу функцию и создайте конвейер вывода

Чтобы добавить нашу xlm-roberta модель в нашу функцию, мы должны загрузить ее из хаба моделей HuggingFace. Для этого я создал скрипт на Python. Прежде чем мы сможем выполнить этот сценарий, мы должны установить библиотеку transformers в нашу локальную среду и создать каталог model в нашем каталоге serverless-multilingual/.

После того, как мы установили transformers, мы создаем get_model.py файл и включаем приведенный ниже сценарий.

Чтобы выполнить сценарий, мы запускаем python3 get_model.py в каталоге serverless-multilingual/.

Совет: добавьте каталог model в .gitignore.

Следующим шагом является корректировка нашего handler.py и включение нашего serverless_pipeline(), который инициализирует нашу модель и токенизатор. Затем он возвращает функцию predict, которую мы можем использовать в нашем handler.

Создайте собственное docker изображение и протестируйте его.

Прежде чем мы сможем создать наш docker, нам нужно создать requirements.txt файл со всеми зависимостями, которые мы хотим установить в нашем docker.

Мы собираемся использовать более легкую версию Pytorch и библиотеку трансформаторов.

Чтобы поместить нашу лямбда-функцию в контейнер, мы создаем dockerfile в том же каталоге и копируем следующий контент.

Кроме того, мы можем добавить файл .dockerignore, чтобы исключить файлы из вашего образа контейнера.

Чтобы создать наш собственный docker образ, мы запускаем.

Мы можем запустить наш docker, запустив.

После этого в отдельном терминале мы можем локально вызвать функцию с помощью curl или REST-клиента.

Остерегайтесь stringify нашего тела, поскольку мы передаем его непосредственно в функцию (только для тестирования).

Разверните пользовательский образ docker в ECR

Поскольку теперь у нас есть локальный образ docker, мы можем развернуть его в ECR. Поэтому нам нужно создать репозиторий ECR с именем multilingual-lambda.

Чтобы иметь возможность отправлять наши изображения, нам нужно войти в ECR. Мы используем aws CLI v2.x. Поэтому нам нужно определить некоторые переменные среды, чтобы упростить развертывание.

Затем нам нужно tag / переименовать наш ранее созданный образ в формат ECR. Формат для этого :{AccountID}.dkr.ecr.{region}.amazonaws.com/{repository-name}

Чтобы проверить, сработало ли это, мы можем запустить docker images и увидеть изображение с нашим тегом в качестве имени.

Наконец, мы отправляем образ в реестр ECR.

Разверните функцию AWS Lambda с пользовательским docker образом

Я предоставляю полный serverless.yaml для этого примера, но мы проходим все детали, которые нам нужны для нашего docker образа, и опускаем все стандартные конфигурации. Если вы хотите узнать больше о serverless.yaml, я предлагаю вам проверить Масштабирование машинного обучения от НУЛЯ до ГЕРОЯ. В этой статье я рассмотрел каждую конфигурацию и объяснил их использование.

Внимание: нам нужно не менее 9 ГБ памяти и 300 секунд в качестве тайм-аута.

Чтобы использовать изображение docker в нашем serverlss.yaml, мы должны добавить image в наш раздел function. image также имеет значение URL-адреса нашего docker изображения.

Для изображения ECR URL должен иметь вид tihs <account>.dkr.ecr.<region>.amazonaws.com/<repository>@<digest> (например, 000000000000.dkr.ecr.sa-east-1.amazonaws.com/test-lambda-docker@sha256:6bb600b4d6e1d7cf521097177dd0c4e9ea373edb91984a505333be8ac9455d38)

Вы можете получить URL-адрес ecr через Консоль AWS.

Чтобы развернуть функцию, мы запускаем serverless deploy.

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

Протестируйте наш многоязычный бессерверный API

Чтобы протестировать нашу функцию Lambda, мы можем использовать Insomnia, Postman или любой другой клиент REST. Просто добавьте JSON с context и question в тело вашего запроса. Давайте попробуем это с German примером, а затем с French примером.

Имейте в виду, что при первом вызове функции произойдет холодный старт. Из-за размера модели. Холодный запуск длится более 30 секунд, поэтому для первого запроса истечет тайм-аут шлюза API.

Немецкий:

Наш serverless_pipeline() правильно ответил на наш вопрос - 40,4 Prozent.

Французский:

Наш serverless_pipeline() правильно ответил на наш вопрос - 40,4%.

Заключение

Выпуск поддержки AWS Lambda Container Support и увеличение объема памяти до 10 ГБ позволяет гораздо шире использовать AWS Lambda и Serverless. Он устраняет многие существующие проблемы и дает нам больше возможностей для развертывания бессерверных приложений.

Я имею в виду, что мы развернули контейнер докеров, содержащий современную многоязычную модель НЛП размером более 2 ГБ в бессерверной среде без необходимости управления каким-либо сервером.

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

Будущее AWS Lambda и Serverless выглядит более чем золотым.

Вы можете найти репозиторий GitHub с полным кодом здесь.

Спасибо за прочтение. Если у вас есть какие-либо вопросы, свяжитесь со мной или прокомментируйте эту статью. Вы также можете связаться со мной в Twitter или LinkedIn.

Первоначально опубликовано на https://www.philschmid.de 17 декабря 2020 г.