Запуск Llama.cpp в LXC Proxmox: пошаговый гайд с GPU passthrough | AiManual
AiManual Logo Ai / Manual.
28 Дек 2025 Гайд

Как запустить Llama.cpp в LXC-контейнере Proxmox: гайд для энтузиастов

Полное руководство по запуску Llama.cpp в LXC-контейнере Proxmox с поддержкой GPU. Настройка, оптимизация и решение проблем для локальных LLM.

Почему LXC и Proxmox для локальных LLM?

В мире локальных больших языковых моделей энтузиасты сталкиваются с дилеммой: как запустить ресурсоемкую LLM, не занимая всю систему и сохраняя возможность быстрого развертывания разных конфигураций? Ответ — контейнеризация через LXC на платформе Proxmox.

Ключевое преимущество: LXC предоставляет почти нативную производительность (1-3% оверхед против 10-20% у полноценных VM) при полной изоляции. Это идеально для экспериментов с разными версиями llama.cpp, CUDA и моделями.

Архитектура решения

Прежде чем переходить к практической части, важно понять, как устроена наша система:

Компонент Назначение Особенности
Proxmox (хостовый сервер) Гипервизор и менеджер контейнеров Debian-based, Web UI для управления
LXC контейнер (Ubuntu/Debian) Изолированная среда для llama.cpp Прямой доступ к GPU через cgroup2
llama.cpp Инференс-движок для LLM C++ реализация, поддержка CUDA/OpenCL
NVIDIA GPU Аппаратное ускорение Требуется правильная настройка драйверов
💡
Если вы только начинаете работать с локальными LLM, рекомендую сначала ознакомиться с обзором фреймворков для локального запуска LLM, чтобы выбрать оптимальное решение для ваших задач.

Предварительные требования

Перед началом убедитесь, что у вас есть:

  • Proxmox VE 7.x или 8.x (установленный и настроенный)
  • Свободные ресурсы: минимум 16 ГБ RAM, 50 ГБ диска
  • NVIDIA GPU с поддержкой CUDA (рекомендуется от RTX 3060 и выше)
  • Доступ в интернет для загрузки образов и моделей
  • Базовые знания Linux и командной строки

Важно: Для старых GPU (до 2018 года) могут потребоваться дополнительные шаги по настройке драйверов. Если у вас старое железо, посмотрите гайд по запуску LLM на старом железе.

1 Подготовка хостового сервера Proxmox

Первым делом нужно убедиться, что на хостовом сервере Proxmox правильно установлены драйверы NVIDIA и настроены cgroup'ы для передачи устройств в LXC.

Установка драйверов NVIDIA на Proxmox

# Обновляем систему
apt update && apt upgrade -y

# Устанавливаем заголовки ядра
apt install -y pve-headers-$(uname -r)

# Добавляем репозиторий NVIDIA
distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb

# Устанавливаем драйверы
apt update
apt install -y nvidia-driver-550 cuda-toolkit-12-4

# Проверяем установку
nvidia-smi

Настройка cgroup2 для GPU passthrough

LXC использует cgroup2 для контроля доступа к устройствам. Нужно настроить разрешения:

# Создаем конфигурацию для cgroup2
echo 'lxc.cgroup2.devices.allow = c 195:* rwm' >> /etc/pve/lxc/pve-gpu.conf
echo 'lxc.cgroup2.devices.allow = c 236:* rwm' >> /etc/pve/lxc/pve-gpu.conf
echo 'lxc.cgroup2.devices.allow = c 511:* rwm' >> /etc/pve/lxc/pve-gpu.conf

# Находим major/minor номера наших GPU устройств
ls -la /dev/nvidia*
# Пример вывода: crw-rw-rw- 1 root root 195,   0 Jan  1 00:00 /dev/nvidia0
# Здесь 195 — major, 0 — minor
💡
Если у вас несколько GPU и вы планируете масштабировать систему, изучите стратегии масштабирования локальных LLM для оптимального распределения ресурсов.

2 Создание и настройка LXC контейнера

Теперь создадим LXC контейнер с Ubuntu 22.04, который будет использоваться для запуска llama.cpp.

Создание контейнера через Web UI

В интерфейсе Proxmox:

  1. Нажмите "Create CT" в правом верхнем углу
  2. Выберите шаблон: Ubuntu 22.04 (или Debian 12)
  3. Установите ID контейнера (например, 110)
  4. Настройте ресурсы: CPU: 4-8 ядер, RAM: 16-32 ГБ, SWAP: 8 ГБ
  5. Диск: минимум 50 ГБ, лучше 100 ГБ для моделей
  6. Сеть: bridged или NAT в зависимости от вашей конфигурации
  7. DNS: укажите ваши DNS серверы

Настройка контейнера через консоль

После создания контейнера, зайдите в его консоль через Web UI или SSH и выполните:

# Обновляем систему
apt update && apt upgrade -y

# Устанавливаем базовые пакеты
apt install -y build-essential cmake git wget curl python3 python3-pip

# Устанавливаем CUDA toolkit (версия должна соответствовать хосту)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update
apt install -y cuda-toolkit-12-4

# Добавляем CUDA в PATH
echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

Настройка GPU passthrough в контейнере

Вернитесь на хостовый сервер и настройте контейнер для доступа к GPU:

# Останавливаем контейнер
pct stop 110

# Редактируем конфигурацию контейнера
nano /etc/pve/lxc/110.conf

# Добавляем следующие строки (подставьте свои major/minor номера):
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 236:* rwm
lxc.cgroup2.devices.allow: c 511:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file

# Запускаем контейнер обратно
pct start 110

Предупреждение: Если у вас AMD GPU, процесс будет отличаться. Для ROCm потребуется дополнительная настройка. Подробности в статье о проблемах с загрузкой LLM на AMD.

3 Установка и компиляция llama.cpp

Теперь внутри контейнера установим llama.cpp с поддержкой CUDA.

# Клонируем репозиторий (используем последнюю стабильную версию)
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

# Переключаемся на стабильную ветку
git checkout master

# Создаем директорию для сборки
mkdir build
cd build

# Конфигурируем с поддержкой CUDA
cmake .. -DLLAMA_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=all-major

# Компилируем (может занять 10-30 минут в зависимости от CPU)
make -j$(nproc)

# Проверяем, что CUDA работает
./bin/main --help | grep -i cuda

Оптимизация сборки для вашей GPU

Для максимальной производительности нужно указать правильную архитектуру CUDA:

Архитектура GPU Код архитектуры Пример GPU
Ampere sm_86, sm_87 RTX 30xx, A100
Ada Lovelace sm_89 RTX 40xx
Hopper sm_90 H100
# Пример для RTX 3090 (Ampere)
cmake .. -DLLAMA_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES=86

# Для нескольких GPU разной архитектуры
cmake .. -DLLAMA_CUBLAS=ON -DCMAKE_CUDA_ARCHITECTURES="75;80;86"

4 Загрузка и конвертация моделей

Llama.cpp работает с GGUF-форматом моделей. Нужно либо скачать готовые GGUF, либо конвертировать модели из других форматов.

Создание директории для моделей

# Создаем директорию
mkdir ~/models
cd ~/models

# Скачиваем пример модели (Mistral 7B)
wget https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf

Конвертация моделей в GGUF формат

Если у вас есть модель в формате PyTorch или Safetensors:

# Устанавливаем Python зависимости
pip install torch transformers accelerate

# Клонируем скрипты конвертации
cd ~/llama.cpp
python3 -m pip install -r requirements.txt

# Конвертируем модель (пример для Llama 3)
python3 convert.py /path/to/llama-3-model --outtype f16 --outfile /path/to/output.gguf
💡
Для тестирования разных моделей используйте коллекцию промптов для сравнительного анализа. Это поможет выбрать оптимальную модель для ваших задач.

5 Запуск и тестирование llama.cpp

Теперь запустим модель и проверим, что все работает корректно.

Базовый запуск с GPU ускорением

cd ~/llama.cpp/build

# Запуск интерактивного режима с GPU
./bin/main -m ~/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf \
  -n 512 \
  --color \
  --ctx-size 2048 \
  --temp 0.7 \
  --repeat-penalty 1.1 \
  -ngl 99 \
  -i

# Ключевые параметры:
# -ngl 99 - загрузить все слои на GPU (99 = все)
# -c 2048 - размер контекста
# -i - интерактивный режим

Запуск сервера llama.cpp

Для интеграции с другими приложениями запустим HTTP сервер:

./bin/server -m ~/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf \
  -c 4096 \
  --host 0.0.0.0 \
  --port 8080 \
  -ngl 99 \
  --parallel 4 \
  --cont-batching

# Теперь API доступен по http://ваш-ip:8080

Проверка производительности

# Бенчмарк производительности
./bin/perplexity -m ~/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf \
  -f ~/llama.cpp/tests/input.txt \
  -ngl 99 \
  -t 8

# Мониторинг использования GPU
watch -n 1 nvidia-smi

Оптимизация производительности

Для максимальной скорости работы llama.cpp в LXC контейнере:

  1. Выберите правильный квантование: Q4_K_M обычно лучший баланс между качеством и скоростью
  2. Настройте batch размер: Используйте --batch-size параметр, начиная с 512
  3. Оптимизируйте количество потоков: -t $(nproc) для CPU, но оставьте 2-4 ядра для системы
  4. Используйте flash attention: При сборке добавьте -DLLAMA_FLASH_ATTN=ON
  5. Настройте GPU слои: -ngl определяет, сколько слоев на GPU (больше = быстрее, но требует больше VRAM)
💡
Если у вас две видеокарты, изучите гайд по настройке dual RTX 3090 с NVLink для максимальной производительности.

Распространенные проблемы и решения

Проблема 1: GPU не определяется в контейнере

Симптомы: nvidia-smi не работает, ошибки CUDA.

Решение:

# Проверьте на хосте
ls -la /dev/nvidia*

# Убедитесь, что в конфиге контейнера правильные major/minor
# Перезапустите службы NVIDIA на хосте
systemctl restart nvidia-persistenced

# Проверьте драйверы внутри контейнера
ldconfig -p | grep cuda

Проблема 2: Нехватка памяти

Симптомы: Модель не загружается, ошибки CUDA out of memory.

Решение:

  • Используйте более агрессивное квантование (Q2_K, Q3_K_S)
  • Уменьшите количество GPU слоев (-ngl 20 вместо 99)
  • Увеличьте swap в контейнере
  • Рассмотрите использование CPU+RAM для части слоев

Проблема 3: Низкая производительность

Симптомы: Медленная генерация, низкие tokens/s.

Решение:

# Проверьте, что CUDA используется
./bin/main --help | grep -i cuda

# Оптимизируйте параметры сборки
# Пересоберите с правильной архитектурой CUDA

# Проверьте thermal throttling GPU
nvidia-smi -q -d temperature

Если вы столкнулись с другими ошибками, изучите гайд по избежанию основных ошибок при локальном запуске LLM.

Дальнейшая интеграция и расширение

После успешного запуска llama.cpp в LXC контейнере вы можете:

  1. Настроить автоматическое масштабирование: Создать шаблон контейнера и клонировать его для разных моделей
  2. Интегрировать с веб-интерфейсом: Установить SillyTavern, Oobabooga или другие фронтенды
  3. Реализовать RAG систему: Добавить векторную базу данных для расширения контекста
  4. Настроить балансировку нагрузки: Если у вас несколько GPU или контейнеров
  5. Добавить мультимодальность: Интегрировать с системами обработки изображений и аудио
💡
Для создания полноценного голосового ассистента изучите гайд по сборке голосового ассистента на одной видеокарте.

Заключение

Запуск llama.cpp в LXC контейнере Proxmox предоставляет идеальный баланс между производительностью, изоляцией и удобством управления. Вы получаете практически нативную скорость работы с GPU, возможность быстрого развертывания разных конфигураций и надежную изоляцию от основной системы.

Это решение особенно актуально для:

  • Энтузиастов, экспериментирующих с разными моделями
  • Разработчиков, нуждающихся в стабильной тестовой среде
  • Пользователей, желающих изолировать ресурсоемкие LLM от основной системы
  • Организаций, развертывающих локальные AI решения

Следуя этому руководству, вы сможете создать мощную, изолированную среду для работы с локальными большими языковыми моделями, которая легко масштабируется и управляется через удобный Web-интерфейс Proxmox.