Иллюстрация к статье «Как выбрать и запустить LLM на своём железе: квантование, GGUF, LoRA и QLoRA»
Источник ↗

Статья 1. Базовая техническая часть

Фокус: выбор модели под VRAM, методы квантования, формат GGUF, fine-tuning и метрики деградации.

Локальный запуск модели ограничивается не только размером файла. В рабочую память должны поместиться веса модели, KV-cache для контекста, служебные буферы рантайма и часть временных данных. На практике главный ресурс - VRAM: она быстрее системной RAM и находится непосредственно рядом с вычислительными блоками GPU.

Если модель не помещается в VRAM, часть слоёв можно выгрузить в RAM, но скорость падает. Причина в том, что данные начинают идти через более медленную системную память и PCIe. RAM расширяет вместимость, но не заменяет VRAM по пропускной способности (вместе 100+ токенов в секунду - ожидайте 5-10).

KV-cache (память о деталях диалога в прошлом) растёт почти линейно с длиной контекста. Поэтому модель, которая запускается на 4K токенов, может не поместиться или заметно замедлиться на 64K токенов. При выборе файла нужно смотреть не только на размер GGUF, но и на запас VRAM под контекст.

График A - Теоретический размер весов моделей 7B, 14B, 32B и 70B при разной битности.
График A - Теоретический размер весов моделей 7B, 14B, 32B и 70B при разной битности. Источник ↗

2. Fine-tuning (дообучение уже готовой языковой модели на своих данных) без полного обновления весов: LoRA и QLoRA

Полный fine-tuning обновляет все или почти все веса модели. Это даёт максимальную гибкость, но требует много памяти: кроме весов нужно хранить градиенты, активации и состояния оптимизатора. LoRA решает задачу иначе: базовая матрица остаётся замороженной, а обучается небольшая низкоранговая добавка.

LoRA удобна тем, что вместо полного изменения матрицы обучаются две компактные матрицы адаптера. QLoRA добавляет ещё один уровень экономии: базовая модель хранится в квантизированном виде, а обучаются только LoRA-адаптеры. Поэтому QLoRA часто становится практическим вариантом fine-tuning на ограниченной VRAM.

Важно не смешивать обучение и последующий запуск. LoRA-адаптер можно хранить отдельно, можно слить с базовой моделью в merged weights, а потом уже экспортировать результат в GGUF для локального inference.

Рисунок 1 - Сравнение полного fine-tuning, LoRA и QLoRA.
Рисунок 1 - Сравнение полного fine-tuning, LoRA и QLoRA. Источник ↗
Рисунок 2 - Как работает LoRA: замороженная база и низкоранговый адаптер.
Рисунок 2 - Как работает LoRA: замороженная база и низкоранговый адаптер. Источник ↗

3. GGUF и квантование: что именно скачивается и запускается

GGUF - это формат упаковки модели для локального inference. Он хранит метаданные архитектуры, tokenizer, список тензоров и сами тензоры, часто уже в квантизированном виде. GGUF не является способом обучения: это формат доставки модели в рантайм вроде llama.cpp, Ollama, LM Studio или Unsloth Studio.

Квантование уменьшает размер весов за счёт замены точных чисел компактными кодами. Веса обычно квантуются блоками: у каждого блока есть свой scale, поэтому ошибка ниже, чем при одном масштабе на весь тензор. Чем меньше бит, тем меньше размер, но тем выше риск искажения поведения модели.

Обычный GGUF export обычно означает выбор готового метода квантования, например Q8, Q5, Q4, Q3 или Q2. Это не автоматический поиск лучшей схемы для каждого слоя. Хороший результат зависит от модели, метода квантизации, длины контекста, tokenizer/chat template и целевых задач

Рисунок 3 - Процесс экспорта модели в GGUF и локального запуска.
Рисунок 3 - Процесс экспорта модели в GGUF и локального запуска. Источник ↗
Рисунок 4 - Квантование весов в GGUF-моделях.
Рисунок 4 - Квантование весов в GGUF-моделях. Источник ↗

4. Почему качество кванта нельзя оценивать только по размеру файла

Два файла одинаковой битности могут вести себя по-разному. Причина в чувствительности слоёв: ошибка в одном блоке почти не влияет на результат, а ошибка в другом меняет распределение logits и ломает формат ответа. Поэтому современные агрессивные кванты используют калибровку, importance-aware подход и mixed precision.

imatrix можно понимать как статистику важности, полученную на калибровочных данных. Она помогает распределять ошибку квантования: важные веса и каналы штрафуются сильнее, менее чувствительные блоки можно сжимать агрессивнее. Но калибровочный набор должен быть похож на реальные задачи, иначе важность будет оценена неверно.

Perplexity полезна, но недостаточна. KL divergence сравнивает распределения токенов исходной и квантизированной модели и лучше показывает, насколько квант изменил поведение. Для практики всё равно нужны реальные тесты: русский язык, кодинг, long context, JSON, tool-calling, RAG и типовые пользовательские запросы.

Рисунок 5 - Importance-aware quantization и imatrix.
Рисунок 5 - Importance-aware quantization и imatrix. Источник ↗
Рисунок 6 - KL divergence и компромисс между размером и качеством.
Рисунок 6 - KL divergence и компромисс между размером и качеством. Источник ↗
Рисунок 7 - Mixed precision внутри модели.
Рисунок 7 - Mixed precision внутри модели. Источник ↗

5. Где заканчивается базовая теория и начинается Dynamic Quantization

В базовой статье достаточно понимать принцип: низкая средняя битность не означает одинаковую битность каждого слоя. Mixed precision позволяет хранить критичные блоки точнее, а объёмные и менее чувствительные блоки сжимать сильнее. Именно эта идея лежит в основе заранее подготовленных Dynamic-квантов.

Обычный export в GGUF - это conversion с выбранным методом. Dynamic GGUF - это уже подготовленный артефакт, где схема смешанной точности подбирается под конкретную модель и проверяется метриками. В этой статье это только мост к следующему материалу, потому что подробный разбор Unsloth Dynamic 2.0 Quants требует отдельной фокусировки

Рисунок 8 - Как работает dynamic quantization.
Рисунок 8 - Как работает dynamic quantization. Источник ↗
Рисунок 9 - Обычный GGUF export и Dynamic GGUF: сравнение подходов.
Рисунок 9 - Обычный GGUF export и Dynamic GGUF: сравнение подходов. Источник ↗

6. Полный workflow локальной модели

Практический путь выглядит так: выбирается базовая модель, готовится датасет и chat template, затем при необходимости выполняется LoRA/QLoRA fine-tuning. Результат хранится как адаптер, merged model или checkpoint, после чего модель экспортируется в GGUF и запускается в локальном runtime.

На границах этапов чаще всего возникают ошибки. GGUF не обучает модель, а только упаковывает её для inference. Если exported GGUF ведёт себя хуже исходного checkpoint, проблема может быть не только в квантовании: часто влияют tokenizer, EOS token, chat template и параметры запуска.

Рисунок 10 - Общий workflow локальной LLM и мост ко второй статье.
Рисунок 10 - Общий workflow локальной LLM и мост ко второй статье. Источник ↗

Что будет во второй статье

Следующая статья будет посвящена Unsloth Dynamic 2.0 Quants. Там фокус сместится с общей теории на конкретный стек Unsloth: где лежат готовые UD-кванты, как они отличаются от обычного GGUF export, как читать названия файлов, почему Dynamic 2.0 является model-specific mixed-precision подходом и как математически объяснить выбор важных и менее важных слоёв.

Источники и опорные материалы

Unsloth Dynamic 2.0 GGUFs: https://unsloth.ai/docs/basics/unsloth-dynamic-2.0-ggufs

Unsloth: Saving to GGUF: https://unsloth.ai/docs/basics/inference-and-deployment/saving-to-gguf

Unsloth: LoRA hyperparameters guide: https://unsloth.ai/docs/get-started/fine-tuning-llms-guide/lora-hyperparameters-guide

Unsloth: Qwen3.5 GGUF Benchmarks: https://unsloth.ai/docs/models/qwen3.5/gguf-benchmarks

LoRA: Low-Rank Adaptation of Large Language Models: https://arxiv.org/abs/2106.09685

QLoRA: Efficient Finetuning of Quantized LLMs: https://arxiv.org/abs/2305.14314

llama.cpp quantize README: https://github.com/ggml-org/llama.cpp/blob/master/tools/quantize/README.md

GGUF format documentation: https://github.com/ggml-org/ggml/blob/master/docs/gguf.md