Почему локальный запуск LLM превращается в кошмар (и как это исправить)
Вы скачали модель на 70 миллиардов параметров, запустили её на своем RTX 3090... и получили ошибку "Out of memory" или скорость генерации 0.5 токена в секунду. Знакомая ситуация? Вы не одиноки. 80% пользователей сталкиваются с теми же проблемами при первом локальном запуске больших LLM.
Проблема не в ваших навыках, а в том, что запуск LLM — это не просто "загрузил и работай". Это комплексная задача, требующая понимания архитектуры модели, ограничений железа и правильных настроек оптимизации.
Ключевая мысль: Успешный локальный запуск LLM — это баланс между размером модели, доступной VRAM, скоростью генерации и качеством ответов. Невозможно максимизировать все параметры одновременно.
Основные ошибки и их решения
Давайте разберем самые частые проблемы, с которыми сталкиваются пользователи, и пошагово их исправим.
1 Ошибка #1: Неправильный выбор размера модели для вашего железа
Самая частая ошибка — попытка запустить модель, которая просто не помещается в вашу VRAM. 70B модель в полной точности требует ~140 ГБ памяти, а у RTX 4090 "всего" 24 ГБ.
| Модель (параметры) | Память в FP16 (примерно) | Минимальная VRAM для запуска | Рекомендуемая VRAM |
|---|---|---|---|
| 7B (7 миллиардов) | 14 ГБ | 8 ГБ (с квантованием) | 12+ ГБ |
| 13B (13 миллиардов) | 26 ГБ | 12 ГБ (с квантованием) | 16+ ГБ |
| 34B (34 миллиарда) | 68 ГБ | 20 ГБ (с квантованием) | 24+ ГБ |
| 70B (70 миллиардов) | 140 ГБ | 32 ГБ (с квантованием) | 48+ ГБ |
Решение: Сначала оцените свои ресурсы, потом выбирайте модель. Для большинства пользователей с 8-24 ГБ VRAM оптимальны модели 7B-13B с квантованием.
2 Ошибка #2: Игнорирование квантования моделей
Квантование — это самый мощный инструмент для запуска больших моделей на ограниченном железе. По сути, это сжатие весов модели с потерей некоторой точности, но с огромной экономией памяти.
Популярные форматы квантования:
- Q2_K: Сильное сжатие (2 бита), заметная потеря качества
- Q4_K_M: Оптимальный баланс для большинства задач
- Q6_K: Высокое качество при хорошем сжатии
- Q8_0: Почти без потерь, но сжатие только 2x
Практический пример с llama.cpp:
# Конвертация модели в квантованный формат
./quantize models/llama-2-7b.gguf models/llama-2-7b-Q4_K_M.gguf Q4_K_M
# Запуск квантованной модели
./main -m models/llama-2-7b-Q4_K_M.gguf \
-p "Расскажи о квантовой механике" \
-n 256 -t 8 -ngl 99
3 Ошибка #3: Фрагментация памяти и неправильная загрузка слоев
Даже если модель теоретически помещается в VRAM, вы можете получить ошибку из-за фрагментации. Особенно это актуально при использовании нескольких GPU или при частичной загрузке слоев в VRAM.
Важно: Современные LLM состоят из десятков слоев. Если вы указали загрузить 80% слоев в VRAM, но они не помещаются из-за фрагментации, модель не запустится, даже если свободной памяти в сумме достаточно.
Решение для llama.cpp:
- Используйте параметр
-ngl(number of GPU layers) осознанно - Начинайте с небольшого значения и увеличивайте
- Мониторьте использование памяти с помощью
nvidia-smi
# Постепенное увеличение слоев в VRAM
./main -m model.gguf -p "Привет" -n 128 -t 12 -ngl 20 # Начните с 20 слоев
./main -m model.gguf -p "Привет" -n 128 -t 12 -ngl 40 # Увеличьте до 40
./main -m model.gguf -p "Привет" -n 128 -t 12 -ngl 99 # Все слои в VRAM (если поместятся)
4 Ошибка #4: Неоптимальные настройки контекста и батчей
Размер контекста (context window) напрямую влияет на потребление памяти. Контекст в 4096 токенов требует в 2 раза больше памяти, чем контекст в 2048 токенов.
Оптимальные настройки для разных сценариев:
| Сценарий использования | Размер контекста | Размер батча | Потоки CPU |
|---|---|---|---|
| Чат/диалог | 2048-4096 | 1-4 | 4-8 |
| Анализ документов | 8192-16384 | 1 | 8-12 |
| Генерация кода | 4096-8192 | 1-2 | 6-10 |
Пошаговый план запуска LLM на RTX 3090 (24 ГБ VRAM)
Давайте соберем все знания в практический план для конкретного железа.
1 Шаг 1: Выбор модели и формата
Для RTX 3090 с 24 ГБ VRAM оптимальны:
- Модель 13B с квантованием Q4_K_M (~8 ГБ)
- Модель 34B с квантованием Q4_K_M (~20 ГБ)
- Модель 70B с квантованием Q3_K_M (~30 ГБ, потребуется разбиение на 2 GPU)
2 Шаг 2: Подготовка окружения
# Установка llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j$(nproc) LLAMA_CUBLAS=1
# Скачивание модели (пример для Mistral 7B)
huggingface-cli download TheBloke/Mistral-7B-Instruct-v0.1-GGUF \
mistral-7b-instruct-v0.1.Q4_K_M.gguf \
--local-dir ./models --local-dir-use-symlinks False
3 Шаг 3: Оптимальный запуск
# Оптимальные параметры для RTX 3090 с моделью 13B Q4_K_M
./main -m ./models/mistral-7b-instruct-v0.1.Q4_K_M.gguf \
--color \
--ctx-size 4096 \
--threads 10 \
--temp 0.7 \
--repeat-penalty 1.1 \
-n -1 \
-ngl 99 \
-p "Напиши Python-функцию для сортировки массива"
4 Шаг 4: Мониторинг и оптимизация
# Мониторинг использования VRAM
watch -n 1 nvidia-smi
# Альтернатива с подробной информацией
nvtop
Альтернативы: когда llama.cpp не подходит
Llama.cpp — отличный инструмент, но не единственный. Рассмотрим альтернативы:
vLLM — для максимальной скорости инференса
Если вам нужна максимальная скорость генерации и поддержка непрерывного батчинга:
# Установка vLLM
pip install vllm
# Запуск модели
from vllm import LLM, SamplingParams
llm = LLM(model="mistralai/Mistral-7B-Instruct-v0.1")
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
outputs = llm.generate(["Привет, как дела?"], sampling_params)
print(outputs[0].outputs[0].text)
Ollama — самый простой способ для начинающих
Если не хотите разбираться с настройками:
# Установка и запуск одной командой
curl -fsSL https://ollama.com/install.sh | sh
ollama run mistral
# Готово! Модель запущена и готова к работе
Оптимизация производительности: от 0.5 до 20+ токенов/сек
Скорость генерации зависит от десятков факторов. Вот как её повысить:
- Используйте GPU слои: Чем больше слоев в VRAM, тем быстрее (но не больше, чем помещается)
- Оптимизируйте количество потоков CPU: Обычно это количество физических ядер * 1.5
- Используйте квантование: Меньший размер модели = быстрее загрузка в память
- Настройте размер батча: Для интерактивного использования — batch 1, для обработки документов можно увеличить
- Обновите драйверы CUDA: Новые версии часто дают прирост 5-15%
Распространенные ошибки и их решения (FAQ)
Ошибка: "CUDA out of memory"
Причина: Модель не помещается в VRAM или слишком большой контекст.
Решение:
- Используйте квантованную версию модели (Q4_K_M или ниже)
- Уменьшите количество слоев в VRAM (параметр -ngl)
- Уменьшите размер контекста (--ctx-size)
- Закройте другие приложения, использующие GPU
Ошибка: Очень медленная генерация (0.5-2 токена/сек)
Причина: Слишком много слоев загружается в RAM вместо VRAM.
Решение:
- Увеличьте значение -ngl (но следите за памятью)
- Проверьте, что CUDA/cuBLAS правильно установлены
- Убедитесь, что модель действительно использует GPU (nvidia-smi показывает загрузку)
Ошибка: Модель "забывает" контекст или генерирует бессмыслицу
Причина: Слишком высокая температура или проблемы с квантованием.
Решение:
- Уменьшите температуру (--temp 0.7 вместо 1.0)
- Используйте более качественное квантование (Q6_K вместо Q4_K_M)
- Добавьте penalty за повторения (--repeat-penalty 1.1)
Чек-лист успешного запуска
- ✅ Выбрана модель под размер вашей VRAM
- ✅ Используется квантованная версия (Q4_K_M или аналогичная)
- ✅ Правильно настроено количество GPU слоев (-ngl)
- ✅ Оптимальный размер контекста (обычно 2048-4096)
- ✅ Правильное количество CPU потоков (ядра * 1.5)
- ✅ Драйверы CUDA обновлены до последней версии
- ✅ Нет конкурирующих приложений, использующих GPU
- ✅ Используется мониторинг (nvidia-smi) для проверки загрузки
Заключение: начните с малого, масштабируйтесь постепенно
Локальный запуск LLM — это не магия, а инженерная задача. Начните с небольшой модели (7B), отработайте настройки, поймите, как работает ваше железо, и только потом переходите к более крупным моделям.
Помните: даже 7B модель с правильными настройками может быть невероятно полезной. Не гонитесь за размером — гонитесь за эффективностью использования.
Самый важный навык при работе с локальными LLM — это не умение скачивать самые большие модели, а способность оптимизировать то, что уже работает на вашем железе. 13B модель, работающая на полной скорости, лучше, чем 70B модель, которая еле дышит.