Разработчик написал inference-движок на Zig для запуска LLM на AMD GPU без ROCm
Движок запускает Llama 3.1 8B на RX 7900 XTX без зависимости от ROCm. Используется чистый Vulkan compute — 85 токенов/сек на FP16.
Новости Tproger, отредактировано
Потребительские AMD-видеокарты серий RDNA3 и RDNA4 имеют от 16 до 32 ГБ VRAM и пропускную способность памяти до 960 ГБ/с — мощности для LLM-inference хватает. Но софтверная экосистема отстаёт: ROCm (фреймворк AMD для GPU-вычислений) поддерживает потребительские RDNA3 только с конца 2023 года, а Vulkan-бэкенд llama.cpp не использует специфику конкретных архитектур. Разработчик под ником Mammoth_Radish2 решил написать inference engine с нуля — на Zig и Vulkan, с ручной оптимизацией под RDNA4.
ZINC (Zig INferenCe Engine) — inference-движок для больших языковых моделей, написанный на Zig и работающий через Vulkan API без зависимости от ROCm или CUDA. GGUF (формат хранения весов LLM, используемый в llama.cpp и Ollama) — единственный поддерживаемый формат моделей. Проект на ранней стадии: 149 звёзд на GitHub, около 5000 строк Zig и 2000 строк GLSL-шейдеров.
Ключевые выводы
— ZINC — inference engine на Zig + Vulkan для AMD GPU (RDNA3/RDNA4)
— Загружает модели в формате GGUF, поддерживает квантизации Q4_K–F16
— Текущая скорость: 10 tok/s decode на Qwen3.5-35B-A3B, 7 tok/s на Qwen3.5-2B
— ~5000 строк Zig + 2000 строк GLSL-шейдеров — можно прочитать целиком
— Комьюнити указывает на неточности в README и возможный vibecoding
Что умеет ZINC
Движок загружает модели в формате GGUF (нативный парсер на Zig), маппит веса в VRAM видеокарты и выполняет decode-цикл трансформера. Список протестированных моделей пока узкий — автор публикует только те, что прошли полную валидацию. Поддерживаемые квантизации: Q4_K, Q5_K, Q6_K, Q8_0, F16.
Результаты на AMD Radeon AI PRO R9700 (RDNA4, 32 ГБ VRAM) — это профессиональная карта, не потребительская:
- Qwen3.5 2B Q4_K_M — 8,33 tok/s prefill, 7,17 tok/s decode
- Qwen3.5 35B-A3B UD Q4_K_XL (MoE-модель) — 12,67 tok/s prefill, 10,10 tok/s decode
Для сравнения: Vulkan-бэкенд llama.cpp на аналогичном железе и той же модели показывает около 127 tok/s — разница примерно в 12 раз. Автор ZINC объясняет это узким местом: 120 GPU-синхронизаций на токен (по одной на слой). Исправление — запись всего decode-графа в один command buffer — в работе.
Почему Zig и Vulkan
Автор проекта объясняет выбор стека: горячий путь — это Vulkan API-вызовы, управление GPU-памятью и запись command buffer'ов. Чистая системная работа, для которой Zig подходит хорошо благодаря нескольким возможностям языка:
@cImport— прямой доступ к Vulkan C ABI без генераторов биндинговcomptime— генерация dispatch-таблиц для каждой квантизации на этапе компиляцииerrdefer— автоматическое освобождение GPU-ресурсов при ошибкахzig build— компиляция GLSL-шейдеров в SPIR-V встроена в систему сборки
Итог — один бинарник из одной команды. Кодовая база достаточно компактна (~7000 строк), чтобы прочитать целиком и понять, как устроен inference.
Как попробовать
Для сборки нужны Zig 0.15.2+ (это dev/nightly-версия, не стабильный релиз), Vulkan SDK и компилятор GLSL-шейдеров (glslc). На Linux с RDNA4 важно использовать системную версию glslc — новые релизы могут вызвать регрессию производительности.
Флаг RADV_PERFTEST=coop_matrix включает поддержку кооперативных матричных операций в драйвере Mesa RADV — без него производительность на RDNA4 будет значительно ниже. Команда --check проверяет Vulkan-устройство, скомпилированные шейдеры и совместимость GGUF-файла.
Что говорит комьюнити
Тред на r/LocalLLaMA набрал 68 комментариев, и реакция скептическая. Разберём основные претензии.
Неточности в README
README заявляет, что «ROCm не поддерживает потребительские карты — только MI-серию для дата-центров». Это неверно: AMD добавила поддержку RDNA3 в ROCm осенью 2023 года. Как отметил один из комментаторов: «Утверждение вроде этого в описании проблемы говорит о том, что разработчики не понимают рынок, под который строят продукт». Справедливости ради, поддержка ROCm для потребительских карт остаётся неполной — например, библиотеки Composable Kernel и Aiter до сих пор работают только с CDNA.
Разрыв в скорости с llama.cpp
Разработчик KoboldAI henk717 провёл детальный разбор. По его данным, Vulkan-бэкенд llama.cpp выдаёт 107 tok/s там, где ZINC показывает 7,6 tok/s. При этом README позиционирует llama.cpp как решение, которое «относится к RDNA4 как к второстепенному». Независимые бенчмарки из обсуждений llama.cpp на GitHub показывают ещё более высокие цифры — до 127 tok/s на R9700.
Также henk717 указал на противоречие: README обещает «обслуживание 4+ пользователей» с TurboQuant KV-кешем, но в таблице статуса проекта обе фичи (continuous batching и TurboQuant) помечены как нереализованные.
Vibecoding: стоит ли волноваться?
Несколько пользователей обратили внимание на признаки того, что проект написан с помощью ИИ: в репозитории есть .claude и CLAUDE.md, README содержит противоречия между заявленными и реализованными возможностями. Само по себе использование ИИ-инструментов для кодинга — нормальная практика в 2026 году. Проблема в другом: если ИИ написал README с ложными утверждениями, а автор не проверил — это вопрос к качеству инженерного процесса, а не к инструменту.
Зачем за этим следить
Потребительские AMD GPU стоят $500–1500 (против $10 000–15 000 за MI300X для дата-центров) и имеют 16–32 ГБ VRAM. Железо для inference есть у миллионов пользователей — нет хорошего софта. ZINC пока далёк от решения этой проблемы, но сам подход — нативный Zig с ручной настройкой Vulkan-шейдеров под конкретную архитектуру GPU — инженерно обоснован.
На текущий момент для inference на AMD GPU llama.cpp через Vulkan остаётся лучшим вариантом: в 12 раз быстрее, поддерживает десятки моделей, стабильный. ZINC имеет смысл отслеживать тем, кто интересуется низкоуровневой оптимизацией GPU или Zig как системным языком.
Частые вопросы
Чем ZINC отличается от llama.cpp?
llama.cpp — зрелый inference-движок с поддержкой CUDA, Metal, Vulkan и других бэкендов, десятками оптимизированных моделей и активным сообществом. ZINC написан с нуля на Zig и работает только через Vulkan, с прицелом на ручную оптимизацию конкретно под AMD RDNA4. На данный момент llama.cpp значительно быстрее: 107–127 tok/s против 7–10 tok/s на том же железе. ZINC — ранний эксперимент, не альтернатива.
Нужен ли ROCm для запуска ZINC?
Нет. ZINC работает через Vulkan API и не зависит от ROCm, CUDA или HIP. Достаточно Vulkan-драйвера (например, Mesa RADV на Linux) и компилятора GLSL-шейдеров. Это одно из преимуществ подхода: Vulkan поддерживается шире, чем ROCm, и работает на картах, где ROCm недоступен или работает с ограничениями.
Какие модели поддерживаются?
Протестированы Qwen3.5 2B и Qwen3.5 35B-A3B (MoE-модель) в квантизациях Q4_K и выше. Движок загружает GGUF-файлы, но список проверенных моделей намеренно узкий — автор публикует только те, что прошли полную end-to-end валидацию. Поддержка других архитектур (Llama, Mistral) не гарантирована.
Это production-ready?
Нет. Проект на ранней стадии: скорость в 12 раз ниже llama.cpp, часть заявленных фич (TurboQuant KV-кеш, continuous batching, tensor parallelism) не реализована, README содержит неточности. ZINC подходит для изучения кода и экспериментов с Vulkan-inference, но не для продакшена или ежедневного использования.
Выводы
ZINC — ранний эксперимент по созданию inference-движка на Zig + Vulkan для AMD GPU. Идея — использовать потребительские RDNA3/RDNA4 для LLM без ROCm — здравая. Реализация пока сырая: разрыв с llama.cpp в 12 раз по скорости, неточности в документации, незавершённые фичи.
Для практического использования прямо сейчас — llama.cpp через Vulkan. Для наблюдения и изучения подхода — ZINC интересен как пример того, как Zig и Vulkan работают вместе для GPU-вычислений.
Ссылки: GitHub-репозиторий ZINC | Обсуждение на r/LocalLLaMA