Connect with us

Оптимизация развертывания LLM: vLLM PagedAttention и будущее эффективного обслуживания ИИ

Искусственный интеллект

Оптимизация развертывания LLM: vLLM PagedAttention и будущее эффективного обслуживания ИИ

mm
Deploy the vLLM Inference Engine to Run Large Language Models

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

Проблемы обслуживания больших языковых моделей

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

Вычислительные ресурсы

LLM известны своими огромными количествами параметров, варьирующихся от миллиардов до сотен миллиардов. Например, GPT-3 имеет 175 миллиардов параметров, а более новые модели, такие как GPT-4, как ожидается, будут иметь еще больше. Этот огромный размер переводится в значительные вычислительные требования для вывода.

Пример:
Рассмотрим относительно скромную LLM с 13 миллиардами параметров, такой как LLaMA-13B. Даже эта модель требует:

– Приблизительно 26 ГБ памяти только для хранения параметров модели (при условии 16-разрядной точности)
– Дополнительной памяти для активаций, механизмов внимания и промежуточных вычислений
– Значительной вычислительной мощности GPU для вывода в реальном времени

Задержка

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

Пример:
Представьте себе чат-бот для обслуживания клиентов, работающий на LLM. Если каждый ответ занимает несколько секунд для генерации, разговор будет казаться неестественным и раздражающим для пользователей.

Стоимость

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

Пример:
Запуск кластера GPU NVIDIA A100 (часто используемых для вывода LLM) может стоить тысяч долларов в день в виде облачных вычислительных сборов.

Традиционные подходы к обслуживанию LLM

Прежде чем исследовать более продвинутые решения, давайте кратко рассмотрим некоторые традиционные подходы к обслуживанию LLM:

Простая установка с Hugging Face Transformers

Библиотека Hugging Face Transformers предоставляет простой способ развертывания LLM, но она не оптимизирована для высокопроизводительного обслуживания.

Пример кода:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_name = "meta-llama/Llama-2-13b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)

def generate_text(prompt, max_length=100):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.decode(outputs[0], skip_special_tokens=True)

print(generate_text("Будущее ИИ"))

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

Использование TorchServe или аналогичных фреймворков

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

Понимание управления памятью в обслуживании LLM

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

Сегментированная память против страниц памяти

Эти два диаграммы сравнивают сегментированную память и страниц памяти, часто используемые в операционных системах (ОС).

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

Управление памятью в ОС против vLLM

Это изображение контрастирует традиционное управление памятью ОС с подходом к управлению памятью, используемым в vLLM.

  • Управление памятью ОС: В традиционных операционных системах процессы (например, Процесс А и Процесс Б) выделяются страницы памяти (Страница 0, Страница 1 и т. д.) в физической памяти. Это выделение может привести к фрагментации со временем, поскольку процессы запрашивают и освобождают память.
  • Управление памятью vLLM: Фреймворк vLLM использует кэш Key-Value (KV), чтобы управлять памятью более эффективно. Запросы (например, Запрос А и Запрос Б) выделяются блоки кэша KV (Блок KV 0, Блок KV 1 и т. д.). Этот подход помогает минимизировать фрагментацию и оптимизировать использование памяти, что позволяет служить моделям быстрее и более эффективно.

Механизм внимания в LLM

Механизм внимания в LLM

Механизм внимания в LLM

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

  • Запрос (Q): Новый токен на шаге декодера или последний токен, который модель видела.
  • Ключ (K): Предыдущий контекст, на который модель должна обратить внимание.
  • Значение (V): Взвешенная сумма по предыдущему контексту.

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

Сравнение пропускной способности обслуживания

vLLM: Легкое, быстрое и дешевое обслуживание LLM с PagedAttention

vLLM: Легкое, быстрое и дешевое обслуживание LLM с PagedAttention

Это изображение представляет собой сравнение пропускной способности обслуживания между различными фреймворками (HF, TGI и vLLM) с использованием моделей LLaMA на различных конфигурациях оборудования.

  • LLaMA-13B, A100-40GB: vLLM достигает в 14-24 раза более высокой пропускной способности, чем Hugging Face Transformers (HF), и в 2,2-2,5 раза более высокой пропускной способности, чем Hugging Face Text Generation Inference (TGI).
  • LLaMA-7B, A10G: Аналогичные тенденции наблюдаются, при этом vLLM значительно превосходит как HF, так и TGI.

vLLM: Новая архитектура обслуживания LLM

vLLM, разработанный исследователями в Университете Калифорнии в Беркли, представляет собой значительный шаг вперед в технологии обслуживания LLM. Давайте рассмотрим его ключевые функции и инновации:

PagedAttention

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

Разделение кэша Key-Value (KV): Вместо хранения всего кэша KV непрерывно в памяти PagedAttention делит его на фиксированные блоки.
Непрерывное хранение: Эти блоки могут храниться непрерывно в памяти, что позволяет более гибко управлять памятью.
Выделение по требованию: Блоки выделяются только при необходимости, что снижает浪费 памяти.
Эффективное совместное использование: Несколько последовательностей могут совместно использовать блоки, что позволяет оптимизировать методы, такие как параллельное выборочное моделирование и поиск лучшего варианта.

Иллюстрация:

“`
Традиционный кэш KV:
[Токен 1 KV][Токен 2 KV][Токен 3 KV]…[Токен N KV]
(Непрерывное выделение памяти)

Кэш PagedAttention KV:
[Блок 1] -> Физический адрес А
[Блок 2] -> Физический адрес С
[Блок 3] -> Физический адрес Б

(Непрерывное выделение памяти)
“`

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

Непрерывная пакетная обработка

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

Пример:
Представьте себе поток входящих запросов:

“`
Время 0 мс: Запрос А поступает
Время 10 мс: Начинается обработка запроса А
Время 15 мс: Запрос Б поступает
Время 20 мс: Начинается обработка запроса Б (параллельно с А)
Время 25 мс: Запрос В поступает

“`

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

Эффективное параллельное выборочное моделирование

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

Пример кода с использованием vLLM:

from vllm import LLM, SamplingParams

llm = LLM(model=”meta-llama/Llama-2-13b-hf”)
prompts = [“Будущее ИИ”]

# Генерировать 3 выборки для каждого запроса
sampling_params = SamplingParams(n=3, temperature=0.8, max_tokens=100)
outputs = llm.generate(prompts, sampling_params)

Я провел последние пять лет, погружаясь в увлекательный мир Machine Learning и Deep Learning. Моя страсть и экспертиза привели меня к участию в более чем 50 различных проектах по разработке программного обеспечения, с особым акцентом на AI/ML. Мое непрекращающееся любопытство также привело меня к Natural Language Processing, области, которую я с нетерпением жду возможности изучить более подробно.