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

Локальный инференс на Ryzen AI Max+ 395: настройка TTM, ROCm и Vulkan, тесты Qwen3-Coder и сравнение с RTX 5060 Ti 16 ГБ

Мини-ПК на Ryzen AI Max+ 395 с 128 ГБ объединённой памяти целиком грузит Qwen3-Coder 30B и 80B в VRAM: разбираем переход на Ubuntu ради TTM, настройку ROCm и Vu

Коротко

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

  1. 01

    Почему Ryzen AI Max+ 395 интересен для локального инференса

  2. 02

    Windows vs Linux: почему для локального инференса нужна Ubuntu

  3. 03

    Настройка ROCm и Vulkan для llama.cpp: пошаговый гайд

  4. 04

    Тесты производительности: Qwen3-Coder 30B и Qwen3-Coder Next 80B

128 ГБ объединённой памяти в мини-ПК на Ryzen AI Max+ 395 позволяют целиком держать в видеопамяти модели, для которых 16 ГБ VRAM дискретной карты мало. После перехода с Windows на Ubuntu с включённым TTM под VRAM уходит почти вся оперативная память, и llama.cpp на ROCm или Vulkan сохраняет интерактивную скорость на Qwen3-Coder 30B и Qwen3-Coder Next 80B. На моделях, которые полностью помещаются в 16 ГБ, RTX 5060 Ti остаётся быстрее, но при выгрузке слоёв в системную память проигрывает встройке.

Дальше конкретика: зачем нужна Ubuntu, как выставить BIOS и собрать оба бэкенда, на чём спотыкаются драйверы и как читать замеры prefill и decode при разной длине контекста.

Почему Ryzen AI Max+ 395 интересен для локального инференса

Ryzen AI Max+ 395 объединяет 16 ядер и встроенную графику уровня младшей дискретной карты. Задачу локальных LLM решает не вычислительная мощность, а 128 ГБ памяти, которую CPU и GPU делят между собой: в такой объём влезают модели, для которых 16 ГБ VRAM мало. Отсюда и интерес к платформе - возможность запустить 30B и 80B в приличном кванте дома, а не в датацентре.

Ключевые характеристики и архитектура

Стенд, о котором идёт речь в опубликованном разборе, - мини-ПК GMKTec EVO X2: 16-ядерный Ryzen AI Max+ 395, 128 ГБ DDR5-8000 и встроенная графика. По отзывам владельцев, встройка здесь сопоставима с RTX 4060, что для iGPU необычно много. Процессор способен отдавать до 140 Вт, но этот показатель зависит от конкретного устройства и его охлаждения.

Память объединённая: одни и те же чипы отдают данные и процессору, и графике. Пропускная способность LPDDR5X-8000 - около 256 ГБ/с, у RTX 5060 Ti с GDDR7 - порядка 448 ГБ/с по спецификациям производителя. Для prefill (обработка промпта) это не критично, там больше решают вычислительные блоки, а decode (генерация токенов) упирается именно в чтение весов из памяти.

Отсюда простое правило оценки. Вес модели в памяти ≈ число параметров × бит на вес / 8. Квант Q4_K_M - примерно 4,5-5 бит на вес, Q8_0 - около 8,5. Модель 30B в Q4_K_M занимает порядка 17 ГБ, в Q8_0 - около 32 ГБ. Модель 80B в Q4_K_M - примерно 45 ГБ, в Q8_0 - около 85 ГБ. Сверху добавляются KV-кэш и буферы, и именно здесь 128 ГБ превращаются в реальное преимущество.

Устройства на Ryzen AI Max+ 395: GMKTec EVO X2 и альтернативы

Мини-ПК и ноутбуки на этом чипе делают GmkTec, Minisforum, Beelink, IceBook, есть и референсное устройство от самой AMD. Ноутбук Asus интересен форм-фактором, но ограничен по TDP и не выжимает полные 140 Вт, которые способен отдать процессор. Различия между устройствами сводятся к охлаждению, набору портов, BIOS и питанию: сам чип и память у всех одинаковые, а от охлаждения зависит, как долго система держит высокие частоты.

Отдельный момент - цена. За год такие устройства подорожали в 2-3 раза из-за роста цен на память и комплектующие, поэтому сравнивать APU с дискретной видеокартой по стоимости за гигабайт VRAM некорректно: здесь вы покупаете готовую систему целиком. Оба факта - список производителей и рост цен - приводятся в исходном разборе на Хабре.

Windows vs Linux: почему для локального инференса нужна Ubuntu

Разница между ОС здесь не в драйверах, а в распределении памяти. Windows требует заранее решить в BIOS, сколько памяти отдать под VRAM, и этот объём фиксируется. Linux с подсистемой TTM отдаёт графике почти всю оперативную память динамически.

Как TTM расширяет VRAM в Linux

На Windows в BIOS выбирается максимум, в этом устройстве - 96 ГБ под VRAM, а остальные 32 ГБ остаются системе. Модель, которой нужно 102 ГБ, в такой схеме просто не загрузится. MoE-модели вынуждены постоянно гонять слои между оперативной памятью и видеопамятью, и это копирование стоит времени, хотя физически данные лежат в одних и тех же чипах.

TTM (Translation Table Maps) - подсистема управления памятью GPU в ядре Linux. Схема обратная: в BIOS выставляется минимум (512 МБ или 1 ГБ) под выделенную видеопамять, дальше GPU запрашивает память из системной динамически, и под VRAM реально уходит почти всё объединённое пространство: до 128 ГБ. Выигрыш даёт не пиковая скорость памяти, а отсутствие выгрузки слоёв. Пропускная способность LPDDR5X всё равно ниже, чем у GDDR7, и об этом стоит помнить при чтении замеров. Схема с разделением 96/32 ГБ и работа TTM описаны в том же разборе.

Пошаговая инструкция: переход на Ubuntu и настройка BIOS

  1. Записать на флешку актуальный LTS-образ Ubuntu и установить систему. Номер версии меняется каждые полгода, поэтому ориентируйтесь на текущий релиз, а не на инструкцию годичной давности.
  2. В BIOS найти настройку выделенной видеопамяти (UMA Frame Buffer Size или iGPU memory) и выставить минимум: 512 МБ или 1 ГБ. Большой фиксированный объём здесь мешает, а не помогает.
  3. Драйвер amdgpu в современных ядрах уже встроен, отдельная установка проприетарного пакета не нужна. Проверить, что система видит графику, можно через rocm-smi, а корректность Vulkan-слоя - через vulkaninfo.
  4. Запустить llama.cpp и посмотреть, сколько VRAM видит сборка. Если объём близок к системной памяти, TTM работает как надо.
  5. Не добавлять лишние параметры ядра без необходимости. На унифицированной памяти amdgpu.gttsize конфликтует с TTM и может сломать выделение - этот конфликт разбирался на примере Radeon RX 7600 и ROCm 7, где такие параметры приходилось убирать.

Переход занял не вечер. Старые инструкции с сайта AMD перестали работать, потому что поменялись версии Linux, ядра, драйверов и llama.cpp. Часть проблем автор разбора решал по обсуждениям на Reddit, в мануалах на GitHub и в комментариях на Хабре, единого актуального руководства под эту связку железа нет.

Настройка ROCm и Vulkan для llama.cpp: пошаговый гайд

llama.cpp работает с AMD-графикой через два бэкенда. ROCm ближе к железу и обычно быстрее на prefill, Vulkan проще ставится и реже конфликтует с драйверами. Разумный порядок действий: сначала поднять Vulkan и убедиться, что система вообще считает модель, затем собрать ROCm и сравнить на своих задачах.

Установка ROCm: зависимости и подводные камни

Понадобятся ядро с поддержкой amdgpu и пакеты rocm-hip-runtime, rocm-opencl-runtime. Сборка llama.cpp с HIP выполняется через CMake:

cmake -B build -DGGML_HIPBLAS=ON -DAMDGPU_TARGETS=<архитектура вашего iGPU>
cmake --build build --config Release -j

Значение AMDGPU_TARGETS зависит от поколения графики. Если указать не ту цель, сборка пройдёт успешно, но при запуске вы получите "HIP error: invalid device function": бинарник не содержит кода под вашу архитектуру. Вторая причина той же ошибки - прекомпилированные сборки, в которых целевые архитектуры встроенной и мобильной графики часто не включены. Поэтому llama.cpp приходится собирать из исходников, зато это заметно проще, чем сборка под CUDA.

Пути к библиотекам прописываются явно: export LD_LIBRARY_PATH=/opt/rocm/lib:$LD_LIBRARY_PATH. Готовая команда запуска с разбором каждого флага есть в материале про Qwen 3.6 35B A3B на Radeon RX 7600.

Сборка llama.cpp с Vulkan: альтернативный путь

Для Vulkan нужны загрузчик Vulkan и драйвер mesa-vulkan-drivers. Сборка короткая:

cmake -B build -DGGML_VULKAN=ON
cmake --build build --config Release -j

Проверка окружения - vulkaninfo: в списке устройств должна появиться встроенная графика. Vulkan выигрывает предсказуемостью: один драйвер, минимум зависимостей, работает и на APU, и на дискретных Radeon. По замерам на близкой по классу встроенной графике Radeon 780M, ROCm обгонял Vulkan на prefill примерно на половину, а на генерации разница была куда скромнее - этот случай разобран в тесте Gemma 4 и Qwen 3.6 MoE на Ryzen 7 6800H, где подробно показана сборка под Vulkan на APU.

Типичные ошибки и их решение

ОшибкаПричинаРешение
libamdhip64.so: cannot open shared object fileОкружение не знает, где лежат библиотеки ROCmДобавить /opt/rocm/lib в LD_LIBRARY_PATH
HIP error: invalid device functionБинарник собран не под архитектуру вашего GPUПересобрать с корректным AMDGPU_TARGETS
no compatible GPU foundУ пользователя нет прав на устройствоДобавить его в группы render и video, затем перелогиниться
Vulkan device not foundНе установлен драйвер VulkanПоставить mesa-vulkan-drivers и проверить vulkaninfo
Модель грузится, но слои уходят в CPUОграничение GTT или не хватает свободной памятиПроверить настройки TTM, убрать конфликтующие параметры ядра

Если ошибки нет в списке, ищите по точному тексту сообщения: обсуждения по Ryzen AI Max+ 395 идут на Reddit, в issue на GitHub и в комментариях к новостям на Хабре. Готового единого мануала нет, потому что конфигурации у всех разные.

Тесты производительности: Qwen3-Coder 30B и Qwen3-Coder Next 80B

Замеры снимались на GMKTec EVO X2 с 128 ГБ объединённой памяти: llama.cpp, две модели, разные кванты и разная длина контекста. Точные значения токенов в секунду привязаны к версиям ядра, драйвера и сборки llama.cpp, поэтому переносить их один в один на другую систему не стоит. Ниже - что именно измерялось, какие ориентиры по памяти получаются и как эти цифры читать.

Методика тестирования

Модели запускались через llama.cpp на обоих бэкендах, целиком в объединённой памяти, без выгрузки слоёв на CPU. Отдельно фиксировались две величины: prefill - сколько токенов промпта движок обрабатывает за секунду, и decode - сколько токенов ответа генерируется за секунду. Длина контекста менялась, потому что KV-кэш растёт линейно и меняет и память, и скорость. Сравнение с RTX 5060 Ti 16 ГБ делалось на тех же моделях и квантах. Полный набор замеров приведён в исходном разборе.

Результаты для Qwen3-Coder 30B

Практический ориентир по памяти (оценка весов по формуле, без KV-кэша и буферов):

МодельКвантВес модели, оценкаВлезает в 128 ГБВлезает в 16 ГБ VRAM
Qwen3-Coder 30BQ4_K_M~17 ГБда, с большим запасомнет
Qwen3-Coder 30BQ5_K_M~21 ГБданет
Qwen3-Coder 30BQ8_0~32 ГБданет

Модель 30B укладывается в объединённую память в любом из этих квантов, поэтому prefill и decode считаются без выгрузки слоёв. При росте контекста с 4K до 32K растёт KV-кэш и объём работы на внимании: prefill падает сильнее, decode - умереннее. Разница между квантами заметна и в скорости, и в качестве кода: Q4_K_M быстрее, Q8_0 аккуратнее на сложных задачах.

Результаты для Qwen3-Coder Next 80B

МодельКвантВес модели, оценкаВлезает в 128 ГБВлезает в 16 ГБ VRAM
Qwen3-Coder Next 80BQ4_K_M~45 ГБда, остаётся запас под длинный контекстнет
Qwen3-Coder Next 80BQ8_0~85 ГБда, но контекст придётся ограничиватьнет

80B в Q4_K_M занимает около 45 ГБ, в Q8_0 - около 85 ГБ. Во втором случае на KV-кэш и буферы остаётся меньше 40 ГБ, поэтому длину контекста стоит держать умеренной. Скорость decode на 80B ниже, чем на 30B: при той же пропускной способности памяти на каждый токен нужно прочитать примерно вдвое больше весов.

Влияние квантов и длины контекста

Баланс для интерактивной работы выглядит так: Q4_K_M и контекст до 16K дают лучшую скорость при приемлемом качестве кода, Q5_K_M заметно увеличивает вес модели и немного снижает скорость, Q8_0 берут тогда, когда качество важнее и запаса памяти хватает. Контекст за 32K на 80B в высоком кванте лучше не выставлять: растёт KV-кэш, растёт время prefill, а свободная память тает. На итоговую скорость влияет не только квант, но и движок: на тестах современных LLM на RTX 5090 видно, как выбор движка и квантования меняет результат сильнее, чем ожидаешь.

Сравнение с NVIDIA RTX 5060 Ti 16 ГБ: когда встройка обгоняет дискретку

Сравнение двух платформ сводится к одному вопросу: влезает ли модель целиком. Если да, выигрывает карта с более быстрой памятью. Если нет, выигрывает система, которой не нужно постоянно перекачивать слои в медленную память.

Ключевые различия в архитектуре памяти

ПараметрRyzen AI Max+ 395RTX 5060 Ti 16 ГБ
ПамятьLPDDR5X-8000, объединённая, до 128 ГБGDDR7, 16 ГБ
Пропускная способностьоколо 256 ГБ/соколо 448 ГБ/с по спецификациям
Модель без выгрузки слоёвдо 80B в квантахпримерно до 14B в Q8_0 или 30B в Q4_K_M с частичной выгрузкой
Поведение при нехватке памятиничего не выгружается, пока модель влезает в 128 ГБчасть слоёв уходит в системную RAM, скорость падает

Ключевой фактор для decode - чтение весов из памяти. У RTX 5060 Ti пропускная способность выше, и на моделях, которые помещаются в её 16 ГБ, она быстрее. Как только модель перестаёт влезать, начинается выгрузка слоёв через PCIe, и преимущество исчезает.

Сценарии, где выигрывает Ryzen AI Max+ 395

Модели 30B и больше в квантах Q5_K_M и Q8_0, длинный контекст, несколько моделей в памяти одновременно: основная модель плюс эмбеддер под RAG или агент с инструментами. На 16 ГБ такие сценарии упираются в выгрузку - карта держит часть слоёв у себя, остальное считает CPU, и время ответа растёт нелинейно. Ориентиры по бюджету памяти на карте с 16 ГБ и работе с KV-кэшем подробно разобраны в материале про Qwen3.8-27B на RTX 5080 16 ГБ.

Сценарии, где выигрывает RTX 5060 Ti

Модели, которые целиком помещаются в 16 ГБ: 7-14B в Q4 и Q8, плюс всё, что завязано на CUDA - специализированные библиотеки, дообучение, работа с графикой. Настройка под NVIDIA проще: один комплект драйверов и предсказуемая сборка llama.cpp с GGML_CUDA=ON, без возни с архитектурами и путями к библиотекам.

Практические выводы: кому подходит Ryzen AI Max+ 395 для локального инференса

Кому стоит рассмотреть Ryzen AI Max+ 395

  • Тем, кто хочет запускать 30B и 80B локально, а не арендовать GPU в облаке.
  • Разработчикам, которые тестируют агентов с RAG и инструментами: 128 ГБ позволяют держать в памяти модель и эмбеддер одновременно.
  • Тем, кому важен компактный корпус: мини-ПК занимает мало места и обходится без отдельного питания для дискретной карты.
  • Пользователям видеокарт AMD, которые уже привыкли собирать llama.cpp под ROCm или Vulkan: логика настройки та же, меняется только объём доступной памяти.

Ограничения и на что обратить внимание

  • Linux обязателен, если вы хотите отдать под VRAM всю память. На Windows потолок фиксируется в BIOS и оказывается заметно ниже.
  • Пропускная способность объединённой памяти ниже, чем у дискретных карт: на моделях до 14B APU проигрывает по скорости генерации.
  • ROCm требует сборки из исходников и аккуратности с версиями драйверов, готовые инструкции быстро устаревают.
  • При нехватке свободной памяти система начинает активно свопиться, поэтому длину контекста лучше ограничивать заранее.
  • Не все модели одинаково хорошо работают на обоих бэкендах: на 80B разница между ROCm и Vulkan может быть меньше, чем на плотных моделях меньшего размера.

Итоговое сравнение с RTX 5060 Ti

ЗадачаЧто подходит лучшеПочему
Кодогенерация на 30B в Q4_K_MRyzen AI Max+ 395модель целиком в памяти, дискретной карте не хватает 16 ГБ
Работа с 80B в Q4_K_MRyzen AI Max+ 395на 16 ГБ такой квант не загрузить без выгрузки слоёв
Максимальная скорость на 7-14BRTX 5060 Ti 16 ГБвыше пропускная способность памяти и зрелее экосистема CUDA
Агент с моделью и эмбеддером сразуRyzen AI Max+ 395объёма хватает, чтобы держать обе модели в памяти
Дообучение и CUDA-инструментыRTX 5060 Ti 16 ГБзаточка библиотек под CUDA

Выбор сводится к размеру модели. Нужны 30B и 80B в разумном кванте, длинный контекст и несколько моделей в памяти - берите Ryzen AI Max+ 395 и закладывайте время на настройку Ubuntu, BIOS и сборку llama.cpp под ROCm или Vulkan. Нужны максимальные токены в секунду на моделях до 14B, дообучение и CUDA-инструменты - дискретная карта остаётся практичнее.

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