Почему все хотят запускать большие VLM на краю сети, и почему это боль
В 2026 году роботам и дронам недостаточно просто 'видеть'. Им нужно понимать сцену, контекст, предсказывать действия. Vision-Language модели (VLM) типа NVIDIA Cosmos - это как раз то, что нужно. Но облачный инференс для робота? Забудьте. Задержки в 200 мс - это авария.
Проблема в том, что последние VLM, даже в квантованном виде, требуют памяти, которую на edge-устройствах считают роскошью. А еще ARM-архитектура, ограниченный CUDA Toolkit, вечная нехватка места под модели. И самое главное - инструменты для инференса, которые на x86 работают из коробки, на Jetson'е собираются через слезы и молитвы.
Что изменилось в 2026: vLLM выпустила стабильную поддержку ARM в версии 0.5.1. NVIDIA обновила JetPack до 6.0.1 с оптимизациями под трансформеры. А модель Cosmos-12B-Instruct получила версию с 4-битным квантованием специально для Jetson.
Что вам понадобится: железо и софт без компромиссов
Не пытайтесь запустить это на Jetson Nano. Серьезно. Минимум - Jetson Orin NX 16GB. А лучше - AGX Orin 64GB или новейший AGX Thor с 120 TOPS. Cosmos даже в квантованном виде кушает память.
- Jetson AGX Orin 64GB или Jetson AGX Thor (релиз в конце 2024, но в 2026 это стандарт для проектов с VLM)
- JetPack 6.0.1 (L4T R36.4) - только эта версия имеет все патчи для стабильной работы vLLM
- Не менее 40 ГБ свободного места на SSD (модель + кэш)
- Активный кулер - инференс будет грузить GPU на 90%+
- Доступ к интернету с хорошей скоростью (скачиваем 20+ ГБ весов)
Проверьте это первым: Запустите cat /etc/nv_tegra_release. Должно быть # R36 (release), REVISION: 6.0.1. Если у вас JetPack 5.x - обновляйтесь. vLLM 0.5.1 на нем работать не будет корректно.
1 Чистая установка и настройка окружения
Не устанавливайте ничего в системный Python. Сейчас создадим изолированное окружение с правильными версиями библиотек для ARM.
# Обновляем систему
sudo apt update
sudo apt full-upgrade -y
# Ставим системные зависимости
sudo apt install -y python3.10-venv python3.10-dev build-essential \
curl git-lfs cmake libopenblas-dev libxml2-dev libxslt-dev
# Создаем venv
python3.10 -m venv ~/cosmos_env
source ~/cosmos_env/bin/activate
# Обновляем pip и setuptools
pip install --upgrade pip setuptools wheel
Почему Python 3.10? Потому что в JetPack 6.0.1 это системная версия, и сборка некоторых нативных расширений для 3.11 и выше может вызвать проблемы. (Да, даже в 2026 году приходится считаться с системными ограничениями.)
2 Установка vLLM с оптимизациями под Jetson
Вот здесь большинство туториалов ломаются. Они предлагают просто pip install vllm, что скачивает бинарные wheels для x86. На ARM нужно собирать из исходников с правильными флагами.
# Устанавливаем Pytorch для Jetson - ОБЯЗАТЕЛЬНО с официального сайта NVIDIA
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu124
# Сначала ставим зависимости, которые нужны для сборки
pip install ninja packaging
# Клонируем vLLM с патчами для ARM (в ветке main на 01.03.2026 уже есть все нужное)
git clone https://github.com/vllm-project/vllm.git
cd vllm
# Собираем с оптимизациями под Jetson
MAX_JOBS=4 pip install -e . \
--no-build-isolation \
--config-settings=\"cmake.define.CUDA_ARCHITECTURES=87-real\" # Для Orin. Для Thor будет 90-real
# Проверяем установку
python -c "import vllm; print(f'vLLM версия: {vllm.__version__}')"
Флаг CUDA_ARCHITECTURES=87-real критически важен. 87 - это compute capability для Jetson Orin. Для AGX Thor будет 90. Если указать неверно, компилятор не сможет оптимизировать ядра, и производительность упадет в 2-3 раза.
sudo fallocate -l 8G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile. После установки можно удалить.3 Загрузка и подготовка модели NVIDIA Cosmos
На 01.03.2026 актуальная версия - Cosmos-12B-Instruct-v1.2-GPTQ-4bit. Находится она в репозитории Hugging Face, но весит около 8 ГБ. Убедитесь, что у вас есть место.
# Устанавливаем huggingface-hub
git lfs install
pip install huggingface-hub
# Скачиваем модель
python -c "
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='nvidia/Cosmos-12B-Instruct-v1.2-GPTQ-4bit',
local_dir='/home/nvidia/models/cosmos-12b-4bit',
ignore_patterns=['*.safetensors', '*.bin'], # Берем только конвертированные веса
local_dir_use_symlinks=False
)
"
Почему игнорируем safetensors? Потому что vLLM 0.5.1 на ARM иногда имеет проблемы с загрузкой safetensors. Лучше использовать конвертированные веса в формате .bin или .pt.
Если вы работаете с робототехническими задачами, вам может пригодиться подход из статьи про PhysicalAgent, где VLM адаптируют под управление роботами без тонкой настройки.
4 Запуск сервера vLLM с оптимизациями памяти
Теперь самое интересное. Запускаем сервер инференса с параметрами, которые не перегружают память Jetson.
# Экспортируем переменные для оптимизации
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
export VLLM_ATTENTION_BACKEND=XFORMERS # Используем xFormers для экономии памяти
# Запускаем сервер
python -m vllm.entrypoints.openai.api_server \
--model /home/nvidia/models/cosmos-12b-4bit \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.85 \
--max-model-len 2048 \
--served-model-name cosmos-12b \
--port 8000 \
--host 0.0.0.0 \
--dtype half \
--enforce-eager # Важно для избежания ошибок графа на ARM
Что здесь происходит:
--gpu-memory-utilization 0.85- оставляем 15% памяти для предобработки изображений--tensor-parallel-size 1- не пытаемся распараллеливать на несколько GPU (их у Jetson всего один)--enforce-eager- отключаем graph mode, который на ARM CUDA 12.4 может вести себя нестабильно--max-model-len 2048- ограничиваем контекст, иначе память закончится
Если видите ошибку CUDA out of memory, уменьшите --gpu-memory-utilization до 0.75. На Jetson Orin 32GB можно попробовать 0.9, но следите за температурой.
5 Тестирование: отправляем запрос с изображением
Сервер запущен на порту 8000. Он совместим с OpenAI API. Давайте протестируем.
Создаем тестовый скрипт:
import base64
import requests
import json
# Кодируем изображение в base64
with open("test_image.jpg", "rb") as image_file:
base64_image = base64.b64encode(image_file.read()).decode('utf-8')
# Формируем запрос для VLM
headers = {
"Content-Type": "application/json"
}
payload = {
"model": "cosmos-12b",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Что происходит на этом изображении? Опиши подробно."
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}"
}
}
]
}
],
"max_tokens": 300,
"temperature": 0.1
}
response = requests.post(
"http://localhost:8000/v1/chat/completions",
headers=headers,
data=json.dumps(payload)
)
print(response.json()['choices'][0]['message']['content'])
Это самый простой тест. В реальном проекте для дронов вам понадобится интеграция с камерами и системами управления. Посмотрите статью про End-to-End беспилотник на VLM - там показано, как заставить VLM принимать решения о полете.
Нюансы, о которых молчат официальные руководства
Тепловой троттлинг - враг номер один
Jetson под нагрузкой греется. Сильно. Если температура достигает 85°C, включается троттлинг - частота GPU падает, инференс замедляется в 2-3 раза.
Что делать:
- Установите активное охлаждение. Пассивного радиатора недостаточно.
- В мониторинге используйте
tegrastats. Следите за строкойGPUиTboard. - Если температура приближается к 80°C, добавьте в скрипт паузы между запросами.
Подготовка изображений: не кормите модель 4K
Cosmos принимает изображения 336x336 пикселей. Если вы подаете 4K кадр, vLLM сам ресайзит, но на это уходит драгоценное время CPU. Ресайзьте заранее.
# Правильно:
from PIL import Image
import io
img = Image.open("high_res.jpg")
img = img.resize((336, 336), Image.Resampling.LANCZOS)
# Теперь кодируйте в base64 и отправляйте
# Неправильно:
# Отправлять 4K изображение и надеяться, что vLLM справится
Пакетная обработка (batching) на Jetson - игра с огнем
vLLM поддерживает batching - обработку нескольких запросов одновременно. На серверных GPU это ускоряет throughput. На Jetson с его 64GB памяти (из которых 50 доступно для модели) batching может привести к OOM.
Рекомендация: для real-time приложений (робот, дрон) используйте batch size = 1. Для обработки логов или архивных данных можно попробовать batch size = 2, но мониторьте память.
А если нужно еще компактнее? Альтернативы
Cosmos-12B не помещается в 8GB? Есть варианты. Модель Youtu-VL-4B-Instruct работает в 8GB памяти. Или можно взять Cosmos-Reason2 в 4-битном квантовании - гайд по нему тут.
Но помните: чем меньше модель, тем хуже качество понимания сложных сцен. Для распознавания 'кошка на диване' хватит 4B. Для 'можно ли пересечь эту дорогу, учитывая скорость машин и состояние пешеходного перехода' - лучше 12B+.
Что дальше? Интеграция в реальную систему
Сервер vLLM - это только инференс. В реальном проекте вам нужно:
- Настроить прием изображений с камеры (ROS2, GStreamer)
- Добавить препроцессинг: детекцию объектов, обрезку ROI
- Постпроцессинг: парсинг ответа модели в команды управления
- Систему логгирования и мониторинга
И главное - тестирование. Не в лаборатории, а в условиях, приближенных к реальным. Потому что разница между 'модель работает' и 'модель работает достаточно надежно для автономного робота' - это около шести месяцев доводки.
На 2026 год тренд очевиден: VLM становятся достаточно эффективными для edge-устройств. Через год появятся 20B модели, которые будут работать там, где сегодня работают 12B. А значит, роботы станут чуть менее слепыми. Главное - правильно их развернуть.