Короткий ответ: с чего начать настройку
Для Qwen3.8-Flash-Next на системе с тремя AMD MI50 и суммарными 96 GB VRAM сначала добейтесь предсказуемой загрузки модели и распределения памяти между GPU. Затем увеличивайте контекст, контролируя KV-кэш, и лишь после этого включайте режимы, влияющие на размещение кэша, отложенную загрузку и offloading эмбеддингов. Запуск на малом окне контекста не подтверждает, что профиль выдержит 260k токенов.
Рабочая точка старта выглядит так: проверить флаги конкретного бинарного файла, задать split-mode, выбрать умеренный контекст, убедиться по логам в использовании всех нужных GPU, снять показатели VRAM и RAM, затем поэтапно проверять fit-ctx, cache-ram, lazy-mode и offloading эмбеддингов. Скорость 15-200 токенов в секунду здесь может быть лишь ориентиром: на результат влияют квантование, backend, длина prompt, схема распределения и режим генерации. О различиях поведения Qwen3.8-Flash-Next при размещении в 96 GB VRAM полезно прочитать в разборе влияния VRAM, PLE и контекста на скорость в llama.cpp.
# Шаблон профиля. Подставляйте только опции, которые показывает --help вашей сборки.
./llama-server -m /путь/к/Qwen3.8-Flash-Next.gguf \
--split-mode <режим_из_справки> \
--ctx-size <размер_окна> \
<опция_lazy-mode_из_справки> \
<опция_cache-ram_из_справки> \
<опция_fit-ctx_из_справки> \
<опция_offloading_эмбеддингов_из_справки>
Строки в угловых скобках показывают порядок настройки, а не готовые аргументы. Названия, синтаксис и смысл некоторых опций меняются между ревизиями llama.cpp и вариантами backend.
Что считать рабочей конфигурацией
Рабочий профиль проходит пять проверок:
- модель загружается без ошибки нехватки памяти;
- логи показывают ожидаемые устройства и размещение вычислительных буферов;
- после загрузки остаётся запас VRAM для выбранного размера контекста;
- длинный prompt проходит обработку без аварийного завершения и без скрытого переноса критичных данных в RAM;
- после нескольких запросов скорость prompt processing и generation остаётся в ожидаемом для профиля диапазоне.
Фраза «модель загрузилась» описывает только первый этап. Сервис или локальный чат становятся пригодными для регулярной работы после проверки реального сценария: нужной длины документов, нескольких диалоговых ходов, RAG-запросов либо пакетной обработки.
Какие значения нельзя переносить без проверки
Не копируйте чужую команду целиком, даже если в ней указана похожая модель и те же 96 GB VRAM. Квантование GGUF, версия llama.cpp, AMD backend, драйвер, число видимых устройств, занятая память и размер рабочих буферов могут отличаться. Один и тот же split-mode способен дать другой расклад по GPU после обновления сборки.
Перед любым запуском выведите справку:
./llama-server --help
Зафиксируйте строку версии из лога запуска, список доступных устройств и точные имена параметров. Если справка не содержит lazy-mode, cache-ram, fit-ctx либо отдельной опции offloading эмбеддингов, не подменяйте их похожими флагами без проверки их описания.
Перед запуском: что проверить в системе и сборке llama.cpp
Проблема с контекстом или multi-GPU часто начинается раньше команды запуска. Проверьте цепочку целиком: GGUF-файл, backend для AMD, драйвер, видимость трёх ускорителей, свободную память и поддержку параметров в конкретном бинарном файле.
Версия llama.cpp и поддерживаемые параметры
Справка бинарного файла служит главным источником для синтаксиса команды. В ней нужно найти описание split-mode, размер контекста, режимы распределения кэша, lazy loading, fit-ctx и GPU offload. Название параметра из старой статьи может отсутствовать, поменять формат значения или работать только в отдельной ветке проекта.
Проверьте принятие каждого флага на коротком запуске. Не добавляйте сразу пять спорных опций: при ошибке парсинга или несовместимости будет трудно понять, какой аргумент стал причиной. Сохраните полную команду и первые строки лога, где указаны backend, устройства и настройки модели.
Модель, формат и реальный бюджет памяти
Суммарные 96 GB VRAM на трёх AMD MI50 не образуют единый безусловно доступный пул. Backend размещает веса, KV-кэш и служебные буферы по отдельным устройствам. Ограничением станет карта с наименьшим свободным запасом или участок вычислений, который движок пытается закрепить на конкретной GPU.
Бюджет памяти складывается из весов GGUF, KV-кэша, временных буферов, эмбеддингов, контекста драйвера и памяти, занятой другими процессами. Смотрите свободную VRAM непосредственно перед запуском, после загрузки модели и во время обработки длинного prompt. Три снимка показывают картину точнее, чем номинальный объём памяти в спецификации сервера.
Распределение по трём AMD MI50: как работает split-mode
split-mode задаёт схему, по которой llama.cpp раскладывает часть работы и связанных данных между несколькими GPU. Точная семантика зависит от backend и версии: в справке могут быть разные режимы размещения слоёв, строк матриц или буферов. Поэтому сперва сверяйте доступные значения с выводом --help, затем подтверждайте результат логами.
Равномерное распределение и его ограничения
Равное деление весов на три части выглядит логично, когда все AMD MI50 имеют одинаковую свободную VRAM. На практике у одной карты может быть другой остаток памяти, а вычислительные и временные буферы не всегда делятся симметрично. При длинном контексте дисбаланс усиливается, потому что часть запаса нужна KV-кэшу.
Начните с схемы, которую backend описывает как базовую для multi-GPU, и проверьте использование каждого устройства. Если одна GPU заполняется раньше остальных, не пытайтесь компенсировать проблему только увеличением общего лимита контекста. Сначала разберите, что именно размещено на переполненной карте: слои, KV-кэш, буфер вычислений или данные эмбеддингов.
Как читать логи распределения слоёв и памяти
После старта в логе должны быть видны все целевые устройства, объёмы выделенных буферов и сведения о размещении модели. Ищите четыре признака:
- в списке устройств присутствуют все три GPU, которые вы ожидали использовать;
- движок сообщает размещение слоёв, тензоров либо вычислительных буферов на GPU;
- не появляется предупреждение о fallback на CPU или RAM для критичной части расчёта;
- на каждой карте после загрузки остаётся пространство под нагрузку выбранного контекста.
Сверяйте лог с мониторингом: рост занятой VRAM во время prefill и generation должен соответствовать выбранному сценарию. Если лог говорит о трёх устройствах, а третья карта почти не меняет загрузку и память, проверьте её индекс, режим split-mode и ограничения backend.
Когда стоит оставить запас на одной или нескольких GPU
Плотная укладка весов подходит для короткого диалога, где приоритетом служит скорость. Профиль для 260k токенов требует запаса на каждой GPU, затронутой KV-кэшем или рабочими буферами. Фиксированного процента запаса нет: его определяет пиковое потребление памяти на вашем GGUF и backend.
Практичный критерий простой: после теста на целевой длине контекста не должно быть ошибки выделения памяти, а VRAM не должна оставаться в состоянии, где следующий запрос немедленно приводит к переполнению. Если пик почти совпал с доступным лимитом, уменьшите контекст либо измените размещение кэша до перехода к длительной сессии.
Большой контекст до 260k токенов: как не упереться в память
Контекст 260k токенов меняет профиль нагрузки. Вес модели занимают память при загрузке, а KV-кэш растёт в ходе сессии вместе с числом обработанных токенов. Поэтому система может спокойно отвечать на короткие запросы и завершаться с ошибкой на большом документе.
Что меняется при переходе от обычного контекста к 260k
С ростом окна увеличивается объём KV-кэша и время prompt processing. Генерация следующего токена часто ощущается отдельно от обработки входного текста: чат может начать отвечать быстро после завершения долгого prefill, хотя суммарная задержка для пользователя уже стала высокой.
Проверяйте нагрузку ступенями, например на 8k, 32k, 128k и 260k токенов. На каждой ступени записывайте свободную VRAM, расход RAM, время обработки prompt и скорость generation. Такая последовательность показывает точку, где меняется размещение кэша или появляется переполнение.
Роль fit-ctx в выборе подходящего размера контекста
В сборках, где доступен fit-ctx, эта опция помогает подобрать размер окна под доступный ресурс по правилам конкретного движка. Используйте её как инструмент поиска стартового предела, а не как гарантию работы при любом фоне системы. Пиковая нагрузка зависит от фактически занятой памяти, временных буферов и структуры запроса.
После выбора контекста через fit-ctx обработайте prompt, близкий к рабочему максимуму, затем выполните несколько запросов подряд. Если лимит был рассчитан при пустой системе, а перед боевым запуском VRAM занял другой процесс, результат может измениться. Лог и мониторинг памяти остаются обязательными.
cache-ram: когда перенос части кэша помогает, а когда замедляет работу
Если cache-ram в вашей сборке переносит часть кэша в системную RAM или разрешает использовать её как резерв, режим может помочь поместить более крупный контекст. Цена - дополнительные перемещения данных между RAM и GPU. На PCIe это способно увеличить задержки prompt processing и снизить отзывчивость интерактивного чата.
Для пакетной обработки документов такой компромисс иногда приемлем: задача проходит без переполнения VRAM, а общее время важнее задержки первого ответа. Для диалога и агентной сессии сначала измерьте задержку на типовом запросе. Сценарии, где RAM и mmap помогают удержать крупную модель при ограниченной VRAM, разобраны в материале о запуске Qwen3.8-Flash-Next через mmap на 16 GB VRAM и 64 GB RAM.
Параметры llama.cpp без магии: lazy-mode, cache-ram и offloading
Каждый из этих режимов меняет отдельную часть профиля: момент выделения памяти, место хранения кэша либо размещение вычислений. Включайте их по одному, фиксируя показатели до и после изменения. Успешный запуск без измерений не показывает цену по памяти и скорости.
lazy-mode: отложенная загрузка и её цена
Под названием lazy-mode могут скрываться разные механизмы: отложенное чтение тензоров, ленивое отображение файлов или выделение части данных при первом обращении. Точное имя флага и поведение проверяйте в справке текущей сборки. Низкое потребление памяти сразу после старта не доказывает, что последующий длинный запрос поместится.
При проверке lazy-mode смотрите на три момента: время запуска, резкий рост VRAM или RAM после первого запроса и ошибки, возникающие только при обращении к ранее неиспользованным данным. Не путайте этот режим с решением проблемы нехватки памяти. Подробности о том, почему tensor-read-lazy не гарантирует размещение модели, есть в разборе tensor-read-lazy, mmap и split-mode для Qwen3.8-Flash-Next.
cache-ram: резерв для длинного контекста
Используйте cache-ram после того, как базовый GPU-профиль уже прошёл тест на более коротком контексте. Сначала измерьте скорость и память, затем включите RAM-кэш, повторите тот же запрос и сравните отдельно prefill и generation. Один общий показатель токенов в секунду здесь малоинформативен.
Режим подходит для трёх сценариев: обработка крупных документов, RAG с длинной историей и задачи, где приоритетом служит вместимость контекста. Он хуже подходит для случаев, когда пользователь ждёт быстрый ответ на каждом диалоговом ходе. Если после включения резко растёт загрузка CPU или задержка, проверьте, какие данные теперь проходят через RAM.
Offloading эмбеддингов: что переносить на GPU
Эмбеддинги участвуют в преобразовании входных токенов в представления, с которыми работает модель. Перенос этой части на GPU может сократить работу на CPU, но добавляет нагрузку на VRAM. При почти заполненной памяти offloading эмбеддингов способен превратить стабильный запуск в ошибку выделения буфера.
Порядок проверки такой: загрузите модель в консервативной схеме, выполните одинаковый prompt без offloading эмбеддингов, включите поддерживаемую сборкой опцию и повторите тест. Сравните пик VRAM, скорость обработки входа, скорость generation и стабильность после нескольких запросов. Для RAG проверяйте отдельно генерацию и построение векторных представлений: это могут быть разные модели и разные процессы.
Три профиля настройки под разные задачи
Один набор флагов не даст одновременно максимальную отзывчивость, контекст 260k и большой резерв VRAM. Выберите профиль по задаче, затем измерьте его на контрольных запросах.
Профиль для скорости и коротких запросов
Приоритет этого профиля - удержать критичные вычисления и кэш в VRAM, использовать умеренное окно контекста и не обращаться к RAM без необходимости. Начните с базового split-mode, который корректно загружает все три AMD MI50, и оставьте запас памяти для служебных буферов. Offloading эмбеддингов включайте только после измерения его эффекта.
Диапазон 15-200 токенов в секунду допустимо использовать лишь как ориентир для разговора о разных режимах. Нельзя обещать его для любой квантизации, backend и длины prompt. В журнале результатов разделяйте скорость prefill и decode, иначе длинный ввод исказит оценку интерактивности.
Профиль для длинного контекста
Начните с измерения KV-кэша на ступенях 8k, 32k и 128k, после чего переходите к 260k токенов. Если ваша сборка поддерживает fit-ctx, используйте его для первичного подбора размера окна. Затем проверьте cache-ram и убедитесь, что изменения реально позволяют пройти целевой сценарий, а не только завершить загрузку модели.
После выбора контекста повторно проверьте split-mode. Расклад, который хорошо работал на коротком диалоге, может оставить слишком мало VRAM на одной из GPU при длинном prefill. Offloading эмбеддингов добавляйте последним: его выигрыш по скорости не компенсирует потерю стабильности, если лимит памяти уже близок.
Консервативный профиль для стабильной работы
Этот профиль нужен при первом запуске нового GGUF, после обновления llama.cpp, драйвера или AMD backend. Задайте контекст заметно ниже целевого, оставьте запас VRAM, отключите спорные режимы и подтвердите распределение между GPU по логам. Затем меняйте один параметр за раз.
После каждого изменения выполняйте одинаковый контрольный prompt и записывайте результат. Такой порядок быстро показывает, связано ли ухудшение с lazy-mode, cache-ram, fit-ctx, offloading эмбеддингов или split-mode. Максимальная вместимость здесь не цель первого этапа, цель - диагностируемая конфигурация без случайных переполнений.
Диагностика: почему модель не запускается или работает медленно
Начинайте диагностику с симптома и строки лога, где он появился. Не уменьшайте контекст автоматически: ошибка может возникнуть при загрузке весов, в GPU backend, при выборе устройства или во время роста KV-кэша.
Ошибка нехватки VRAM при загрузке
Если out of memory появляется до обработки первого prompt, проверьте свободную память каждой GPU, формат и размер GGUF, видимость устройств, split-mode и включённый offloading. Сверьте фактическое число GPU в логе с ожидаемыми тремя AMD MI50. После этого снижайте нагрузку по одному пункту: сначала лишний GPU offload, затем схему размещения, затем размер буферов, доступный в вашей сборке.
Ошибка на одной карте при свободной памяти на двух других указывает на дисбаланс размещения, а не на недостаток суммарных 96 GB VRAM. Сохраните строки лога до ошибки: они помогают увидеть, какой буфер не удалось выделить.
Модель загружается, но падает на большом контексте
Сравните несколько размеров окна и фиксируйте момент сбоя: до prefill, во время обработки prompt или после начала generation. Рост памяти именно при длинном запросе указывает на KV-кэш и временные буферы. Проверьте fit-ctx, поведение cache-ram и пиковое потребление RAM, затем повторите тест после перезапуска процесса.
Не используйте короткий тест как доказательство готовности к 260k. Нужен prompt близкого размера либо набор документов с сопоставимым числом токенов. После успешного prefill выполните несколько дополнительных запросов, чтобы проверить поведение сессии.
Скорость резко падает после изменения конфигурации
Сначала отделите скорость обработки входа от скорости генерации. Медленный prefill часто связан с ростом контекста, переносом кэша в RAM или обменом между GPU. Медленная generation может указывать на неполный offload, дисбаланс устройств, CPU fallback либо перегруженную шину обмена.
Верните один последний изменённый параметр и повторите контрольный запрос. Если скорость восстановилась, причина локализована. Когда CPU остаётся нагруженным при модели в VRAM, проверьте полный offload слоёв, mmap, потоки и batch-size по разбору причин загрузки CPU в llama.cpp.
Один из трёх GPU используется не так, как ожидалось
Сверьте индексы устройств в системе и в логе llama.cpp, затем проверьте значение split-mode и доступные режимы в справке. Третья GPU может быть видна движку, но использоваться преимущественно под буферы или не получить часть слоёв из-за схемы распределения. Это не доказывает аппаратную неисправность.
Снимите показатели памяти и загрузки на каждой карте во время загрузки, prefill и generation. Если поведение меняется только при длинном prompt, ищите связь с KV-кэшем. Если карта не участвует уже при загрузке, проверьте backend, список видимых устройств и синтаксис параметра распределения.
Как проверить результат и зафиксировать рабочую конфигурацию
Рабочий профиль должен быть воспроизводимым. После обновления llama.cpp, драйвера, GGUF или схемы multi-GPU повторите контрольный сценарий: изменения в одном звене меняют расход памяти и скорость без изменений в остальной команде.
Минимальный чек-лист перед рабочим запуском
- версия llama.cpp и AMD backend записаны вместе с командой запуска;
- логи подтверждают видимость и участие нужных GPU;
- GGUF, квантование и размер контекста зафиксированы;
- модель прошла контрольный prompt и сценарий на целевой длине контекста;
- после prefill и нескольких запросов остаётся запас VRAM и RAM;
- cache-ram, lazy-mode, fit-ctx и offloading эмбеддингов проверены по отдельности либо сознательно отключены;
- скорость prompt processing и generation записана раздельно.
Что записать в итоговый профиль
| Поле | Что зафиксировать |
|---|---|
| Среда | Версия llama.cpp, backend, драйвер, ОС и число доступных GPU. |
| Модель | Имя GGUF, квантование, размер файла и способ загрузки. |
| Память | Свободная VRAM до запуска, пик VRAM и RAM на контрольном сценарии. |
| Распределение | split-mode, участие каждой AMD MI50 и заметки по логам. |
| Контекст | Выбранный размер окна, поведение fit-ctx и результат теста на 260k токенов. |
| Кэш и offload | Состояние cache-ram, lazy-mode и offloading эмбеддингов. |
| Производительность | Отдельные показатели prompt processing, generation и задержка контрольного запроса. |
Итог: какой компромисс выбрать
Для коротких запросов держите критичные данные в VRAM и выбирайте профиль с умеренным контекстом. Для 260k токенов заранее планируйте рост KV-кэша, проверяйте fit-ctx и при необходимости оценивайте cache-ram по фактической задержке. При нестабильной системе начните с консервативного профиля, логов и пошаговых изменений.
Главный результат настройки llama.cpp для Qwen3.8-Flash-Next на 96 GB VRAM - не самая длинная команда с флагами, а профиль, который можно повторить после перезапуска и объяснить по показателям памяти, распределению трёх GPU и скорости на реальной нагрузке.