Home Машинное обучение Как Patsnap использовал вывод GPT-2 на Amazon SageMaker с низкой задержкой и затратами | DeepTech

Как Patsnap использовал вывод GPT-2 на Amazon SageMaker с низкой задержкой и затратами | DeepTech

0
Как Patsnap использовал вывод GPT-2 на Amazon SageMaker с низкой задержкой и затратами
 | DeepTech

Этот пост в блоге был написан в соавторстве с Зилонг ​​Бай, старшим инженером по обработке естественного языка в Patsnap, и включает в себя введение.

Вы, вероятно, знакомы с функцией автозаполнения, когда ищете что-то в Google или Amazon. Хотя условия поиска в этих сценариях являются довольно распространенными ключевыми словами или выражениями, которые мы используем в повседневной жизни, в некоторых случаях условия поиска очень специфичны для сценария. Патентный поиск является одним из них. Недавно Центр инноваций AWS Generative AI в сотрудничестве с Patsnap реализовал функцию автоматического предложения ключевых слов для поиска в качестве инновационного исследования для улучшения взаимодействия с пользователем на их платформе.

Patsnap предоставляет глобальную универсальную платформу для патентного поиска, анализа и управления. Они используют большие данные (например, историю прошлых поисковых запросов) для предоставления множества мощных, но простых в использовании патентных инструментов. Эти инструменты позволили глобальным клиентам Patsnap лучше понять патенты, отслеживать последние технологические достижения, выявлять инновационные тенденции и анализировать конкурентов в режиме реального времени.

В то же время Patsnap использует возможности машинного обучения (ML) для разработки функций, которые могут постоянно улучшать пользовательский опыт на платформе. Недавняя инициатива состоит в том, чтобы упростить создание поисковых выражений путем автозаполнения запросов патентного поиска с использованием современных моделей генерации текста. Для этой цели Патснап обучил специальную модель GPT-2. Поскольку в системе патентного поиска нет такой функции (насколько им известно), Patsnap считает, что добавление этой функции повысит лояльность конечных пользователей.

Однако в их недавних экспериментах задержка вывода и количество запросов в секунду (QPS) модели GPT-2 на основе PyTorch не могли соответствовать определенным пороговым значениям, которые могут оправдать ее ценность для бизнеса. Чтобы решить эту проблему, ученые Центра инноваций AWS Generative AI изучили различные решения для оптимизации производительности логического вывода GPT-2, что привело к снижению задержки модели в среднем на 50 % и повышению количества запросов в секунду на 200 %.

Проблемы вывода модели большого языка и подходы к оптимизации

В общем, применение такой большой модели в реальной производственной среде нетривиально. Запредельная стоимость вычислений и задержка GPT-2 на основе PyTorch затрудняли широкое внедрение с точки зрения бизнес-операций. В этом проекте наша цель — значительно улучшить задержку при разумных затратах на вычисления. В частности, для Patsnap требуется следующее:

  • Средняя задержка вывода модели для генерации поисковых выражений должна контролироваться в пределах 600 миллисекунд в сценариях поиска в реальном времени.
  • Модель требует высокой пропускной способности и количества запросов в секунду для выполнения большого количества поисков в секунду в часы пик.

В этом посте мы обсуждаем результаты, полученные при использовании инстансов Amazon Elastic Compute Cloud (Amazon EC2) с инстансами на базе GPU, использующими NVIDIA TensorRT.

Вкратце: мы используем NVIDIA TensorRT для оптимизации задержки GPT-2 и развертываем ее на конечной точке Amazon SageMaker для обслуживания моделей, что снижает среднюю задержку с 1172 миллисекунд до 531 миллисекунды.

В следующих разделах мы рассмотрим технические детали предлагаемых решений с ключевыми фрагментами кода и покажем сравнение с текущим состоянием клиента на основе ключевых показателей.

Обзор модели GPT-2

GPT-2 компании Open AI — это большой трансформаторязыковая модель с 1,5 миллиардами параметров, обученная на наборе данных WebText, содержащем 8 миллионов веб-страниц. GPT-2 обучается с простой целью: предсказать следующее слово, учитывая все предыдущие слова в некотором тексте. Разнообразие набора данных приводит к тому, что эта простая цель содержит естественные демонстрации многих задач в разных областях. GPT-2 обладает широким набором возможностей, в том числе возможностью генерировать условные синтетические образцы текста беспрецедентного качества, когда мы запускаем модель с входными данными и позволяем ей генерировать длинное продолжение. В этой ситуации мы используем его для генерации поисковых запросов. Поскольку модели GPT продолжают расти, затраты на вывод постоянно растут, что увеличивает потребность в развертывании этих моделей с приемлемой стоимостью.

Добейтесь низкой задержки на экземплярах GPU с помощью TensorRT.

ТензорРТ — это библиотека C++ для высокопроизводительного логического вывода на графических процессорах NVIDIA и ускорителях глубокого обучения, поддерживающая основные фреймворки глубокого обучения, такие как PyTorch и TensorFlow. Предыдущие исследования показали значительное улучшение производительности с точки зрения задержки модели. Поэтому для нас это идеальный выбор для уменьшения задержки целевой модели на графических процессорах NVIDIA.

Нам удалось добиться значительного сокращения задержки вывода модели GPT-2 с помощью модели на основе TensorRT на графических процессорах NVIDIA. Модель на основе TensorRT развертывается через SageMaker для тестов производительности. В этом посте мы покажем шаги по преобразованию исходной модели GPT-2 на основе PyTorch в модель на основе TensorRT.

Преобразование GPT-2 на основе PyTorch в модель на основе TensorRT несложно с помощью официальный инструмент предоставлено NVIDIA. Кроме того, при таких прямолинейных преобразованиях не наблюдается явного ухудшения точности модели. В общем, есть три шага:

  1. Проанализируйте свой GPT-2. На момент написания этой статьи инструмент преобразования NVIDIA поддерживает только версию Hugging Face модели GPT-2. Если текущая модель GPT-2 не является исходной версией, вам необходимо изменить ее соответствующим образом. Рекомендуется удалить пользовательский код из исходной реализации GPT-2 Hugging Face, что очень полезно для преобразования.
  2. Установите необходимые пакеты Python. Процесс преобразования сначала преобразует модель на основе PyTorch в модель ONNX, а затем преобразует модель на основе ONNX в модель на основе TensorRT. Для этого двухэтапного преобразования необходимы следующие пакеты Python:
tabulate
toml
torch
sentencepiece==0.1.95
onnx==1.9.0
onnx_graphsurgeon
polygraphy
transformers

  1. Преобразуйте свою модель. Следующий код содержит функции для двухэтапного преобразования:
def torch2onnx():
    metadata = NetworkMetadata(variant=GPT2_VARIANT, precision=Precision(fp16=True), other=GPT2Metadata(kv_cache=False))
    gpt2 = GPT2TorchFile(model.to('cpu'), metadata)
    onnx_path = ('Your own path to save ONNX-based model') # e.g, ./model_fp16.onnx
    gpt2.as_onnx_model(onnx_path, force_overwrite=False)
    return onnx_path, metadata
   
def onnx2trt(onnx_path, metadata):
    trt_path="Your own path to save TensorRT-based model" # e.g., ./model_fp16.onnx.engine
    batch_size = 10
    max_sequence_length = 42
    profiles = (Profile().add(
        "input_ids",
        min=(1, 1),
        opt=(batch_size, max_sequence_length // 2),
        max=(batch_size, max_sequence_length),
    ))
    gpt2_engine = GPT2ONNXFile(onnx_path, metadata).as_trt_engine(output_fpath=trt_path, profiles=profiles)
    gpt2_trt = GPT2TRTDecoder(gpt2_engine, metadata, config, max_sequence_length=42, batch_size=10)

Сравнение задержки: PyTorch против TensorRT

JMeter используется для оценки производительности в этом проекте. JMeter — это проект Apache, который можно использовать в качестве инструмента нагрузочного тестирования для анализа и измерения производительности различных сервисов. Мы записываем количество запросов в секунду и задержку исходной модели на основе PyTorch и нашей преобразованной модели GPT-2 на основе TensorRT на экземпляре AWS P3.2xlarge. Как мы покажем позже в этом посте, благодаря мощной способности ускорения TensorRT задержка GPT-2 значительно снижается. Когда параллелизм запросов равен 1, средняя задержка сократилась на 274 миллисекунды (в 2,9 раза быстрее). С точки зрения QPS, он увеличен с 2,4 до 7, что примерно в 2,9 раза больше, чем у исходной модели на основе PyTorch. Более того, по мере увеличения параллелизма число запросов в секунду продолжает увеличиваться. Это предполагает более низкие затраты при приемлемом увеличении задержки (но все же намного быстрее, чем исходная модель).

В следующей таблице сравниваются задержки:

. параллелизм число запросов в секунду Максимальная задержка Минимальная задержка Средняя задержка
Клиентская версия PyTorch (на p3.2xlarge) 1 2,4 632 105 417
2 3.1 919 168 636
3 3.4 1911 г. 222 890
4 3.4 2458 277 1172
Версия AWS TensorRT (на p3.2xlarge) 1 7 (+4,6) 275 22 143 (-274 мс)
2 7,2 (+4,1) 274 51 361 (-275 мс)
3 7,3 (+3,9) 548 49 404 (-486 мс)
4 7,5 (+4,1) 765 62 531 (-641 мс)

Разверните GPT-2 на основе TensorRT с помощью SageMaker и пользовательского контейнера.

Для GPT-2 на основе TensorRT требуется относительно свежая версия TensorRT, поэтому для развертывания нашей модели мы выбираем режим использования собственного контейнера (BYOC) SageMaker. Режим BYOC обеспечивает гибкий способ развертывания модели, и вы можете создавать настраиваемые среды в своем собственном контейнере Docker. В этом разделе мы покажем, как создать собственный контейнер, развернуть собственную модель GPT-2 и протестировать с помощью API конечной точки SageMaker.

Создайте свой собственный контейнер

Каталог файлов контейнера представлен в следующем коде. Конкретно, Dockerfile и build.sh используются для создания контейнера Docker. gpt2 и predictor.py реализовать модель и API вывода. serve, nginx.confи wsgi.py предоставить конфигурацию для веб-сервера NGINX.

container
├── Dockerfile    # build our docker based on this file.
├── build.sh      # create our own image and push it to Amazon ECR
├── gpt2          # model directory
├── predictor.py  # backend function for invoke the model
├── serve         # web server setting file
├── nginx.conf    # web server setting file
└── wsgi.py       # web server setting file

Вы можете запустить sh ./build.sh чтобы построить контейнер.

Развертывание на конечной точке SageMaker

После того, как вы создали контейнер для запуска GPT-2 на основе TensorRT, вы можете включить вывод в реальном времени через конечную точку SageMaker. Используйте следующие фрагменты кода, чтобы создать конечную точку и развернуть модель в конечной точке с помощью соответствующих API-интерфейсов SageMaker:

import boto3from time import gmtime, strftime
from sagemaker import get_execution_role

sm_client = boto3.client(service_name="sagemaker")
runtime_sm_client = boto3.client(service_name="sagemaker-runtime")
account_id = boto3.client('sts').get_caller_identity()('Account')
region = boto3.Session().region_name
s3_bucket="${Your s3 bucket}"
role = get_execution_role()
model_name="${Your Model Name}"
# you need to upload your container to S3 first
container="${Your Image Path}"
instance_type="ml.p3.2xlarge"
container = {
    'Image': container
}
create_model_response = sm_client.create_model(
    ModelName = model_name,
    ExecutionRoleArn = role,
    Containers = (container))
    
# Endpoint Setting
endpoint_config_name="${Your Endpoint Config Name}"
print('Endpoint config name: ' + endpoint_config_name)
create_endpoint_config_response = sm_client.create_endpoint_config(
    EndpointConfigName = endpoint_config_name,
    ProductionVariants=({
        'InstanceType': instance_type,
        'InitialInstanceCount': 1,
        'InitialVariantWeight': 1,
        'ModelName': model_name,
        'VariantName': 'AllTraffic'}))
print("Endpoint config Arn: " + create_endpoint_config_response('EndpointConfigArn'))

# Deploy Model
endpoint_name="${Your Endpoint Name}"
print('Endpoint name: ' + endpoint_name)
create_endpoint_response = sm_client.create_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=endpoint_config_name)
print('Endpoint Arn: ' + create_endpoint_response('EndpointArn'))
resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp('EndpointStatus')
print("Endpoint Status: " + status)
print('Waiting for {} endpoint to be in service...'.format(endpoint_name))
waiter = sm_client.get_waiter('endpoint_in_service')
waiter.wait(EndpointName=endpoint_name)

Протестируйте развернутую модель

После успешного развертывания модели вы можете протестировать конечную точку с помощью экземпляра ноутбука SageMaker с помощью следующего кода:

import json
import boto3

sagemaker_runtime = boto3.client("sagemaker-runtime", region_name="us-east-2")
endpoint_name = "${Your Endpoint Name}"
request_body = {"input": "amazon"}
payload = json.dumps(request_body)
content_type = "application/json"
response = sagemaker_runtime.invoke_endpoint(
                            EndpointName=endpoint_name,
                            ContentType=content_type,
                            Body=payload # Replace with your own data.
                            )
result = json.loads(response('Body').read().decode())
print(result)

Заключение

В этом посте мы описали, как включить вывод GPT-2 с малой задержкой в ​​SageMaker для создания ценности для бизнеса. В частности, благодаря поддержке NVIDIA TensorRT мы можем добиться ускорения в 2,9 раза на экземплярах графического процессора NVIDIA с помощью SageMaker для индивидуальной модели GPT-2.

Если вам нужна помощь в ускорении использования моделей GenAI в ваших продуктах и ​​услугах, обратитесь в Центр инноваций AWS Generative AI. Инновационный центр генеративного ИИ AWS поможет вам быстрее и эффективнее воплотить ваши идеи в жизнь. Чтобы начать работу с Инновационным центром генеративного ИИ, посетите здесь.


Об авторах


Хао Хуан
— ученый-прикладник в Инновационном центре генеративного ИИ AWS. Он специализируется на компьютерном зрении (CV) и визуально-языковой модели (VLM). В последнее время он проявляет большой интерес к генеративным технологиям ИИ и уже сотрудничает с клиентами, чтобы применить эти передовые технологии в их бизнесе. Он также является обозревателем конференций по искусственному интеллекту, таких как ICCV и AAAI.

Зилонг ​​Бай — старший инженер по обработке естественного языка в Patsnap. Он увлечен исследованиями и проверкой концепции передовых методов генеративных языковых моделей.

Юаньцзюнь Сяо является архитектором решений в AWS. Он отвечает за консультирование и проектирование архитектуры AWS. Он также увлечен созданием ИИ и аналитических решений.

Сюэфэй Чжан является прикладным ученым в Центре инноваций AWS Generative AI, работает в областях NLP и AGI для решения отраслевых проблем с клиентами.

Гуан Ян — старший научный сотрудник в Центре инноваций AWS Generative AI Innovation Center, где он работает с клиентами в различных вертикалях и применяет творческий подход к решению проблем, чтобы создавать ценность для клиентов с помощью современных решений ML/AI.

LEAVE A REPLY

Please enter your comment!
Please enter your name here