How-to: модель GPT-2 для получения логических выводов с помощью Amazon SageMaker - LEFT JOIN

Свяжитесь с нами в любой удобной для вас форме

Менеджер

Написать в телеграмм

Онлайн
Телеграмм
или
Заполните форму

3 минут чтения

*

28 октября 2022 г.

How-to: модель GPT-2 для получения логических выводов с помощью Amazon SageMaker

How-to- модель GPT-2 для получения логических выводов с помощью Amazon SageMake

Не так давно, на конференции Linq мы представили генератор твитов в стиле Илона Маска. Для его создания мы взяли готовую модель GPT-2 Medium и дообучили/стилизовали ее на своем датасете. По-английски такой процесс называется fine-tuning. Модель требует достаточное количество ресурсов для этого, так что не каждый может это сделать локально на своем ПК. Однако, вопрос решается, если использовать, например, Google Colab. Мы же дообучали модель на платформе Kaggle.

Но после этого появляется новая задача — модель нужно развернуть, чтобы создать полноценный сервис. Конечно, существует множество различных решений. Ранее, при создании (генератора телеграм-постов в стиле Артемия Лебедева мы обращались к сервису Yandex DataSphere, а после даже написали небольшой гайд о том, как там развернуть модель. Теперь же мы расскажем о развертывании модели GPT-2 для получения логических выводов в режиме реального времени (Real-time inference) с помощью Amazon SageMaker.

1. Заходим в аккаунт AWS.

2. Так как мы хотим задеплоить стилизованную модель, нам необходимо загрузить в облако необходимые файлы. В поиске вбиваем S3, выбираем первый сервис.

3. Нажимаем Create bucket.

4. Далее проводим конфигурацию бакета: вводим его имя, выбираем регион, настраиваем права доступа и т.д. Для простоты достаточно ввести данные только в графе General configuration.

5. После конфигурирования нажимаем Create bucket.

6. Затем нас перебросит на страницу Amazon S3, где можно будет увидеть что-то подобное:

7. Далее надо загрузить сами файлы модели. Нажимаем на имя созданного бакета и в открывшемся окне нажимаем Upload.

8. Перетаскиваем архив с файлами модели в нужную область или нажимаем Add files. При необходимости можно выстроить иерархию внутри бакета путем создания папок с помощью Add folders. Здесь важно отметить, что файлы модели должны быть в архиве с расширением tar.gz.

9. Нажимаем Upload и ждем завершение загрузки.

10. После успешной загрузки архива, перейдем непосредственно к деплою модели. В поиске вбиваем SageMaker, выбираем первый сервис.

11. Для работы с с этим сервисом необходимо предварительно настроить SageMaker Domain, для этого нажимаем Get Started на баннере New to Sagemaker?.

12. Для простой конфигурации 1 пользователя выбираем Quick setup и нажимаем Set up SageMaker Domain.

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

14. Нажимаем Submit.

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

16. После завершения настройки, среди пользователей появится созданный нами и можно будет запустить Studio, нажав на Launch app. SageMaker Studio — IDE, позволяющая работать работать с Jupyter ноутбуками в облаке AWS.

17. Тут тоже придется немного подождать.

18. Наконец, мы попадем в SageMaker Studio.

Переключаясь между вкладками с помощью панели слева, можно:

  • Просмотреть рабочий репозиторий, где будут храниться ноутбуки и прочие файлы;
  • Просмотреть запущенные инстансы и приложения, Kernel и Terminal Sessions;
  • Работать с Git репозиторием;
  • Управлять ресурсами SageMaker;
  • Устанавливать разрешения для Jupyter ноутбуков.

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

20. Несмотря на наличие готовых решений, для деплоя нашей fine-tuned модели GPT-2 мы создадим новый ноутбук, где пропишем все, что нам нужно. Для этого нажмем на + в голубом прямоугольнике сверху слева. Откроется вкладка Launcher, пролистаем вниз до секции Notebooks and compute resources и выберем там Notebook Python 3.

21. Придется немного подождать, прежде чем ядро ноутбука будет готово к работе.

22. Наконец, можно писать код.

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

24. Во время работы с ноутбуком вы платите за время его использования с учетом типа выбранного инстанса.

25. Для простого деплоя нашей модели можем воспользоваться готовой конфигурацией от Hugging Face. Нажимаем на кнопку Deploy, выбираем там Amazon SageMaker, выбираем задачу (в нашем случае это Text Generation) и конфигурацию (в нашем случае это AWS), копируем код в наш ноутбук.

26. Так как мы используем свою дообученную модель, а не готовую из репозитория Hugging Face, нам надо сделать небольшие изменения в коде. Комментируем в словаре hub строку с ключом ‘HF_MODEL_ID’ и в конструкторе HuggingFaceModel добавляем ключ model_data, куда пишем путь до нашего архива с файлами модели:


# Hub Model configuration. https://huggingface.co/models
hub = {
	# ‘HF_MODEL_ID’:’gpt2-medium’,
	‘HF_TASK’:’text-generation’
}
 
# create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
	transformers_version=’4.17.0′,
	pytorch_version=’1.10.2′,
	py_version=’py38′,
	env=hub,
	role=role, 
      model_data=’s3://my-bucket-for-gpt2/gpt2-medium-musk.tar.gz’,
)

27. В методе deploy объекта huggingface_model мы можем выбрать, на каком инстансе произойдет развертывание нашей модели, указав его в параметре instance_type. Большинство инстансов может быть недоступно в связи с отсутствием нужных квот и их придется запрашивать в поддержке AWS. В этом случае вы увидите подобную ошибку:

28. Если модель была успешно создана и развернута (для этого придется немного подождать), то можно вызвать метод predict.

29. Для того, чтобы обращаться к инстансу извне AWS, придется создать Access key.

— В поиске вбиваем IAM, выбираем первый сервис.

— В открывшемся окне выбираем вкладку User и нажимаем на имя пользователя, под которым мы работаем.

— Переходим на вкладку Security credentials и нажимаем Create access key.

— Копируем Access key ID и Secret access key и сохраняем их в надежном месте.

30. Далее нужно узнать имя созданного эндпоинта с моделью. В студии на левой панели выбираем вкладку SageMaker resources, выбираем ресурс Endpoints и дважды кликаем по имени нашего эндпоинта. Откроется вкладка с деталями, откуда мы сможем скопировать его имя.

31. Теперь напишем код для обращения к модели извне.


import boto3
import json
import time
 
endpoint_name = ‘<my_endpoint_name>‘
aws_access_key_id = ‘<my_aws_access_key_id>‘
aws_secret_access_key = ‘<my_aws_secret_access_key>‘
 
sagemaker_runtime = boto3.client(
    «sagemaker-runtime», 
    region_name=’us-east-1′,
    aws_access_key_id=aws_access_key_id, 
    aws_secret_access_key=aws_secret_access_key
)
 
data = {
    «inputs»: «Weed is»,
}
 
response = sagemaker_runtime.invoke_endpoint(
    EndpointName=endpoint_name, 
    ContentType=’application/json’,
    Body=json.dumps(data, ensure_ascii=False).encode(‘utf8’)
)
 
print(response[‘Body’].read().decode(‘utf-8’))

И протестируем:

32. Стоит отметить, что если следовать описанным выше шагам, то модель будет использовать для генерации параметры по умолчанию. Чтобы добавить кастомную логику загрузки модели, пред- и постобработки данных, предсказания, можно создать файл inference.py в студии рядом с вашим ноутбуком и там переопределить нужные вам методы. Подробнее о них можно почитать тут.

— Чтобы этот скрипт использовался при развертывании модели, в конструкторе HuggingFaceModel нужно добавить еще один параметр:


huggingface_model = HuggingFaceModel(
	transformers_version=’4.17.0′,
	pytorch_version=’1.10.2′,
	py_version=’py38′,
	env=hub,
	role=role, 
      model_data=’s3://my-bucket-for-gpt2/gpt2-medium-musk.tar.gz’,
      entry_point=’inference.py’
)

— Разумеется, для уже созданных эндпоинтов такое изменение не будет учтено. Нужно будет заново задеплоить модель.

— Приведем пример файла inference.py, который можно использовать для модели GPT-2:


import json
import torch
from transformers import GPT2Config, GPT2Tokenizer, GPT2LMHeadModel
 
def model_fn(model_dir):
    configuration = GPT2Config.from_pretrained(model_dir, output_hidden_states=False)
    tokenizer = GPT2Tokenizer.from_pretrained(
        model_dir,
        bos_token=’<|sos|>‘, 
        eos_token=’<|eos|>‘, 
        pad_token=’<|pad|>‘
    )
    model = GPT2LMHeadModel.from_pretrained(model_dir, config=configuration)
    model.resize_token_embeddings(len(tokenizer))
    model.eval()
    return (model, tokenizer)
 
def input_fn(request_body, request_content_type):
    if request_content_type == «application/json»:
        request = json.loads(request_body)
    else:
        request = request_body
    return request
 
def predict_fn(data, model_tokenizer):
    model, tokenizer = model_tokenizer
 
    inputs = data.pop(«inputs», «»)
    max_length = data.pop(«max_length», 50)
 
    input_ids = torch.tensor(tokenizer.encode(f’<|sos|>{inputs}’)).unsqueeze(0)
    outputs = model.generate(
                input_ids, 
                max_length=max_length,
                bos_token_id=tokenizer.bos_token_id,
                pad_token_id=tokenizer.pad_token_id,
                eos_token_id=tokenizer.eos_token_id, 
                do_sample=True,
                top_k=0,
                top_p=0.95,
                no_repeat_ngram_size=4
    )
    decoded_output = tokenizer.decode(outputs[0])
 
    return {«decoded_output»: decoded_output}

33. В конце работы с ноутбуком в студии нужно будет обязательно вырубить все используемые для этого ресурсы. К сожалению, при простом закрытии вкладки со студией, ресурсы не освобождаются, поэтому приходится это делать самостоятельно. В противном случае, с вас будет списываться плата за их использование. Итак, вырубить все ненужное можно в самой студии, выбрав на панели слева вкладку Running Terminal and Kernels.

— После закрытия ноутбука проверить то, что все ресурсы освобождены, можно на странице Amazon SageMaker. Для этого нужно будет нажать на имя пользователя и посмотреть на статус вашего приложения, тип которого KernelGateway. Статус должен быть Deleted.

34. После того, как вы перестанете нуждаться в развернутой модели, нужно будет удалить эндпоинт. Если вы не освободили ресурсы, используемые ноутбуком в студии, то это можно будет сделать прямо оттуда, прописав строку:


predictor.delete_endpoint()

— Иначе вы можете удалить эндпоинт, перейдя на страницу сервиса Amazon SageMaker. Там на левой панели нужно будет выбрать вкладку Inference, в выпадающем списке нажать Endpoints, затем справа выбрать нужный эндпоинт, нажать Actions и Delete.

— Также можно будет удалить созданные модели, перейдя в Inference→Models, и конфигурации эндпоинтов, перейдя в Inference→Enpoint Configurations.

Итак, мы рассказали о том, как развертывать стилизованную модель GPT-2 для получения логических выводов в режиме реального времени (Real-time inference) с помощью Amazon SageMaker. Стоит отметить, что существует несколько вариантов развертывания, каждый из которых имеет свои особенности, например, асинхронность, пакетная обработка, наличие холодного старта, т.д. Использование того или иного варианта зависит от поставленных требований.

Подробнее про другие механизмы деплоя с помощью Amazon SageMaker читайте тут.

377 просмотров

Добавить комментарий

[ Рекомендации ]

Читайте также

2 минут чтения

*

6 мая 2021

В Python 3.10 появился pattern matching

1 минута чтения

*

13 апреля 2019

Карта Machine Learning алгоритмов

[ Дальше ]