Затрудняетесь с ИИ или разработкой полного стека? Наши эксперты готовы помочь вам: индивидуальные консультации, техническая интеграция и многое другое. Обращайтесь по адресу [email protected].

Как ускорить выводы глубокого обучения для трансформаторов обработки естественного языка

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

Используйте лучший CPU или GPU

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

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

В настоящее время наиболее широко используемыми GPU для вычислений в производстве являются NVIDIA Tesla T4 и V100.

Графический процессор NVIDIA Tesla

Но что делать, если вы уже обновили свое оборудование? Или что если ваш бюджет ограничен и вы не можете позволить себе использовать последние передовые дорогие графические процессоры? Читайте следующее!

Пакетный вывод

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

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

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

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

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

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

Наконец, пакетный вывод выполняется не самой моделью глубокого обучения, а слоем более высокого уровня, например, выделенным сервером выводов. уровень, например, выделенный сервер выводов. Реализовать такой слой не всегда просто. Для Например, Triton Inference Server от NVIDIA (см. ниже) очень хорошо справляется с пакетным выводом, но сначала вам нужно найти способ сделать вашу модель совместимой с Triton.

Как только вы экспортируете свою модель в Triton, пакетный вывод становится очень простым. Например, вот как создавать партии, состоящие из 128 запросов, и ждать не более 5 секунд перед обработкой партии (это нужно прописать в файле config.pbtxt). (это должно быть записано в файле "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Использование пользовательских внедрений

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

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

Вот пример того, как можно выполнить вывод для модели GPT Neo 2.7B благодаря DeepSpeed. Не слишком сложно, не правда ли?

# Filename: gpt-neo-2.7b-generation.py
import os
import deepspeed
import torch
from transformers import pipeline

local_rank = int(os.getenv('LOCAL_RANK', '0'))
world_size = int(os.getenv('WORLD_SIZE', '1'))
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B',
                        device=local_rank)



generator.model = deepspeed.init_inference(generator.model,
                                            mp_size=world_size,
                                            dtype=torch.float,
                                            replace_method='auto')

string = generator("DeepSpeed is", do_sample=True, min_length=50)
if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0:
    print(string)         
            

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

Используйте специализированный механизм вывода

Компании Microsoft и NVIDIA работали над усовершенствованными движками выводов, чтобы улучшить их производительности.

ONNX Runtime ("ORT") от Microsoft - это кроссплатформенный ускоритель машинного обучения для вывода и обучения. ускоритель (см. здесь). TensorRT ("TRT") от NVIDIA - это SDK для высокопроизводительного глубокого обучения. вычислений. Он включает оптимизатор и среду выполнения для глубокого обучения, обеспечивающие низкую задержку и высокую пропускную способность для приложений глубокого обучения (см. здесь).

Кроме того, NVIDIA Triton Inference Server - это программное обеспечение для обработки выводов, которое упрощает процесс обработки выводов ИИ. благодаря возможности развертывания моделей ИИ из различных фреймворков. Благодаря Triton вы можете например, легко выполнять пакетный анализ, запускать несколько моделей глубокого обучения одновременно на одном GPU, развертывать модели на нескольких GPU и многое другое. Смотрите здесь.

ONNX Runtime
TensorRT
Triton Inference Server

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

У вас есть несколько вариантов:

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

Заключение

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

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

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

Julien Salinas
Технический директор NLP Cloud