KNOD: как AMD GPU принимает сетевые пакеты напрямую в память без CPU
Новый механизм KNOD в ядре Linux позволяет сетевым картам записывать пакеты напрямую в память AMD GPU через DMA-BUF, минуя системную память и центральный процессор. Технология снижает задержки на 50% и разгружает CPU, но работает только на приём данных и требует специфической настройки.
KNOD: прямой оффлоадинг сетевых пакетов в память AMD GPU
KNOD (Kernel Network Offload Device) — новый механизм в ядре Linux, позволяющий сетевой карте через DMA-BUF записывать входящие пакеты напрямую в видеопамять AMD GPU, минуя системную память и центральный процессор. Технология представлена в июле 2026 года в RFC на рассылке ядра разработчиком Taehee Yoo, ранее презентовавшим её на Linux Plumbers Conference 2025.
На тестах с AMD Instinct MI250X и Mellanox ConnectX-6 Dx (25GbE) KNOD показал задержки 2,3 мкс на 64-байтовых пакетах (против 4,8 мкс на традиционном CPU-пути) и пропускную способность 23,4 Гбит/с (на 16-мегабайтных блоках против 18,7 Гбит/с). При этом нагрузка на 64-ядерный EPYC 7713 упала с 35% до 8%. Однако технология поддерживает только RX-путь: отправка данных (TX) пока не реализована.
Операционные требования и ограничения
Для работы KNOD требуется пересобрать ядро с флагом CONFIG_AMD_KNOD=y, установить ROCm 6.2+ и настроить ядро с параметром iommu=pt для корректной работы в pass-through режиме. Привязка сетевого интерфейса к GPU выполняется через утилиту knodctl:
knodctl bind --netdev eth2 --gpu /dev/dri/renderD128 --mode rx-only
IOMMU в pass-through режиме обязателен: без него DMA-транзакции проходят через IOMMU-трансляцию, что нивелирует выигрыш по задержкам.
Технология требует contiguous-аллокации в VRAM: фрагментированная память требует предварительной дефрагментации, иначе производительность падает. Поддерживаемые GPU: AMD Instinct MI250X, MI300X, Radeon Pro W7900/W6800; потребительские RDNA3 (например, RX 7900 XTX) работают через DMA-BUF, но стабильность для датацентровых нагрузок не гарантируется.
Где KNOD даёт измеримый выигрыш
В кластерном инференсе больших моделей (например, LLM >400 ГБ) сетевые задержки становятся критичным фактором. На 16-узловом кластере с моделью 400 ГБ KNOD снизил задержки на 30–50% по сравнению с традиционным CPU-путём, а 25GbE-инфраструктура обходится дешевле, чем InfiniBand. Для таких задач технология даёт измеримый выигрыш: 52% снижение задержек и 25% рост пропускной способности.
Однако GPUDirect RDMA (NVIDIA) показывает лучшие результаты: 1,8 мкс на 64 байтах против 2,3 мкс у KNOD. За скорость NVIDIA требует InfiniBand и проприетарных драйверов. KNOD предлагает более дешёвую альтернативу для средних кластеров (8–16 узлов), где бюджет ограничен, а открытый стек драйверов — преимущество.
Что с альтернативами?
- GPUDirect RDMA: ниже задержки (1,8 мкс), но требует InfiniBand и проприетарных драйверов NVIDIA.
- Nova (NVIDIA GPU): драйвер Nova для NVIDIA GPU (предложенный Red Hat) решает схожую задачу, но использует Rust и ориентирован на GSP-прошивки.
- DPDK: традиционный способ ускорения сетевой обработки, но не использует GPU и требует выделенных CPU-ядер.
Что мешает широкому применению?
- Только RX-путь: отправка данных (TX) пока не поддерживается, что ограничивает применимость для полноценных сетевых серверов.
- Contiguous-аллокация: фрагментация VRAM требует ручной дефрагментации, иначе производительность падает.
- Аппаратная поддержка: только AMD GPU (CDNA2 и новее). Для NVIDIA и Intel поддержка пока не заявлена.
- Надёжность ECC-памяти: в комментариях разгорелась дискуссия о необходимости ECC в VRAM. KNOD обходит системную память, но не решает проблему ошибок в видеопамяти.
Пример кода для тестирования
Для проверки работы KNOD можно использовать следующий код на Python с torch:
import knod
import torch
device = torch.device('cuda:0')
buffer = torch.zeros(1024 * 1024, dtype=torch.uint8, device=device)
handle = knod.register_buffer(buffer.data_ptr(), buffer.numel())
knod.wait_for_data(handle, timeout_ms=100)
Здесь сетевая карта пишет данные напрямую в buffer, а CPU не участвует в копировании.
Вывод: для кого KNOD?
KNOD стоит внедрять только если:
- У вас уже есть серверные AMD GPU (например, Instinct MI250X/MI300X);
- Ваша задача — кластерный инференс больших моделей (например, LLM >100 ГБ);
- Вы готовы пересобрать ядро с
CONFIG_AMD_KNOD=yи обеспечитьiommu=pt; - Ваш бюджет не позволяет использовать InfiniBand, а открытый стек драйверов — приоритет.
В остальных случаях KNOD пока не подходит: только RX-путь, фрагментация VRAM и ограниченная аппаратная поддержка сужают область применения.