Штучний інтелект
Оптимізація розгортання LLM: vLLM PagedAttention і майбутнє ефективного надання послуг AI

Розгортання великих мовних моделей (LLM) у реальних додатках представляє особливі виклики, особливо щодо обчислювальних ресурсів, затримки та ефективності витрат. У цьому комплексному посібнику ми дослідимо ландшафт надання послуг LLM, з особливим акцентом на vLLM (векторній мовній моделі), рішенні, яке змінює спосіб нашого розгортання та взаємодії з цими потужними моделями.
Виклики надання послуг великих мовних моделей
Перед тим, як перейти до конкретних рішень, давайте розглянемо ключові виклики, які роблять надання послуг LLM складним завданням:
Обчислювальні ресурси
LLM відомі своїми величезними кількостями параметрів, що варіюються від мільярдів до сотень мільярдів. Наприклад, GPT-3 має 175 мільярдів параметрів, тоді як більш недавні моделі, такі як GPT-4, мають ще більше. Ця величезна кількість параметрів перекладується у значні обчислювальні вимоги для висновків.
Приклад:
Розгляньте відносно скромну LLM з 13 мільярдами параметрів, chẳng hạn як LLaMA-13B. Навіть ця модель вимагає:
– Приблизно 26 ГБ оперативної пам’яті лише для зберігання параметрів моделі (при умові 16-бітної точності)
– Додаткової пам’яті для активацій, механізмів уваги та проміжних обчислень
– Значної потужності обчислень GPU для висновків у реальному часі
Затримка
У багатьох додатках, таких як чат-боти або генерація контенту у реальному часі, низька затримка є важливою для хорошого користувальницького досвіду. Однак складність LLM може привести до значних часів обробки, особливо для довгих послідовностей.
Приклад:
Представьте собі чат-бот для обслуговування клієнтів, який працює на основі LLM. Якщо кожна відповідь займає кілька секунд для генерації, розмова буде відчуватися нерівномірною та розчаровуючою для користувачів.
Витрати
Апаратне забезпечення, необхідне для запуску LLM у великих масштабах, може бути дуже дорогим. Часто необхідні високопродуктивні GPU або TPU, а енергоспоживання цих систем є суттєвим.
Приклад:
Запуск кластера GPU NVIDIA A100 (часто використовується для висновків LLM) може коштувати тисяч доларів на день у вигляді.cloud-витрат.
Традиційні підходи до надання послуг 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. Ця діаграма ілюструє формулу уваги та її компоненти:
- Запит (Q): Новий токен на етапі декодера або останній токен, який бачила модель.
- Ключ (K): Попередній контекст, до якого модель повинна звернутися.
- Значення (V): Важена сума попереднього контексту.
Формула обчислює оцінки уваги, приймаючи скалярний добуток запиту з ключами, масштабуючи на квадратний корінь розміру ключа, застосовуючи функцію softmax та, нарешті, приймаючи скалярний добуток зі значеннями. Цей процес дозволяє моделі зосередитися на відповідних частинах вхідної послідовності під час генерації кожного токену.
Порівняння пропускної здатності надання послуг
Це зображення представляє порівняння пропускної здатності надання послуг між різними фреймворками (HF, TGI та vLLM) за допомогою моделей LLaMA на різних апаратних конфігураціях.
- LLaMA-13B, A100-40GB: vLLM досягає у 14-24 рази вищої пропускної здатності, ніж HuggingFace Transformers (HF), та у 2,2-2,5 рази вищої пропускної здатності, ніж HuggingFace 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)
for output in outputs:
print(f"Промпт: {output.prompt}")
for i, out in enumerate(output.outputs):
print(f"Зразок {i + 1}: {out.text}")
Цей код ефективно генерує декілька зразків для заданого промпту, використовуючи оптимізації vLLM.
Бенчмаркінг продуктивності vLLM
Щоб повністю оцінити вплив vLLM, давайте розглянемо деякі порівняння продуктивності:
Порівняння пропускної здатності
На основі наданої інформації vLLM значно перевершує інші рішення з надання послуг:
– До 24 разів вищої пропускної здатності порівняно з Hugging Face Transformers
– У 2,2-3,5 рази вищої пропускної здатності порівняно з Hugging Face Text Generation Inference (TGI)
Ілюстрація:
“`
Пропускна здатність (Токенів/секунда)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“`
Ефективність пам’яті
PagedAttention vLLM призводить до майже оптимального використання пам’яті:
– Лише близько 4% витрат пам’яті, порівняно з 60-80% у традиційних системах
– Ця ефективність дозволяє служити більшим моделям або обробляти більше одночасних запитів на одному й тому ж апаратному забезпеченні
Початок роботи з vLLM
Тепер, коли ми дослідили переваги vLLM, давайте пройдемо процес установки та використання його у ваших проєктах.
6.1 Встановлення
Встановлення vLLM просте за допомогою pip:
!pip install vllm
6.2 Основне використання для офлайн-висновків
Ось простий приклад використання vLLM для офлайн-генерації тексту:
from vllm import LLM, SamplingParams
# Ініціалізація моделі
llm = LLM(model="meta-llama/Llama-2-13b-hf")
# Підготовка промптів
prompts = [
"Напишіть коротку поему про штучний інтелект:",
"Поясніть квантове обчислення простими словами:"
]
# Встановлення параметрів вибіркового дослідження
sampling_params = SamplingParams(temperature=0.8, max_tokens=100)
# Генерування відповідей
outputs = llm.generate(prompts, sampling_params)
# Друк результатів
for output in outputs:
print(f"Промпт: {output.prompt}")
print(f"Генерований текст: {output.outputs[0].text}\n")
Цей скрипт демонструє, як завантажити модель, встановити параметри вибіркового дослідження та генерувати текст для декількох промптів.
6.3 Настройка сервера vLLM
Для онлайн-сервісу vLLM забезпечує сервер API, сумісний з OpenAI. Ось як його налаштувати:
1. Запустіть сервер:
python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-2-13b-hf
2. Запитайте сервер за допомогою curl:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{"model": "meta-llama/Llama-2-13b-hf", "prompt": "Майбутнє штучного інтелекту включає:", "max_tokens": 100, "temperature": 0.7}'
Ця настройка дозволяє вам служити вашій LLM з інтерфейсом, сумісним з API OpenAI, що полегшує інтеграцію з існуючими додатками.
Просунуті теми щодо vLLM
Хоча vLLM пропонує суттєві поліпшення у сфері надання послуг LLM, існують додаткові аспекти та просунуті теми, які варто розглянути:
7.1 Квантування моделей
Для ще більш ефективного надання послуг можна застосовувати техніки квантування, особливо на апаратному забезпеченні з обмеженою пам’яттю. Хоча vLLM сам по собі не підтримує квантування, його можна використовувати разом з квантованими моделями:
from transformers import AutoModelForCausalLM, AutoTokenizer import torch # Завантаження квантованої моделі model_name = "meta-llama/Llama-2-13b-hf" model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_8bit=True) tokenizer = AutoTokenizer.from_pretrained(model_name) # Використання квантованої моделі з vLLM from vllm import LLM llm = LLM(model=model, tokenizer=tokenizer)
7.2 Розподілений висновок
Для дуже великих моделей або додатків з високим трафіком може бути необхідним розподілений висновок на декількох GPU або машинах. Хоча vLLM не підтримує це нативно, його можна інтегрувати до розподілених систем за допомогою фреймворків, таких як Ray:
import ray
from vllm import LLM
@ray.remote(num_gpus=1)
class DistributedLLM:
def __init__(self, model_name):
self.llm = LLM(model=model_name)
def generate(self, prompt, params):
return self.llm.generate(prompt, params)
# Ініціалізація розподілених LLM
llm1 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf")
llm2 = DistributedLLM.remote("meta-llama/Llama-2-13b-hf")
# Використання їх паралельно
result1 = llm1.generate.remote("Промпт 1", sampling_params)
result2 = llm2.generate.remote("Промпт 2", sampling_params)
# Отримання результатів
print(ray.get([result1, result2]))
7.3 Мониторинг та спостереження
Під час надання послуг LLM у виробництві моніторинг є важливим. Хоча vLLM не забезпечує вбудований моніторинг, його можна інтегрувати з інструментами, такими як Prometheus та Grafana:
from prometheus_client import start_http_server, Summary
from vllm import LLM
# Визначення метрик
REQUEST_TIME = Summary('request_processing_seconds', 'Час обробки запиту')
# Ініціалізація vLLM
llm = LLM(model="meta-llama/Llama-2-13b-hf")
# Експонування метрик
start_http_server(8000)
# Використання моделі з моніторингом
@REQUEST_TIME.time()
def process_request(prompt):
return llm.generate(prompt)
# Ваш цикл обробки запитів тут
Ця настройка дозволяє вам відстежувати метрики, такі як час обробки запиту, які можна візуалізувати у панелях Grafana.
Висновок
Ефективне надання великих мовних моделей є складним, але важливим завданням у епоху штучного інтелекту. vLLM, з його інноваційним алгоритмом PagedAttention та оптимізованою реалізацією, представляє суттєвий крок вперед у сфері надання послуг LLM.
Поліпшуючи пропускну здатність, зменшуючи витрату пам’яті та забезпечуючи більш гнучкі варіанти надання послуг, vLLM відкриває нові можливості для інтеграції потужних мовних моделей у широкий спектр додатків. Будь ви створюєте чат-бота, систему генерації контенту чи будь-який інший додаток, що використовує NLP, розуміння та використання інструментів, таких як vLLM, буде ключем до успіху.














