Перейти к содержанию
Новое AiManual теперь в MAX Подписаться
Публикация AiManual

KNOD в Linux: прямой сетевой оффлоадинг на AMD GPU — архитектура, настройка и первые тесты

Патч KNOD для ядра Linux открывает прямой сетевой оффлоадинг на AMD GPU, снижая задержки на 50% и разгружая CPU. Разбираем архитектуру, настройку ROCm, бенчмарк

Коротко

Что будет в материале

  1. 01

    Что такое KNOD и почему это важно для AI-инференса

  2. 02

    Архитектура KNOD: как данные идут напрямую в GPU

  3. 03

    Практическая настройка: от патча до первого теста

  4. 04

    Сценарии использования в кластерах AI-инференса

Что такое KNOD и почему это важно для AI-инференса

KNOD (Kernel Network Offload Device) - это новый механизм ядра Linux, позволяющий напрямую перенаправлять сетевые операции на GPU AMD без участия CPU-памяти. Патч, появившийся в списках рассылки ядра в июле 2026 года, решает фундаментальную проблему кластерного инференса: процессор перестаёт быть узким местом при передаче данных между узлами.

Традиционный путь сетевого пакета выглядит так: сетевая карта копирует данные в буфер ядра, оттуда - в пользовательское пространство CPU, затем фреймворк (PyTorch, TensorFlow) переносит их в память GPU через PCIe. Три копирования. Три точки задержки. На каждом шаге CPU тратит циклы на операции memcpy, обработку прерываний и переключение контекста. При инференсе больших моделей с тензорным параллелизмом эти накладные расходы съедают до 15-20% времени итерации.

KNOD устраняет посредника. Сетевая карта через DMA-BUF и механизмы прямого доступа к памяти передаёт пакеты напрямую в видеопамять GPU. CPU только настраивает маршрут и уходит в сторону. Результат: задержка снижается на 30-50%, загрузка CPU падает, а пропускная способность приближается к теоретическому пределу PCIe-шины.

Для кластерного запуска LLM это критично. Модель на 400+ ГБ, распределённая по 8-16 узлам, генерирует гигабайты промежуточных активаций каждую секунду. Сокращение времени коммуникации напрямую увеличивает частоту токенов на выходе. Наш эксперимент с GLM-5.2 на 16 AMD MI50 показал, что сеть 10GbE становится главным бутылочным горлышком при масштабировании. KNOD частично снимает это ограничение.

Архитектура KNOD: как данные идут напрямую в GPU

Архитектурно KNOD встраивается между сетевым стеком Linux и драйвером AMD GPU. Ключевые компоненты: netdev-интерфейс для регистрации сетевого устройства как оффлоад-цели, подсистема DMA-BUF для прямого маппинга буферов GPU в адресное пространство сетевой карты и расширение ROCm, добавляющее API для управления оффлоадом из пользовательского пространства.

Поток данных выглядит так. Сетевая карта получает пакет, помеченный как предназначенный для GPU. Ядро через DMA-BUF получает физический адрес буфера в видеопамяти. Сетевая карта выполняет DMA-запись напрямую в VRAM, минуя системную память. GPU получает прерывание или polling-уведомление о новых данных. Всё. CPU в этом сценарии только обрабатывает заголовки пакетов на уровне ядра - полезная нагрузка идёт мимо.

Сравнение с GPUDirect RDMA неизбежно. Оба механизма решают одну задачу - прямой доступ к памяти GPU. Разница в реализации: GPUDirect требует InfiniBand или RoCE-совместимых сетевых карт и работает через проприетарные драйверы NVIDIA. KNOD использует стандартный сетевой стек Linux и работает поверх Ethernet, включая дешёвые 10/25GbE-адаптеры. Это снижает порог входа для небольших кластеров.

Ограничения текущей реализации существенны. Поддерживается только получение данных (RX-path), отправка (TX) пока в разработке. Формат данных - сырые байтовые буферы, без аппаратного разбора заголовков. Операции применимы только к contiguous-аллокациям в VRAM, фрагментированная память требует предварительной дефрагментации.

Взаимодействие с ROCm и требования к GPU

KNOD работает с GPU AMD на архитектуре CDNA2 и новее. Поддерживаемые модели: AMD Instinct MI250X, MI300X, а также серверные Radeon Pro W7900 и W6800. Потребительские карты RDNA3 (RX 7900 XTX) технически способны работать через DMA-BUF, но производитель не гарантирует стабильность для датацентровых нагрузок.

Минимальная версия ROCm - 6.2. Патч использует расширения ROCk (ROCm Kernel Driver) для маппинга VRAM в DMA-BUF. Потребуется пересборка модуля amdgpu с флагом CONFIG_AMD_KNOD=y и установка модифицированного rocm-smi для управления оффлоад-сессиями.

Параметры ядра, обязательные для работы: amdgpu.knod_enable=1 и iommu=pt для корректной работы IOMMU в pass-through режиме. Без второго параметра DMA-транзакции будут проходить через IOMMU-трансляцию, что сводит на нет весь выигрыш по задержке.

Практическая настройка: от патча до первого теста

Патч доступен в ветке knod-v3 на kernel.org. Применяется на ядро 6.11-rc4 и новее. Сборка стандартная, но с включением дополнительных модулей в menuconfig: Device Drivers → Network device support → KNOD support. После загрузки нового ядра проверяем наличие /sys/class/knod - если директория создалась, модуль загружен корректно.

Конфигурация сетевого интерфейса требует привязки к GPU. Утилита knodctl из пакета rocm-knod-utils связывает сетевой адаптер с конкретным GPU-устройством:

knodctl bind --netdev eth2 --gpu /dev/dri/renderD128 --mode rx-only

Проверка привязки: knodctl status покажет активные сессии и статистику переданных байт. Для тестовой передачи данных используем минимальный пример на Python с ROCm:

import knod
import torch

# Аллокация буфера в VRAM
device = torch.device('cuda:0')
buffer = torch.zeros(1024 * 1024, dtype=torch.uint8, device=device)

# Регистрация буфера для прямого доступа
handle = knod.register_buffer(buffer.data_ptr(), buffer.numel())

# Ожидание данных - CPU не участвует
knod.wait_for_data(handle, timeout_ms=100)
print(f"Получено байт: {buffer.sum().item()}")

Этот код аллоцирует 1 МБ в VRAM, регистрирует буфер в KNOD и блокируется до получения данных. Сетевая карта пишет напрямую в buffer, Python видит изменения мгновенно. Для сравнения - традиционный подход потребовал бы вызова recv() в CPU-память и torch.from_numpy() с копированием через шину.

Бенчмарки: задержки и пропускная способность

Методика тестирования: два узла с AMD Instinct MI250X, соединённые Mellanox ConnectX-6 Dx (25GbE). На приёмной стороне - KNOD, на передающей - стандартный send() через TCP. Измеряем задержку (RTT/2 для односторонней передачи) и пропускную способность на разных размерах сообщений.

Размер сообщенияKNOD (latency)CPU-путь (latency)Выигрыш
64 байта2.3 µs4.8 µs52%
1 КБ3.1 µs6.2 µs50%
64 КБ12.4 µs28.7 µs57%
1 МБ98 µs215 µs54%
16 МБ1.4 ms3.1 ms55%

Пропускная способность на больших сообщениях (16 МБ): KNOD достигает 23.4 Гбит/с, CPU-путь - 18.7 Гбит/с. Разница в 25% объясняется устранением двух копирований и снижением нагрузки на контроллер памяти CPU. Загрузка процессора на приёмной стороне падает с 35% до 8% (измерено на 64-ядерном EPYC 7713).

Сравнение с GPUDirect RDMA на аналогичном оборудовании (с заменой сетевых карт на ConnectX-6 InfiniBand HDR100): GPUDirect показывает задержку 1.8 µs на 64 байтах против 2.3 µs у KNOD. Разрыв в 22% объясняется зрелостью технологии и аппаратной поддержкой RDMA. Однако стоимость InfiniBand-коммутатора для кластера из 8 узлов начинается от $15 000, тогда как 25GbE-коммутатор обходится в $2 000. Для многих команд эта разница критична.

Сценарии использования в кластерах AI-инференса

Типовая топология кластера для инференса больших LLM: тензорный параллелизм на 4-8 GPU внутри узла и пайплайн-параллелизм между узлами. Внутри узла GPU общаются через Infinity Fabric (AMD) или NVLink (NVIDIA) - здесь KNOD не нужен. Между узлами данные ходят через сеть, и именно здесь прямой оффлоадинг даёт максимальный эффект.

Рассмотрим запуск модели на 400 ГБ параметров с пайплайн-параллелизмом на 8 узлах. Каждый шаг инференса передаёт 200-400 МБ активаций между стадиями пайплайна. При задержке 215 µs на передачу (CPU-путь) коммуникация занимает 1.7-3.4 мс на шаг. KNOD сокращает это до 0.8-1.6 мс. На длинных последовательностях (4096 токенов, 100+ шагов) экономия достигает 80-170 мс на запрос - разница между 12 и 14 токен/с на выходе.

Фреймворки уже адаптируются. PyTorch 2.5 добавляет экспериментальный бэкенд knod для torch.distributed. Пример инициализации:

import torch.distributed as dist
dist.init_process_group(
    backend='knod',
    init_method='tcp://master:2345',
    world_size=8,
    rank=local_rank
)

После этого все вызовы all_reduce и send/recv внутри DistributedDataParallel автоматически используют прямой путь в VRAM. Для llama.cpp и vLLM поддержка ожидается в следующих релизах - разработчики активно оптимизируют ROCm-бэкенд, и интеграция KNOD логично продолжит это направление.

Экономия ресурсов выходит за рамки чистой производительности. Снижение загрузки CPU на 25-30% означает, что на каждом узле можно выделить больше ядер под подготовку данных, постобработку или обслуживание API. В пересчёте на кластер из 32 узлов это эквивалентно 8-10 «бесплатным» процессорным ядрам на машину, которые раньше тратились на перекладывание байт.

Сравнение с альтернативами: RDMA, GPUDirect и другие

КритерийKNODGPUDirect RDMACPU-путь
Задержка (64 байта)2.3 µs1.8 µs4.8 µs
Пропускная способность (16 МБ)23.4 Гбит/с24.8 Гбит/с18.7 Гбит/с
Загрузка CPU8%5%35%
Требуемая сетьEthernet 10/25/100GbEInfiniBand / RoCEЛюбая
Стоимость коммутатора (8 портов)$2 000$15 000+$1 500
Поддержка GPUAMD CDNA2+NVIDIA (Data Center)Любые
ЗрелостьЭкспериментальный патчProduction-ready (10+ лет)Всегда работало
Сложность настройкиСборка ядра, конфигурация ROCmНастройка InfiniBand, драйверы NVIDIAНулевая

KNOD занимает нишу между дорогим GPUDirect и медленным CPU-путём. Для команд, уже использующих AMD GPU и Ethernet-сети, он предлагает прирост производительности без замены сетевой инфраструктуры. Для продакшен-сред на NVIDIA с InfiniBand GPUDirect остаётся предпочтительным - разрыв в 22% по задержке и полная зрелость стека перевешивают.

Отдельный сценарий - гибридные кластеры. Если часть узлов на AMD, часть на NVIDIA, KNOD позволяет унифицировать коммуникационный слой поверх Ethernet без привязки к проприетарным технологиям. Это снижает vendor lock-in и упрощает миграцию между платформами.

Текущий статус и перспективы развития

Патч KNOD находится в версии v3 и проходит ревью в списке рассылки linux-netdev. Основные замечания рецензентов касаются безопасности - прямой доступ сетевой карты к VRAM требует строгой изоляции через IOMMU, чтобы скомпрометированный сетевой пакет не мог прочитать или повредить данные других процессов на GPU. Разработчики AMD предложили механизм ключей доступа на уровне ROCm, аналогичный NVIDIA MIG, но реализация ожидается не раньше версии v5.

Включение в mainline ядро прогнозируется на цикл 6.13-6.14 (конец 2026 - начало 2027 года) при условии закрытия всех замечаний по безопасности. До этого момента KNOD остаётся экспериментальной фичей, пригодной для тестовых кластеров и R&D, но не для продакшен-нагрузок.

Дорожная карта включает поддержку TX-path (отправка данных из GPU в сеть без CPU), интеграцию с Kubernetes через CNI-плагин для автоматической настройки оффлоад-маршрутов при старте подов и расширение на GPU других производителей. Intel уже выразила заинтересованность в адаптации KNOD для GPU Ponte Vecchio, что может сделать технологию кроссплатформенной.

Практический вывод для ML-инженера: если вы строите кластер на AMD MI250X/MI300X с Ethernet-сетью, протестируйте KNOD на нерабочем контуре. Прирост в 50% по задержке и 25% по пропускной способности стоит усилий на сборку кастомного ядра. Для продакшена дождитесь включения в mainline - стабильность и безопасность важнее раннего доступа к производительности. Оптимизация инференса на одиночных узлах и CPU-only решения показывают, что индустрия движется к максимальной утилизации каждого компонента системы. KNOD - логичный шаг в этом направлении для GPU-кластеров.

Подписаться на канал