Декодирование vLLM стратегии для повышения эффективности ваших выводов языковой модели

Расшифровка стратегии vLLM для повышения эффективности вашей языковой модели

Введение

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

Цели обучения

В этой статье вы узнаете о следующем:

  • Понимание проблем LLM-вывода и ограничений традиционных подходов.
  • Что такое vLLM и как он работает?
  • Преимущества использования vLLM для LLM-вывода
  • Как алгоритм PagedAttention vLLM справляется с этими проблемами
  • Интеграция vLLM в ваш рабочий процесс.

Эта статья была опубликована в рамках Data Science Blogathon.

Проблемы LLM-вывода

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

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

Что такое vLLM?

vLLM – это высокопроизводительный и эффективный по использованию памяти движок обслуживания LLM. Он работает с новым алгоритмом внимания, называемым PagedAttention, который эффективно управляет ключами внимания и значениями, разделяя их на более маленькие, более управляемые части. Такой подход снижает объем памяти vLLM и позволяет достигать большей пропускной способности по сравнению с традиционными методами обслуживания LLM. При тестировании vLLM продемонстрировал производительность в 24 раза лучше, чем конвенциональное обслуживание HuggingFace, и в 2-5 раза лучше, чем вывод генерации текста HuggingFace (TGI). Он также оптимизирует процесс вывода, непрерывно группируя и оптимизируя ядра CUDA.

Преимущества vLLM

vLLM предлагает несколько преимуществ по сравнению с традиционными методами обслуживания LLM:

  • Более высокая пропускная способность: vLLM может достигать до 24-кратно большей пропускной способности по сравнению с HuggingFace Transformers, самой популярной библиотекой LLM. Это позволяет обслуживать больше пользователей с меньшими ресурсами.
  • Меньшее использование памяти: vLLM требует очень мало памяти по сравнению с традиционными методами обслуживания LLM, что позволяет использовать его на платформах с ограниченными ресурсами.
  • Совместимый с OpenAI API: vLLM предоставляет совместимый с OpenAI API, что упрощает его интеграцию с существующими приложениями LLM.
  • Плавная интеграция с моделями Hugging Face: vLLM можно использовать с различными моделями, что делает его инструментом выбора для обслуживания LLM.

Начало работы с vLLM

Начать работу с vLLM очень просто. Сначала необходимо установить библиотеку VLLM, это можно сделать, как показано ниже.

pip install vllm

Выполнение вышеуказанной команды установит библиотеку vllm. Далее мы выберем модель, с которой начнем вывод:

from vllm import LLM, SamplingParams# выбор крупной языковой моделиllm = LLM(model="gpt2-xl")# настройка параметровsampling_params = SamplingParams(temperature=0.8, top_p=0.90,max_tokens = 50)

Библиотека vLLM

Здесь мы импортируем два класса из библиотеки vllm

  • LLM: Этот класс предназначен для загрузки моделей. В настоящее время vllm поддерживает множество моделей разных семейств, включая gpt, llama, vicuna, bloom и многие другие.
  • SamplingParams: Это класс для определения параметров модели, включающих такие вещи, как температура (насколько творческой должна быть модель), top_p (чтобы получить все самые верхние токены, общая вероятность которых составляет 0.9), max_tokens (максимальное количество токенов, которые модель может сгенерировать) и другие параметры модели.

Затем мы создаем объект LLM. Здесь мы выбираем модель gpt2-xl, модель с 1.5 миллиардами параметров. Затем мы устанавливаем конфигурации для модели, такие как температура, max_tokens и top_p.

Таким образом, запуск этого кода загрузит предобученную модель gpt-xl из HuggingFace Hub и загрузит модель в GPU. Теперь мы создадим Prompt и попробуем вывести модель. В то же время, давайте проверим, сколько времени займет генерация ответа.

%%time# определяем наш promptprompt = "Machine Learning is"# генерируем ответanswer = llm.generate(prompt,sampling_params)# получаем сгенерированный текст из переменной ответаanswer[0].outputs[0].text

Prompt

Здесь мы передаем Prompt «Machine Learning is» и затем передаем этот Prompt вместе с SampingParams в класс .generate() объекта LLM. Затем будет сгенерирован ответ. Ответ содержит список элементов типа RequestOutput. Каждый компонент списка включает сгенерированный текст и другую информацию. Но здесь нас интересует только сгенерированный вывод, который можно получить из ответа через outputs[0].text. Сгенерированный ответ можно увидеть ниже.

Мы видим, что время, затраченное на генерацию, составляет несколько миллисекунд, что довольно быстро. Кроме того, мы получаем адекватный вывод (gpt2-xl – это неплохая модель, которая не генерирует отличные ответы. Мы используем ее для демонстрационных целей, потому что она подходит для бесплатного GPU, предоставленного Colab). Теперь давайте попробуем дать модели список Prompts и проверим, сколько времени займет генерация ответов.

%%time# определяем наш promptprompt = [    "What is Quantum Computing?",    "How are electrons and protons different?",    "What is Machine Learning?",]# генерируем ответanswers = llm.generate(prompt,sampling_params)# получаем сгенерированный текст из переменной ответаfor i in range(3): print("\nPrompt:",prompt[i],"\nGeneration:",answers[i].outputs[0].text) print()

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

Мы можем проверить сгенерированный ответ модели gpt2-xl large language выше. Реакции не очень хорошие и обрываются посередине предложений, и это ожидаемо, потому что gpt2-xl не является лучшей моделью. Мы видим время, которое потребовалось для генерации ответа модели большого языка. Он занял 1 секунду для генерации ответов на все 3 вопроса вместе. Это отличная скорость вывода и может быть улучшена дополнительными вычислительными ресурсами.

Обслуживание LLM через vLLM

В этом разделе мы рассмотрим, как обслужить LLM через библиотеку vLLM. Процесс достаточно простой. С помощью vLLM можно создать сервер, очень похожий на протокол OpenAI API. Мы будем размещать сервер таким образом, чтобы его можно было достичь через Интернет. Давайте начнем, запустив следующие команды.

curl ipv4.icanhazip.com

В приведенной выше команде мы запускаем команду curl на веб-сайт ipv4.icanhazip.com. Это вернет общедоступный IPv4-адрес нашей машины. Этот общедоступный адрес будет использоваться позже для доступа к LLM в Интернете.

Реализация кода

Затем мы запускаем следующую команду Python для обслуживания модели Large Language Model.

python -m vllm.entrypoints.openai.api_server \    --host 127.0.0.1 \    --port 8888 \    --model bigscience/bloomz-560m \    & \    npx localtunnel --port 8888

Мы запускаем файл api_server.py из библиотеки vllm в приведенном выше примере. Мы предоставляем следующие параметры для этого файла.

  • Host: Это для указания хоста нашего API. Здесь мы будем работать с локальным хостом 127.0.0.1. LLM, который мы обслуживаем, может достигать только этого локального хоста. Все же позже мы откроем его для внешнего Интернета.
  • Port: Это порт, на котором мы хотим запустить наше приложение и это порт, на котором мы хотим обслуживать большую языковую модель. Мы можем назначить ему случайный порт, и мы выбираем порт 8888.
  • Model: Здесь мы указываем модель, которую мы хотим обслуживать с помощью vLLM. Как обсуждалось ранее, vLLM поддерживает множество семейств моделей, таких как GPT, Llama и Mistral (см. список здесь). Для этого примера мы выбираем модель bloomz-560m, модель с 560 миллионами параметров, которая помещается в GPU.

Работа с локальным туннелем

До этого момента vLLM загружает модель из хаба huggingface, загружает ее на GPU и запускает. Значение хоста localhost ограничивает внешние вызовы к обслуживаемой модели Large Language Model, ей можно обращаться только внутренне. Чтобы открыть ее для Интернета, мы работаем с локальным туннелем.

Щелкните ссылку, чтобы перейти на новый сайт, как показано ниже.

На этом новом сайте нам нужно указать общедоступный IP, который мы извлекли ранее. Затем щелкните кнопку «Отправить». После этого шага большая языковая модель Bloom, наконец, станет доступна в Интернете, и для ее доступа мы можем использовать ту же команду curl, которую мы использовали ранее.

OpenAI API

Теперь мы можем использовать стиль OpenAI API для доступа к обслуживаемой нами llm в Интернете. Давайте попробуем с помощью следующего примера.

Здесь я использую веб-сайт Hopscotch, который предоставляет бесплатный онлайн-инструмент для тестирования API. Здесь мы вставляем URL, предоставленный локальным туннелем. Мы явно указываем URL API completions (аналогично URL OpenAI Completions). В теле мы предоставляем следующие пары ключ-значение.

  • Model: В данном случае мы вызываем модель bloom.
  • Prompt: Это будет пользовательским приглашением.
  • Max_tokens: Максимальное количество сгенерированных токенов большой языковой моделью.
  • Temperature: Здесь устанавливается, насколько творческой будет модель, с 1 – наивысшей творчеством и 0 – наименьшей.

Запрос будет выполнен методом POST, потому что мы отправляем данные в API, а тип контента – application/json, потому что мы отправляем данные в формате JSON. Вывод для Prompt выглядит следующим образом:

Формат вывода очень похож на формат вывода OpenAI API, где сгенерированный текст находится внутри объекта choice. Сгенерированный ответ – «является крупнейшим производителем бананов в мире», что не является правдой и ожидаемо, потому что bloom-560 не является хорошо работающим LLм. Основная цель – проверить, как vLLм обеспечивает простое обслуживание больших моделей языка. Таким образом, мы можем легко заменить код OpenAI и vLLм благодаря аналогичному формату API.

Вывод

vLLм – это мощный инструмент, который может сделать выводы LмN более эффективными по памяти и обеспечить высокую пропускную способность. Работая с vLLм, мы можем развертывать крупные модели языка в производство, не беспокоясь о ограничениях ресурсов, что позволяет использовать мощь LмN для улучшения ваших приложений. API, очень похожее на OpenAI, позволяет разработчикам, работающим с OpenAI, быстро перейти к другим моделям.

Некоторые основные выводы из данной статьи:

  • vLLм – это высокоинтенсивный и эффективный по памяти механизм обслуживания LмN, который может решить эти проблемы
  • Он использует концепцию нового алгоритма внимания, называемого PagedAttention, который эффективно управляет ключами и значениями внимания
  • С помощью vLLм мы можем получить более высокую пропускную способность по сравнению с традиционными методами обслуживания LмN
  • Он совместим с моделями Hugging Face и предоставляет совместимый с OpenAI API
  • vLLм может использоваться для обслуживания LмN через API в стиле OpenAI

Часто задаваемые вопросы

Показанные в этой статье материалы не принадлежат Analytics Vidhya и используются по усмотрению автора.