Привет, Хабр! Все чаще коллеги из ML замечают, что компаниям нравятся возможности ChatGPT, но далеко не каждая готова передавать данные во внешние АРІ и жертвовать своей безопасностью. В результате команды начинают внедрять open source-LLM, развернутые локально. Чтобы осуществить этот процесс, инженерам нужно выполнить две задачи.
- Сделать удобную «песочницу» для экспериментов, чтобы быстро проверять гипотезы для бизнеса.
- Эффективно масштабировать найденные кейсы внутри компании, по возможности снижая затраты на ресурсы.
В статье рассказываем, какие есть проблемы у open source-LLM и как оптимизировать инференс модели с помощью квантизации и LoRA-адаптеров. Подробности под катом!
Автор: Алексей Гончаров, основатель платформы Compressa.ai для разработки GenAI-решений на своих серверах.
LLM-платформа Compressa на инфраструктуре Selectel
Арендуйте готовую LLM-инфраструктуру от Compressa и Selectel, в облаке или на выделенных серверах. Ускоряйте цикл разработки и сокращайте издержки на генерацию токенов. Попробуйте бесплатно с двухнедельным тестом.
Проблемы у open source-LLM и их решение
Всего есть три ключевых фактора, из-за которых бизнесу сложно использовать модели на своем сервере: высокая стоимость, нехватка специалистов и низкое качество open source-LLM в прикладных задачах. Ниже расскажу о каждом подробнее.
Высокая стоимость ресурсов
Если команда хочет использовать LLM в продакшене с высокой нагрузкой или большим количеством пользователей, понадобится сервер как минимум с одной мощной GPU, например А100. Вот только подобное оборудование стоит дорого, и не каждый отдел или даже компания могут себе такое позволить.
А если для высокого качества ответов необходимо дообучение под разные бизнес-задачи? Тогда для запуска этого процесса понадобится целый кластер из GPU, а для хостинга каждый версии LLM — отдельный сервер. В результате расходы на вычислительные ресурсы увеличатся.
К примеру, стоимость NVIDIA A100 начинается от 800 тыс рублей за штуку. Также накладываются затраты на администрирование, обслуживание и другие расходы.
Мало экспертов
К сожалению, на рынке не так много специалистов, которые могут прийти в компанию и быстро развернуть локальную LLM. Они должны понимать, какая инфраструктура нужна под конкретные запросы компании, какие методы оптимизации стоит применять и как они влияют на работу модели. А также учитывать контекст использования LLM и приоритетные метрики в процессе настройки. Немногие обладают такими компетенциями.
Низкое качество ответов open source-LLM
Open source-LLM, особенно небольшого размера, часто показывают низкие результаты в специализированных задачах, поэтому использовать их для решения бизнес-проблем не получится. Улучшить результаты работы модели можно, если собрать подходящий датасет и правильно дообучить его под нужную задачу.
Инструменты
Чтобы решить эти проблемы, открытое сообщество активно развивает инструменты для снижения расходов на GPU. Первое — квантование. Преобразует модель в восемь, четыре и меньше бит, чтобы уменьшить объем памяти для запуска LLM. Второе — LoRA-адаптеры. Помогают быстрее и дешевле дообучать модели, а после — запускать их на одной видеокарте. Третье — фреймворки для инференса. Позволяют увеличивать производительность модели.
Если вам интересна тема статьи, присоединяйтесь к нашему сообществу «MLечный путь» в Telegram. Там мы вместе обсуждаем проблемы и лучшие практики организации production ML-сервисов, а также делимся собственным опытом. А еще там раз в неделю выходят дайджесты по DataOps и MLOps.
Как оптимизировать инференс LLM
Шаг 1. Выберите модель
Существует много открытых бенчмарков, которые помогают оценивать производительность. Однако их часто критикуют за переобучение моделей под определенные результаты. Закрытые, наоборот, предлагают более надежные данные, но доступ к ним ограничен.
Сравнение результатов на открытых академических бенчмарках.
Чтобы подобрать нужное решение, есть два способа выбора модели. С одной стороны, изучаем бенчмарки и то, как модели на них запускались. С другой — даем субъективную оценку качества работы в каждом из сценариев.
Сравнение моделей на прикладных задачах.
При этом результаты на русском языке и бенчмарках, как правило, хуже, поэтому нужно внимательно оценивать ответы на своих задачах. Благо, есть такие open source-проекты, как saiga. По сути, это алгоритм «русификации», который применяется к известным моделям, таким как Mistral или Llama.
Шаг 2. Дообучите модель под нужную задачу
В работе с прикладными задачами Compressa.ai использует не полный fine-tune модели, а подход LoRa-адаптеров. Fine-tune — сложная, хоть и эффективная операция. Компании нужны ресурсы и экспертиза специалистов, чтобы случайно не поломать модель. LoRa-адаптеры не меняют вес изначальной модели, при этом корректируют ее ответы под нужную задачу, например, под вывод на русском языке.
Полностью дообученной модели может понадобиться отдельная видеокарта. Тогда как LoRA-адаптеры позволяют подключить сразу несколько на одной и динамично переключать их в процессе обработки запросов.
Механизм работы LoRa-адаптеров на одном GPU.
Безусловно, увеличение количества адаптеров на один GPU снижает общую производительность, поэтому нужно найти оптимальный баланс исходя из требуемой нагрузки и доступного вам железа. Возможно, часть адаптеров понадобится перенести на другую видеокарту.
Шаг 3. Используйте квантизацию
Научное сообщество каждый год изобретает новые методы квантизации моделей. Наиболее известные — GPTQ и AWQ, SmoothQuant, OmniQuant, AdaRound, SqueezeLLM и другие. Они позволяют уменьшать размер модели и требования к GPU, а также минимизировать потери в качестве у ответов.
Методы квантования моделей.
Итоговый эффект квантования отличается у разных методов. Но чтобы получить определенный результат, нужно связать эти методы со сценариями, в которых потом применяют модели.
Например, мы хотим сделать lossless-модель, но для ограниченного набора задач. Для этого используем специальные методы, которые сжимают часть модели, но практически не влияют на ее вес. В результате модель будет также работать в ограниченных сценариях, но сильно хуже — в остальных.
Есть и другой вариант — использовать более универсальные методы. Модель потеряет небольшой процент метрик, но будет более-менее стабильно работать по всем задачам. С точки зрения математики эти методы ортогональны — можно комбинировать между собой и получать новые результаты.
Шаг 4. Используйте фреймворки инференса
Есть разные фреймворки для инференса модели, среди них — Llama.cpp, LMDeploy, vLLM, TensorRT-LLM и другие. Многие из них появились из научных статей: исследователи описывали новые способы оптимизации для определенных операций в процессе генерации токенов. Например, vLLM вырос из paged attention-подхода — открытое комьюнити контрибьютило туда остальные методы ускорения.
Каждый из этих фреймворков поддерживает разный набор оптимизаций и разную скорость добавления новых фич. Выбор оптимального зависит от доступного железа, среднего количество токенов на вход и выход, приоритетных метрик для оптимизации и других особенностей. ML-инженеры Compressa постоянно тестируют разные фреймворки, чтобы понимать их слабые и сильные стороны. Дополнительно контрибьютят в некоторые из них.
Шаг 5. Избегайте инференса на А100
Если вы обрабатываете большой поток запросов каждый день и хотите запускать Llama 70B, вам точно потребуется несколько А100. Однако для некоторых сценариев подойдут сборки и на экономичных GPU. Рассмотрим их подробнее.
Небольшие модели
Обычно специалисты начинают эксперименты с самыми сильными и большими LLM, чтобы посмотреть на максимальное качество ответов, доступных для конкретного бизнес-сценария. Но для некоторых задач подойдут модели с небольшим объемом памяти, например Phi-3. Их можно дообучить и эффективно запустить даже на очень бюджетной GPU.
Распределенный инференс LLM
Если желаемая LLM не помещается в память бюджетной видеокарты, возможно, не стоит сразу переходить на дорогое железо. Вы можете подключить несколько недорогих GPU в общий кластер, чтобы увеличить общий объем доступной памяти. В такой системе есть издержки на передачу информации, поэтому оптимальное решение задачи зависит от требований к задержке и пропускной способности.
Результаты сборок
Допустим, мы уже разработали решение. Каких результатов можно ожидать? Есть два варианта развития событий.
- Если запускать модели на мощных GPU, пропускная способность увеличится в 10-70 раз по сравнению с HuggingFace и PyTorch. Потребуется намного меньше железа для обработки такого же потока запросов, поэтому можно сильно сократить расходы.
- Если пока нет доступа к дорогим видеокартам или масштабированию, можно использовать бюджетные RTX 2080. Пропускная способность, конечно, будет страдать по сравнению с А100, но все еще останется большой.
Результаты ускорения на разных GPU.
Кейс: LLM для поисковых задач
Один из наших заказчиков использует LLM для улучшения индексации документов в поисковой системе. Ему необходимо было обрабатывать большой поток документов с регулярными обновлениями. Производительность LLM стала сдерживающим фактором для масштабирования решения.
Чтобы решить проблему, мы оптимизировали пайплайн для индексирования документов на LLM с большим количеством обновлений. После внедрения нужных оптимизаций добились ускорения в 20 раз. Теперь система может проиндексировать 200 тыс страниц вместо десяти за один и тот же период. При этом затраты на ресурсы сократились с четырех A100 до всего одной видеокарты.
Статья написана по мотивам доклада Compressa.ai на конференции MLечный путь. Видеозапись — по ссылке.
Shannon
Ну и как? Где руководство-то?
Да, да, очень интересно. Где гайд-то?
Текст достали из дальних чердаков палеозойской эры. Saiga, конечно, в свое время был интересным проектом, но он уже на столько устарел и даже близко не дотягивает до текущих уровней SOTA моделей.
Для тех кто всё же искал гайд и тоже не нашел его в статье, вот вам гайд:
Вам нужен сервер с OpenAI-совсместивым API, это может быть: ollama, llama.cpp.
Взять любой клиент, которые умеет подключаться к ChatGPT, и указать ему адрес этого локального сервера.
...
Профит.
Вот и весь гайд, но даже этого нет в статье, которая называется "Как настроить LLM на локальном сервере? Пошаговое руководство".
Список актуальных моделей хорошего качества, а не тот позор из статьи:
Qwen2.5
LLama 3.1 (название 3.2 внутри содержит туже 3.1 без изменений, просто добавлена мультимодальность)
Mistral Large 2 (и более младшие модели Mistral Nemo, Mistral Medium)
DeepSeek 2.5
Gemma2
Есть небольшие модели для кода, чтобы поднять свой локальный copilot: Codestral, Qwen2.5-Coder-7B, DeepSeek-Coder-V2-Lite.
Модели нужны в формате gguf, квантизация подойдет Q4_K_M. Q4 - это квантизация до 4 бит, K_M означает, что важные веса внимания квантованы более высоким квантом. IQ4 - означает квантование с imatrix, считается, что они весят меньше, значит требуется меньше видеопамяти, и при этом выдают лучше качество, но требуют больше вычислительных ресурсов.
Качать их тут:
https://huggingface.co/bartowski
https://huggingface.co/mradermacher/
Качать нужно те, где указано instruct, а не base. instruct модели обучены на выполнение заданий и просто чата, а base нужные для самостоятельного файнтюнинга.
Если модель влезает в видеопамять, можно получить больше скорости: exl2, vllm.
Для моделей выполненных по MoE (DeepSeek, WizardLM-2), отличное ускорение через ktransformers.
Бонусом модель, которая может заменить ChatGPT-4o mini, отлично разговаривает на многих языках, включая русский, и которая влезет в 24гб видеопамяти:
Модель: https://huggingface.co/bartowski/Qwen2.5-32B-Instruct-GGUF
Попробовать онлайн: https://huggingface.co/spaces/Qwen/Qwen2.5
Georgii_L
интересно. спасибо. Вопрос- а без 24 gb видеопамяти смысл есть что то ловить? на ноуте с 4050 и 6gb? или совсем в идеале- на телефоне с 8 gen 2 и 24 озу? посматривал на такие, но столько ОЗУ я вижу смысл не на сервере использовать разве что для ИИ вот это было бы прикольно.
и ещё такой вопрос- какие модели сейчас работают с доступом в интернет? что бы могли и подтягивать информацию и в идеале в фоновом процессе парсить информационный поток. И отвечать вечером на вопросы "как сегодня прошли торги на ММВБ? отчётность каких компаний отклонилась от консенсуса аналатиков?"
Shannon
В 6gb vram влезут квантованные Gemma2-9B, Qwen2.5-7B, Llama3.1-8b.
B - это количество параметров модели в млрд, чем больше, тем лучше, но только в рамках семейства одной модели, между собой модели могут сильно отличаться по качеству.
Например, vision модель Qwen2-VL-7B при размере в 1.5 раза меньше ощутимо превосходит Llama-3.2-vision-11B.
Модели можно запускать и CPU only, небольшие модели будут работать с приемлемой скоростью, также gguf позволяет комбинировать CPU + GPU, то, что не влезло в GPU будет крутиться на CPU.
Например, Qwen2.5-7B-Instruct-Q4_K_M требует для запуска 5-6гб. Суммаризировать эту статью на CPU only занимает 60 секунд, скорость 5 t/s, на GPU скорость 30 t/s:
Приложение PocketPal AI, Private AI, возможно есть и другие.
Сами модели не имеют доступа к интернету, оборудованию или файлам, этим занимаются клиенты.
Клиент ищет информацию по запросу, и подсовывает её модели, качество напрямую зависит от того, как эта часть реализована в клиенте (RAG with Web Search).
Это не реализовано в общем виде, вам нужно самостоятельно создать и запрограммировать агентов, которые будут доставать информацию с нужных сайтов и отправлять её в модель для анализа.
В общем виде такое пытается делает проект perplexity - поисковая система с ИИ, работает не особо хорошо, нет ни стабильности ответа, ни точности.
Локально это реализовано в https://github.com/ItzCrazyKns/Perplexica (сложно) и https://msty.app/ (просто). Но работает еще хуже чем perplexity, так как ответ модели напрямую зависит от поискового движка, который найдет правильную информацию.
Ответ от perplexity
Локально запущенная ollama, gemma2-9b и Perplexica
Theio
Юзаю codestral q4 + ollama + continue(vs code) для автодополнения в коде, прикольно, жаль ничего особо лучше на мои 16гб VRAM не влезет, а дополнение кода с CPU offload уж очень медленно.
Стоит отметить что для автодополнения нужны(крайне желательны) модели с FIM(fill in the middle) поскольку там юзается другой формат промпта где модели даётся кусок кода до и после места, и модель под эту задачу специально обучают.
Ещё больше из опыта перевода модели на инференс сервер заметил что квантизация в инты через bnb(bits and bytes, стандартный метод в transformers) работает в 2-3 раза медленнее fp/bf16 торча, для сервиса пришлось юзать vLLM для fp8 квантизация, она скорость не теряет, но тут надо железо поновее.
Uint32
Спасибо!
Тот случай, когда ценность комментария больше ценности статьи.
sanitar1988
В дополнение хотелось бы ещё добавить, то что если, при работе с локальными open source llm, используется какой то проект (типа LLamaSharp, для тех кто занимается разработкой на языке C#, как я например), то крайне(!) желательно знать ещё и шаблоны промтов!
Для каждой модели он свой (да бывают и схожие, если это модели от одной компании или это форк и оригинал) и для качественного ответа модели необходимо знать эти шаблоны
alexxxdevelop
Тот случай, когда добавил в закладки комментарий, а не статью. Публикуйте больше статей, пожалуйста. У вас много полезной информации