Как выжать максимум из локальных LLM: Ollama против llama.cpp и новые кванты

Как выжать максимум из локальных LLM: Ollama против llama.cpp и новые кванты

Запуск локальных больших языковых моделей (LLM) стал проще благодаря таким инструментам, как Ollama и LM Studio. Однако, эти решения часто уступают в скорости и качестве по сравнению с более низкоуровневыми инструментами, такими как llama.cpp. В этой статье мы рассмотрим, как оптимизировать работу LLM на домашнем оборудовании, углубимся в нюансы квантования моделей, сравним производительность различных инструментов и обсудим последние достижения в области локальных LLM.

Что означают параметры моделей: 35B и A3B

В мире MoE (Mixture of Experts) моделей часто встречается именование вроде Qwen3.6-35B-A3B. Разберем его:

  • Qwen3.6: Название модели и её версия. Число до точки указывает на мажорное обновление архитектуры, а число после — на обновление внутри неё.
  • 35B: Общее количество параметров модели (B — Billion, миллиард).
  • A3B: Количество активных параметров (Active 3B). Чем больше параметров активно при генерации токена, тем выше качество, но ниже скорость.

Dense модели используют все параметры одновременно, что обеспечивает высокое качество, но снижает скорость. MoE модели работают быстрее за счет активации лишь части параметров, но качество может быть нестабильным.

Размер моделей и форматы данных: BF16 против FP32

LLM состоят из слоев, которые содержат матрицы-тензоры. Параметры модели — это общее число чисел в этих матрицах. Хранение в формате float32 (4 байта на число) приводит к огромным размерам моделей (35B модель весит около 130 Гб). Для уменьшения размера используются форматы с плавающей точкой, такие как float16. Однако, урезание экспоненты в float16 снижает диапазон значений, что критично для обучения нейросетей. Формат BF16 решает эту проблему, сохраняя широкий диапазон значений при уменьшенном размере.

Квантование моделей: уменьшение размера с сохранением качества

Квантование — это процесс преобразования чисел с плавающей точкой в целые числа для уменьшения размера модели. Различные уровни квантования (Int8, Int4, Int1.58) позволяют значительно сократить вес модели.

Современные методы квантования, разработанные в проекте llama.cpp (например, K-кванты и i-кванты), включают:

  • Блочное квантование: Применение разных коэффициентов масштабирования к разным блокам модели.
  • Калибровочная imatrix: Использование специального датасета для определения оптимального уровня квантования для каждого блока.
  • Раздельное квантование тензоров attn и ffn: Более слабое квантование блока внимания (Attention) для сохранения качества модели.

Новые обозначения квантов, такие как Q4_K_M или IQ4_XS, отражают эти улучшения. Разработчик ikawrakow создал форк ik_llama.cpp, где развивает продвинутые кванты (IQK), позволяющие еще сильнее сжимать модели без потери качества.

Проблема стандартных квантов и преимущества динамического квантования

Стандартные кванты, такие как Q4_K_M, предлагаемые по умолчанию в Ollama и LM Studio, часто устарели. Они используют статичную схему квантования, которая менее эффективна по сравнению с современными динамическими методами.

Динамическое квантование позволяет применять разные уровни сжатия к разным частям модели в зависимости от их важности. Разработчики, такие как Unsloth, создают собственные рецепты и датасеты для динамического квантования (например, UD-Q4_K_XL), которые показывают лучшие результаты по сравнению со статичными квантами при том же или даже меньшем размере.

Сравнение метрик KLD (Kullback–Leibler divergence) показывает, что UD-Q4_K_XL значительно превосходит классический Q4_K_M, а UD-Q3_K_XL показывает результаты на уровне Q4_K_M, но при меньшем весе.

Запуск llama.cpp на Nvidia и AMD

Для запуска llama.cpp необходимо скачать исполняемые файлы из официального репозитория. Для видеокарт Nvidia требуется установка CUDA, для AMD — Vulkan. Важно обновить драйверы для максимальной производительности.

После скачивания и распаковки архивов, модели скачиваются с Hugging Face. Запуск сервера осуществляется командой ./llama-server с указанием пути к модели и параметров, таких как размер контекста (-c) и режим работы (-ngl, -cmoe, -ncmoe).

Почему llama.cpp быстрее Ollama

Ollama использует движок GGML от llama.cpp, но не применяет оптимизированные режимы работы для MoE моделей, такие как ncmoe (non-CPU MoE), который обеспечивает загрузку GPU на 100% за счет точечного распределения тензоров. Ollama использует режим ngl (n-gpu-layers), который менее эффективен для MoE моделей.

Тесты показывают, что llama.cpp в режиме ncmoe работает в 2.8-3.2 раза быстрее Ollama на MoE моделях, даже при полной загрузке GPU. Режим fit в llama.cpp автоматически выбирает оптимальный режим работы (ncmoe для MoE, ngl для Dense) и рассчитывает параметры для максимальной производительности и экономии VRAM.

Сравнение квантов: UD-Q3_K_XL против UD-Q4_K_XL

Иногда кванты меньшего размера могут работать медленнее более крупных. Это может происходить из-за использования i-квантов (более сложных для вычислений) в меньших квантах, когда основная нагрузка ложится на CPU.

Возможности квантования UD-Q2_K_XL

Несмотря на распространенное мнение о низкой эффективности квантов Q2, современные динамические кванты, такие как UD-Q2_K_XL, демонстрируют впечатляющие результаты. Модель Qwen3.6-35B-A3B в этом кванте весит всего 12.3 Гб и способна создавать сложные проекты, включая рабочий клон Minecraft с процедурной генерацией графики.

REAP: оптимизация MoE моделей

REAP (Router-weighted Expert Activation Pruning) — это техника, позволяющая вырезать наименее активных экспертов из MoE моделей, сокращая их размер до 25-75% без существенной потери качества. Это особенно полезно для программирования. Однако, REAP может снижать производительность на других задачах и требует доработки для лучшей работы с разными языками.

Спекулятивное декодирование: ускорение больших моделей

Спекулятивное декодирование использует небольшую модель-черновик для ускорения генерации больших моделей, особенно в задачах программирования и перевода. Это позволяет увеличить скорость до 1.5 раз.

Оптимизация обработки контекста

Для ускорения обработки больших контекстов в режиме cmoe рекомендуется использовать параметры -ub и -b. Это позволяет значительно повысить скорость PP (prompt processing).

ik_llama: альтернатива llama.cpp

ik_llama.cpp — это форк llama.cpp, фокусирующийся на новых квантах и оптимизации работы с большим контекстом. Он предлагает более быструю обработку PP и экономию VRAM, но может уступать llama.cpp в скорости TG (token generation) для некоторых типов квантов и не поддерживает Vulkan/ROCm.

Linux vs Windows: сравнение производительности

Сравнение производительности на Linux и Windows показывает, что оптимизация под конкретную ОС и драйверы может существенно влиять на скорость работы LLM. Использование новейших версий CUDA и драйверов Nvidia, а также правильная компиляция llama.cpp, критичны для достижения максимальной производительности.

Использование встроенной графики для экономии VRAM

Переключение части приложений на встроенную графику (iGPU) позволяет высвободить 2-3 Гб VRAM для LLM, что может значительно повысить скорость работы, особенно на системах с ограниченным объемом видеопамяти.

Актуальные LLM на начало 2026 года

При выборе LLM важно обращать внимание на дату выхода модели. Новые модели, такие как Gemma4, Qwen3.5 и Qwen3.6, предлагают улучшенную производительность, поддержку больших контекстов и мультимодальные возможности. Для слабых ПК подходят модели размером 4B или оптимизированные варианты вроде Gemma4 E4B/E2B.

Заключение

Для достижения максимальной производительности локальных LLM рекомендуется использовать llama.cpp с его продвинутыми режимами работы (ncmoe, fit) и современными квантами (UD-Q4_K_XL, IQ4_KS). Динамическое квантование и оптимизация параметров позволяют значительно ускорить генерацию и обработку контекста. Использование инструментов вроде REAP и спекулятивного декодирования также открывает новые возможности для оптимизации.

Читать оригинал