Собственный ChatGPT на ноутбуке

Зачем компаниям собственный ассистент?

Зачем запускать локальный чат-ассистент и свои inference-движки

На сегодняшний день сложно представить нашу жизнь без чат-ассистентов. Мы используем их всюду: на работе - они помогают нам писать код и искать в нем же ошибки, составлять документы и автоматизировать простые задачи. В быту ChatGPT может дать совет по уходу за вашими цветами или подсказать рецепт запеканки. Работы, которую мы хотим возложить на чат-ассистентов много, но и самих ассистентов немало: ChatGPT, Claude, Gemini, Grok, DeepSeek… И это лишь верхушка айсберга. Каждую неделю выходят новые модели, а первые места в лидербордах и бенчмарках постоянно меняются.
Но иногда использовать такие модели нет возможности по разным причинам:
  • Приватность и безопасность данных. Облако становится недоступным, если компаниям требуется полная приватность и есть требование, чтобы данные компании не покидали параметр сети. К примеру мы не можем в чате с GPT разглашать персональные данные клиентов, NDA, банковскую тайну, врачебную тайну. В нашей компании по таким вопросам мы консультируемся с экспертами не выгружая в ассистентов подобные данные.
  • Доступ к лучшим нейронкам через VPN.
  • Цены на подписки и API при большом количестве запросов могут вылиться в круглую сумму.
  • Зависимость от внешних провайдеров.
Мы разобрались почему у нас может возникнуть потребность запустить чат-ассистента для себя или даже для своей компании. Следующий вопрос - а как это сделать?

Как inference-движки ускоряют работу LLM

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


from transformers import AutoModelForCausalLM, AutoTokenizer 

model=AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct").to("cuda") 
tokenizer=AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct") 

prompt = "Объясни что такое KV cache" 

inputs = tokenizer(prompt, return_tensors="pt").to("cuda") 

outputs = model.generate(**inputs, max_new_tokens=100) 

print(tokenizer.decode(outputs[0])) 
Такой подход действительно будет работать и мы сможем получать ответы от нейронки на нашем ПК. Но это будет не оптимизировано, а для LLM оптимизация может сэкономить большое количество ресурсов.

Экономия памяти: KV Cache и PagedAttention

Главная проблема при работе с LLM — огромное потребление памяти. Но дело не только в весах модели. Основной «пожиратель» памяти — это KV cache. Когда модель генерирует текст, она делает это по одному токену за раз. Для каждого нового токена ей нужно «вспомнить» всё, что было сказано ранее — весь контекст диалога. Для этого существует механизм внимания, который работает по формуле:

Attention (Q, K, V) = softmax (QKT/√dk),

где Q - запрос (query) для текущего токена, K - ключи (keys) всех предыдущих токенов, V - их значения (values). Чтобы не пересчитывать K и V для всей истории заново на каждом шаге генерации, они сохраняются в памяти - это и есть KV cache. KV cache может занимать 30-80% памяти на GPU!

Исследователи из Berkeley AI Research предложили решение, вдохновлённое виртуальной памятью в операционных системах - PagedAttention. KV cache разбивается на блоки фиксированного размера (обычно 16-32 токена на блок). Блоки хранятся в пуле памяти и переиспользуются между разными запросами. Если два запроса имеют общий префикс (например, одинаковый system prompt), блоки можно переиспользовать физически. Это позволяет экономить вплоть до 50-80% памяти по сравнению с наивным подходом.

Ускорение вычислений: FlashAttention

Даже если памяти достаточно, остаётся проблема скорости. Стандартная реализация attention механизма в трансформерах работает медленно не из-за количества вычислений, а из-за постоянных обращений к медленной GPU памяти (HBM). FlashAttention решает эту проблему через разбиение матриц на маленькие блоки, которые полностью умещаются в быструю память (SRAM), и затем происходит объединение всех операций attention в один проход без промежуточных записей в медленную память. В результате генерация ускоряется в 2-4 раза и появляется возможность работать с более длинными контекстами.

Умное формирование батчей:
Continuous Batching

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

Ollama

Ollama - не обладает некоторыми оптимизациями, которые есть у других движков (классический PagedAttention и полноценный continuous batching), но компенсирует это максимальной простотой использования. Это популярный способ начать работу с локальными LLM благодаря быстрой установке и большому выбору готовых моделей. Загрузка модели производится командой:
ollama pull qwen2.5:7b,

а запуск диалога в консоли через ollama run qwen2.5:7b 

Следующим кодом мы можем подключиться к модели через OpenAI-compatible API:
from openai import OpenAI

client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama"
)

response = client.chat.completions.create(
model="qwen2.5:7b",
messages=[{"role": "user", "content": "Объясни что такое KV cache"}]
)
print(response.choices[0].message.content) 
Ollama отлично подходит для локального использования и быстрого старта, однако предоставляет ограниченное количество настроек. Если же требуется масштабируемость и обработка большого числа запросов (например, корпоративный чат), стоит рассмотреть другие варианты.

vLLM

vLLM, в отличие от Ollama, поддерживает все ключевые оптимизации: PagedAttention, FlashAttention и continuous batching. Благодаря этим технологиям vLLM может эффективно обрабатывать десятки и даже сотни запросов одновременно с высокой скоростью генерации и минимальным потреблением памяти. Движок предлагает гибкие настройки - от размера контекста до уровня квантизации и распределения модели на несколько GPU, что делает его универсальным решением для разных задач. vLLM - один из самых популярных inference-движков среди разработчиков, особенно для крупных проектов, где критичны производительность и масштабируемость.
docker run --gpus all -p 8000:8000 vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000

Подключение через OpenAI-compatible API:

from openai import OpenAI

client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)

response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[{"role": "user", "content": "Объясни что такое KV cache"}]
)
print(response.choices[0].message.content)
vLLM — это настоящий конвейер для обработки запросов через LLM. Он может одновременно обслуживать большое количество пользователей и генерировать сотни ответов, при этом предоставляя широкие возможности для настройки.

Наш опыт.


Локальный медицинский ассистент на vLLM: как Webbee помогает врачам быстрее и безопаснее анализировать результаты исследований

В рамках проекта нашей компании Webbee для медицинской лаборатории, мы интегрировали локальную LLM для проведения анализа результатов лабораторных исследований. Модель выявляет риски для здоровья, а также дает советы по питанию и образу жизни. Мы запускали finetuned 14b модель на vLLM, что позволило обрабатывать запросы с высокой скоростью и минимальным потреблением памяти благодаря оптимизациям движка.

Имея такого ассистента, врачам удается проводить более подробный анализ и не упускать важных деталей медицинского состояния пациента. LLM помогает систематизировать выводы, выделять ключевые отклонения и предлагать обоснованные рекомендации, что существенно ускоряет процесс принятия решений. Благодаря локальному развертыванию, вся работа с данными пациентов остаётся полностью защищённой, а врачи получают надёжного помощника для повседневной практики.
Нажимая на кнопку «Отправить», я подтверждаю, что согласен(на) с политикой конфиденциальности
Оставить заявку
Мы используем файлы cookie. Продолжая пользоваться сайтом, вы соглашаетесь с их использованием в соответствии с Политикой конфиденциальности.
OK