Как развернуть llm на своем сервере: пошаговая инструкция с vLLM и Docker
Сегодня я подробно расскажу, как развернуть собственную LLMна сервере с нуля. Это практическое руководство для тех, кто хочет перестать зависеть от сторонних провайдеров и получить полный контроль над своими языковыми моделями.
Это руководство написано для новичков, но содержит достаточно технических деталей, чтобы быть полезным и опытным разработчикам. Мы пройдем путь от выбора подходящего сервера до работающего и защищенного API, с акцентом на экономию ресурсов и безопасности.
Выбор подходящего сервера под ваши задачи и LLM
Определение требований к ресурсам для LLM
Прежде чем арендовать сервер, критически важно понимать точные требования вашей модели. Я часто наблюдаю ситуацию, когда разработчики переплачивают в 3-4 раза за избыточные мощности или, наоборот, сталкиваются с постоянными ошибками из-за нехватки памяти.
Для популярной модели Qwen2.5-14B вот реальные требования:
- GPU: NVIDIA с поддержкой CUDA (RTX 3090/4090/A100)
- Видеопамять: минимум 16 ГБ для квантованной версии, 28+ ГБ для полной
- Оперативная память: 32 ГБ (рекомендовано)
- Диск: SSD объемом 100+ ГБ (модель занимает ~27 ГБ, плюс запас для кэша)
Как правильно оценить требования модели из HuggingFace
Выбирая модель на HuggingFace, обращайте внимание на несколько ключевых моментов:
- Размер файла: Файлы в формате .bin или .safetensors примерно соответствуют требуемому объему видеопамяти
- Теги квантования: Модели с пометками "AWQ", "GPTQ" или "GGUF" потребляют меньше памяти
- Документация авторов: В описании часто указывают минимальные требования
- История использования: Отзывы других пользователей в комментариях — ценный источник информации
Для начинающих я рекомендую начинать с квантованных версий моделей — они требуют меньше ресурсов, но при этом сохраняют 85-90% качества полных версий.
Пошаговая настройка сервера
Создание инстанса: правильная конфигурация под LLM
Рассмотрим детальный процесс создания сервера:
- Зарегистрируйтесь
- Перейдите в раздел "Виртуальные машины" → "Создать"
- Выберите параметры:
- ОС: Ubuntu 22.04 LTS
- Тариф: "GPU 1x RTX3090" (оптимальное соотношение цена/качество для 14B моделей)
- Диск: минимум 100 ГБ SSD (лучше взять 160 ГБ с запасом)
-
Сеть: публичный IP-адрес с защитой DDoS
-
Критически важный шаг: настройка SSH-ключа для безопасного доступа:
- Нажмите "Создать новый ключ" или загрузите существующий публичный ключ
- Сохраните приватную часть ключа в безопасном месте (файл с расширением .pem)
- Установите правильные права на файл:
chmod 600 путь_к_ключу.pem
Генерация SSH-ключа в Windows для подключения к серверу
Пользователям Windows необходимо правильно настроить SSH-ключи для подключения. Вот оптимальный способ через PowerShell:
# Запустите PowerShell от имени администратора
ssh-keygen -t rsa -b 4096 -C "ваш_email@example.com"
# Нажимайте Enter для всех вопросов (используйте расположение по умолчанию)
После генерации:
- Публичный ключ находится в C:\Users\<имя_пользователя>\.ssh\id_rsa.pub
- Приватный ключ в C:\Users\<имя_пользователя>\.ssh\id_rsa
- Скопируйте содержимое id_rsa.pub в панель при создании сервера
Для подключения к серверу используйте команду:
ssh -i "C:\path\to\your\key.pem" ubuntu@ВАШ_IP_АДРЕС
Если возникает ошибка прав доступа к файлу ключа, выполните:
icacls "C:\path\to\your\key.pem" /reset
icacls "C:\path\to\your\key.pem" /grant:r "$($env:USERNAME):(R)"
icacls "C:\path\to\your\key.pem" /inheritance:r
Базовая настройка сервера и установка необходимых компонентов
Обновление системы и установка базовых пакетов
После успешного подключения к серверу выполняем первоначальную настройку:
# Обновляем систему
sudo apt update && sudo apt upgrade -y
# Устанавливаем необходимые пакеты
sudo apt install -y htop curl git ufw unzip wget net-tools
Эти пакеты необходимы для мониторинга системы (htop), загрузки файлов (wget, curl), управления сетью (net-tools) и дальнейшей настройки безопасности (ufw).
Установка NVIDIA драйверов для GPU
Правильная установка драйверов — ключевой этап для работы LLM:
sudo apt install -y ubuntu-drivers-common
sudo ubuntu-drivers autoinstall
sudo reboot
После перезагрузки проверяем работу драйверов:
nvidia-smi
Если команда выводит таблицу с информацией о вашей видеокарте, температуре и используемой памяти — драйверы установлены успешно. Если возникает ошибка, возможно, требуется установить конкретную версию драйвера под вашу модель GPU.
Установка Docker и NVIDIA Container Toolkit
Docker значительно упрощает развертывание и изоляцию LLM моделей. Устанавливаем его официальным способом:
curl -fsSL https://get.docker.com | sudo bash
sudo usermod -aG docker $USER
newgrp docker
Для работы GPU внутри Docker контейнеров необходим NVIDIA Container Toolkit:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Проверяем корректность настройки:
docker run --rm --gpus all nvidia/cuda:12.1-base nvidia-smi
Если в выводе отображается информация о вашей GPU — всё готово к запуску LLM.
Обеспечение безопасности сервера с LLM
Настройка файрвола (UFW) для защиты сервера
Безопасность — неотъемлемая часть развертывания LLM. Начнем с базовой настройки файрвола:
sudo ufw allow OpenSSH
sudo ufw allow 8000/tcp
sudo ufw enable
sudo ufw status
Порт 8000 открываем, так как именно на нем будет работать наш vLLM API. Для повышенной безопасности рекомендуется ограничить доступ только с вашего IP:
sudo ufw allow from ВАШ_IP_АДРЕС to any port 8000 proto tcp
Защита от брутфорса с помощью Fail2Ban
Fail2Ban автоматически блокирует IP-адреса после нескольких неудачных попыток входа:
sudo apt install fail2ban -y
sudo systemctl enable fail2ban --now
По умолчанию Fail2Ban уже имеет настройки для защиты SSH. Для дополнительной защиты можно создать кастомные правила для защиты API.
Усиление безопасности SSH
Редактируем конфигурационный файл SSH:
sudo nano /etc/ssh/sshd_config
Вносим следующие изменения:
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 3
LoginGraceTime 30
Перезапускаем SSH-сервис:
sudo systemctl restart ssh
Эти настройки полностью отключают вход по паролю и запрещают вход под пользователем root, что значительно повышает безопасность сервера.
Запуск LLM через vLLM в Docker
Подготовка токена для доступа к моделям HuggingFace
Для загрузки моделей из HuggingFace Hub потребуется access token: 1. Перейдите на страницу настроек токенов 2. Создайте новый токен с правами "Read" (или "Write", если планируете загружать свои модели) 3. Сохраните токен в надежном месте — он понадобится при запуске контейнера. После закрытия окна, токен будет вам не доступен, поэтому запишите его.
Запуск контейнера с vLLM и моделью Qwen2.5-14B
Теперь мы готовы к запуску LLM. Используем официальный образ vLLM с поддержкой OpenAI API совместимости:
docker run --runtime nvidia --gpus all \
--name my_vllm_container \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HUGGING_FACE_HUB_TOKEN=ваш_токен_здесь" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-14B-Instruct
Разберем ключевые параметры команды:
- --runtime nvidia --gpus all — предоставляет контейнеру доступ ко всем GPU
- -v ~/.cache/huggingface:/root/.cache/huggingface — монтирует кэш для повторного использования загруженных моделей
- --env "HUGGING_FACE_HUB_TOKEN=..." — передает токен для доступа к HuggingFace
- -p 8000:8000 — пробрасывает порт для доступа к API
- --ipc=host — предоставляет доступ к существующим ресурсам хоста
- --model Qwen/Qwen2.5-14B-Instruct — указывает конкретную модель для загрузки
Проверка работоспособности API
После запуска контейнера (первый запуск может занять 10-15 минут из-за загрузки модели) проверяем доступность API:
curl http://localhost:8000/v1/models
Для тестового запроса:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{"model": "Qwen/Qwen2.5-14B-Instruct", "prompt": "Hello from vLLM!"}'
В ответе должна быть сгенерированная моделью текстовая последовательность.
Защита API с помощью ключа аутентификации
Для безопасности в публичном доступе добавляем API-ключ:
docker run --runtime nvidia --gpus all \
[остальные параметры] \
--api-key ваш_секретный_ключ_здесь \
vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-14B-Instruct
Теперь для доступа к API требуется использовать заголовок авторизации:
Authorization: Bearer ваш_секретный_ключ_здесь
Работа с LLM API через Postman и другие инструменты
Настройка Postman для тестирования LLM API
Хотя в командной строке удобно выполнять простые запросы, для полноценной работы с API лучше использовать Postman:
- Создайте новую коллекцию "LLM API"
- Добавьте запрос типа POST
- URL:
http://ВАШ_IP:8000/v1/completions - Во вкладке Headers добавьте:
Content-Type: application/jsonAuthorization: Bearer ваш_ключ(если настроена защита)- Во вкладке Body выберите raw и формат JSON, затем вставьте:
{
"model": "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4",
"messages": [
{
"role": "user",
"content": "Привет!"
}
]
}
Postman позволяет сохранять запросы, создавать переменные окружения (например, для IP и API-ключа) и визуализировать ответы — это значительно ускоряет работу с LLM API.
Интеграция с Python и другими языками программирования
Для интеграции LLM в свои приложения можно использовать стандартные библиотеки HTTP. Пример для Python:
import requests
API_URL = "http://ВАШ_IP:8000/v1/completions"
API_KEY = "ваш_ключ"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
payload = {
"model": "Qwen/Qwen2.5-7B-Instruct-GPTQ-Int4",
"messages": [
{
"role": "user",
"content": "Привет!"
}
]
}
response = requests.post(API_URL, headers=headers, json=payload)
print(response.json()['choices'][0]['text'])
Этот простой скрипт можно легко интегрировать в веб-приложения, чат-боты или системы автоматизации.
Типичные проблемы и их решение при развертывании LLM
Недостаточно видеопамяти для загрузки модели
Самая частая проблема при работе с большими моделями. Решения:
-
Используйте квантованные версии моделей:
bash --model Qwen/Qwen2.5-14B-Instruct-AWQ -
Уменьшите параллелизм:
bash --tensor-parallel-size 1 -
Выберите модель меньшего размера — например, Qwen2.5-7B вместо 14B
Проблемы с загрузкой модели из HuggingFace
Если модель не загружается или выдает ошибки доступа:
- Проверьте правильность токена HUGGING_FACE_HUB_TOKEN
- Убедитесь, что у токена есть права на доступ к конкретной модели (особенно для gated-моделей)
- Попробуйте предварительно скачать модель на локальный компьютер, а затем скопировать на сервер:
bash git lfs install git clone https://huggingface.co/Qwen/Qwen2.5-14B-Instruct scp -i ключ.pem -r Qwen2.5-14B-Instruct ubuntu@IP:/путь/к/моделям
Длительное время запуска контейнера
Первый запуск всегда дольше из-за: - Скачивания Docker-образа (~5 ГБ) - Загрузки модели (~27 ГБ для Qwen2.5-14B) - Компиляции ядер для конкретной архитектуры GPU
Решение: После первого успешного запуска сохраните состояние контейнера с помощью Docker commit:
docker commit my_vllm_container vllm-qwen25:preloaded
Затем используйте этот сохраненный образ для последующих запусков — это сократит время старта в 3-4 раза.
Заключение: следующие шаги и приглашение в сообщество
Сегодня мы подробно рассмотрели полный цикл развертывания LLM на собственном сервере. От правильного выбора конфигурации до экономии на хостинге — каждая деталь влияет на эффективность и стоимость эксплуатации.
Рекомендации для дальнейшего развития
Чтобы сделать вашу LLM инфраструктуру еще более эффективной и безопасной:
- Настройте Nginx reverse proxy с SSL-сертификатом для безопасного доступа по HTTPS
- Реализуйте автоматическое масштабирование — запускайте дополнительные инстансы при высокой нагрузке
- Добавьте мониторинг через Prometheus и Grafana для отслеживания использования ресурсов
- Настройте автоматическое резервное копирование моделей и конфигураций
Приглашение в закрытое сообщество
Я приглашаю вас присоединиться к нашему закрытому клубу. В сообществе мы:
- Делимся рабочими конфигурациями для разных моделей и задач
- Помогаем решать сложные технические проблемы
- Тестируем новые инструменты и методики до их массового распространения
- Организуем онлайн встречи
- Помогаем с написанием промптов
Чтобы получить приглашение в закрытый чат, перейдите в Telegram бота.
Помните: развертывание собственной LLM-модели — это не просто техническая задача, это шаг к возможность полностью контролировать свои проекты.
Смотреть видео на YouTube
Смотреть видео на RuTube
Авторизуйтесь, чтобы оставить комментарий.
Нет комментариев.