Локальная приватность против облачной мощности: почему выбирать?
Ты читал мои статьи про фермы из трех RTX 3090 и серверы с 192 ГБ оперативки. Собрал (или только мечтаешь собрать) железного монстра для локальных LLM. Запустил Open WebUI, настроил модели. И столкнулся с классической дилеммой.
Модель 70B параметров еле дышит на твоем железе. Токенизация занимает вечность. Контекст в 128к токенов превращает инференс в слайд-шоу. А новая Llama 4 405B (вышла в конце 2025) даже не думает влезать в твои 48 ГБ VRAM.
Облачные GPU-сервисы вроде Vast.ai, RunPod или TensorDock предлагают A100 80GB за $1.5 в час. Но отдавать им свои промпты с конфиденциальными данными? Пересылать через их API диалоги с клиентами, финансовые отчеты, медицинские записи?
Нет. Так не пойдет.
Архитектура, которая работает, а не красиво выглядит на схеме
Забудь про сложные VPN, WireGuard и настройку маршрутизации. Мы используем старый добрый SSH-туннель с пробросом портов. Почему?
- SSH уже есть везде
- Авторизация по ключам безопаснее паролей
- Туннель шифрует весь трафик end-to-end
- Переподключение при обрыве — одна команда в systemd или screen
Вот как выглядит поток данных:
Твой компьютер → SSH-туннель → Облачный инстанс с GPU → VLLM API
↑ ↑
Open WebUI Модель 70B/405B
(локально) (загружена в VRAM)
1 Подготовка облачного инстанса: не просто GPU, а правильный GPU
Заходишь на Vast.ai или RunPod. Ищешь инстанс с:
| Что искать | Почему это важно | Минимум на 2026 |
|---|---|---|
| NVIDIA A100 80GB / H100 80GB | Память для больших моделей | 48+ GB VRAM |
| Ubuntu 22.04 / 24.04 LTS | Стабильность и совместимость | 22.04 или новее |
| Доступ по SSH | Для туннелирования | Обязательно |
| Публичный IP | Подключение извне | Да (или проброс портов) |
Создаешь инстанс. Копируешь IP и SSH-ключ. Не забудь добавить свой публичный ключ в authorized_keys на инстансе.
Совет от того, кто платил за простой: настрой авто-стоп через 1-2 часа неактивности. Или используй инстансы с прерываемым ценообразованием (spot instances). Экономия до 70%.
2 Установка VLLM на облачном инстансе: скорость, а не удобство
Заходишь по SSH на инстанс. Не трать время на Docker — ставь VLLM нативно. Он даст максимальную скорость инференса.
# Обновляем систему и ставим Python 3.11+
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv
# Создаем виртуальное окружение
python3 -m venv ~/vllm-env
source ~/vllm-env/bin/activate
# Ставим torch с поддержкой CUDA 12.4 (актуально на январь 2026)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
# Устанавливаем VLLM последней версии
pip3 install vllm
# Дополнительно: утилиты для мониторинга
pip3 install nvitop
Теперь запускаем VLLM сервер с моделью. Возьмем Qwen2.5 72B — хороший баланс качества и размера.
# Запускаем VLLM сервер на порту 8000
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--served-model-name qwen2.5-72b \
--port 8000 \
--host 0.0.0.0 \
--max-model-len 131072 \
--gpu-memory-utilization 0.9 \
--enforce-eager # Убирает graph compilation, стабильнее
Ждешь 5-10 минут пока скачается модель (если нет кэша). Видишь в логах Uvicorn running on http://0.0.0.0:8000 — отлично.
VLLM 0.4.0+ (релиз конца 2025) поддерживает continuous batching и PagedAttention v2. Это дает до 23x ускорение против llama.cpp на больших контекстах. Не используй старые версии.
3 SSH-туннель: мост между мирами
Теперь самое важное — безопасно подключить локальный компьютер к облачному VLLM. На локальной машине создаешь SSH-туннель:
ssh -N -L 8001:localhost:8000 user@cloud-instance-ip -i ~/.ssh/vast_key
Разберем эту магию:
-N— не открывать shell, только туннель-L 8001:localhost:8000— проброс порта: локальный 8001 → удаленный 8000-i ~/.ssh/vast_key— путь к приватному ключу
Теперь если откроешь в браузере http://localhost:8001, то подключишься к VLLM API на облачном инстансе. Но трафик шифрован через SSH.
Чтобы туннель не падал при разрыве сети, оберни его в systemd service или используй autossh:
# Установка autossh
sudo apt install autossh
# Запуск устойчивого туннеля
autossh -M 0 -N -L 8001:localhost:8000 user@cloud-ip -i ~/.ssh/key \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure yes"
4 Настройка Open WebUI для работы через туннель
У тебя уже стоит Open WebUI локально (если нет — смотри мою статью про локальную LLM-инфраструктуру). Теперь нужно научить его работать с нашим туннелированным VLLM.
Заходишь в настройки Open WebUI → Model Configuration → Add new model.
Параметры:
- Model ID: qwen2.5-72b-tunnel (любое имя)
- Model URL: http://localhost:8001/v1
- API Key: оставляешь пустым (VLLM не требует по умолчанию)
- Model Name: qwen2.5-72b (должно совпадать с --served-model-name в VLLM)
Сохраняешь. Пробуешь отправить промпт. Видишь ответ за 2-3 секунды вместо 20-30 на локальном железе.
Где собака зарыта: латентность, ошибки и подводные камни
В теории все гладко. На практике сталкиваешься с тремя проблемами.
1. Латентность токенизации
Ты отправляешь промпт «Расскажи о квантовой физике». Локальный Open WebUI токенизирует его (превращает в последовательность чисел). Отправляет через туннель на облако. Там VLLM принимает уже токенизированные данные, генерирует ответ, токенизирует его обратно в текст, отправляет тебе.
Проблема: токенизация на локальной машине может быть медленной, особенно для больших контекстов. Решение:
# На облачном инстансе запускаем VLLM с токенизатором
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-72B-Instruct \
--tokenizer Qwen/Qwen2.5-72B-Instruct \
--port 8000 \
--host 0.0.0.0
Теперь отправляешь с локальной машины чистый текст, а не токены. Небольшой оверхед по сети (текст больше токенов), но избавляешься от локальной токенизации.
2. Обрывы туннеля и потеря контекста
SSH-туннель упал посреди генерации ответа на 10-й странице. Весь контекст потерян. Раздражает.
Решение: настройка Keep-Alive и автоматического переподключения:
# В ~/.ssh/config на локальной машине
Host cloud-gpu
HostName cloud-instance-ip
User ubuntu
IdentityFile ~/.ssh/vast_key
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes
LocalForward 8001 localhost:8000
# Теперь подключаешься просто:
ssh -N cloud-gpu
И добавь эту команду в автозагрузку или systemd service.
3. Стоимость и оптимизация
A100 80GB стоит $1.5-2.5 в час. В месяц набегает $1000+ если держать постоянно. Но ты же не работаешь с LLM 24/7?
Сценарии:
- Работа с документами днем: включаешь инстанс утром, выключаешь вечером. 10 часов в день × 22 рабочих дня = 220 часов = ~$400 в месяц
- Спотовые инстансы: на Vast.ai spot instances дешевле на 60-80%, но могут прерваться в любой момент. Для асинхронной обработки — идеально
- Гибридный режим: маленькие модели (7B-13B) запускаешь локально на своем железе. Большие (70B+) — подключаешь к облаку по требованию
Не забывай останавливать инстанс! Настрой CloudWatch / мониторинг или используй инстансы с авто-стопом. Видел счета на $3000 за забытый инстанс, который проработал месяц вхолостую.
Альтернативы: когда SSH — не вариант
Бывает, что облачный провайдер не дает SSH-доступ (некоторые managed сервисы). Или корпоративный фаервол блокирует SSH на нестандартных портах.
Вариант Б: WireGuard VPN. Сложнее в настройке, но:
- Создаешь VPN-туннель между локальной сетью и облачным VPC
- VLLM слушает на внутреннем IP VPN (например, 10.0.0.2)
- Open WebUI подключается напрямую по VPN
- Плюс: весь трафик между сетями шифрован
- Минус: нужно настраивать маршрутизацию, iptables
Вариант В: Tailscale/ZeroTier. Еще проще:
# На облачном инстансе
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# На локальной машине
sudo tailscale up
# Получаешь Tailscale IP облачного инстанса
tailscale status
# В Open WebUI указываешь этот IP вместо localhost:8001
Tailscale создает mesh-сеть поверх интернета с шифрованием. Бесплатно до 100 устройств.
Что делать с чувствительными данными
Ты обрабатываешь медицинские записи, финансовые отчеты, персональные данные клиентов. Даже с шифрованием через SSH некомфортно отправлять это в облако.
Решение: локальная предобработка и анонимизация:
- На локальной машине ставишь маленькую модель (например, Mistral 7B)
- Пишешь скрипт, который находит в тексте имена, адреса, номера счетов
- Заменяешь их на [NAME_1], [ADDRESS_2], [ACCOUNT_3]
- Анонимизированный текст отправляешь в облако для обработки большой моделью
- Ответ де-анонимизируешь локально
Оверхед по времени 10-20%, но данные никогда не уходят в открытом виде.
Когда эта схема не работает
Прямо сейчас выключи компьютер, если:
- У тебя интернет с latency >200ms (спутниковый, мобильный 3G)
- Ты работаешь с real-time чатом, где нужна задержка <500ms
- Объем данных для обработки — терабайты в день (трафик будет дороже GPU)
- Требуется полная air-gap изоляция (военные, некоторые госструктуры)
Для остальных случаев — это рабочий, проверенный подход.
Что будет дальше: прогноз на 2027
Сейчас мы туннелируем API. Через год-два появятся специализированные протоколы для гибридного инференса. Представь:
- Клиент отправляет только embeddings, а не текст
- Облако возвращает только логиты, а не сгенерированный текст
- Сжатие контекста на лету для уменьшения трафика
- Стандартизированный протокол a la gRPC для LLM инференса
Пока этого нет — используй SSH-туннель и VLLM. Это работает сегодня. Прямо сейчас.
P.S. Если собрал гибридную систему и она работает — заходи в комментарии, расскажи про latency и стоимость. Если не работает — пиши, разберемся вместе. Мой рекорд — 42ms ping до облачного инстанса и генерация 1000 токенов за 8 секунд на Llama 3.1 405B. Попробуй побить.