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

Как настроить Qwen3.8 в llama.cpp на двух RTX 3090: GGUF, MTP, tensor split и длинный контекст

Практическая инструкция по настройке Qwen3.8 в llama.cpp на двух RTX 3090: как проверить GGUF, распределить модель через tensor split, оценить поддержку MTP, по

Коротко

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

  1. 01

    Что можно получить от двух RTX 3090 и что нужно проверить заранее

  2. 02

    Как выбрать Qwen3.8 GGUF для llama.cpp

  3. 03

    Базовый запуск llama.cpp как точка отсчёта

  4. 04

    Tensor split на двух RTX 3090 без NVLink

Две RTX 3090 с 24 ГБ VRAM каждая дают суммарно 48 ГБ видеопамяти, но этот объём нельзя воспринимать как единый пул с характеристиками одной 48-гигабайтной карты. Без NVLink видеокарты обмениваются данными через доступную системную шину, поэтому результат зависит от способа распределения тензоров, загрузки PCIe, размера батча и длины контекста.

Для запуска Qwen3.8 в llama.cpp сначала нужно подтвердить конкретную GGUF-сборку, её архитектуру и требования к памяти. В доступных материалах подтвержден файл Qwen3.8-14B-Instruct-Turbo.Q6_K.gguf из репозитория mradermacher/Qwen3.8-14B-Instruct-Turbo-GGUF. Сведения о 27B-сборке, MTP, tensor split и скорости на двух RTX 3090 требуют отдельной проверки. Поэтому универсальные значения tokens/s или максимального контекста для этой конфигурации приводить нельзя.

Рабочий порядок такой: проверить веса и версию llama.cpp, запустить модель в базовом режиме, убедиться в загрузке обеих GPU, затем отдельно сравнить tensor split, MTP и варианты KV-cache. Каждый шаг нужно оценивать по скорости обработки промпта, скорости генерации, расходу VRAM, качеству ответов и стабильности.

Что можно получить от двух RTX 3090 и что нужно проверить заранее

RTX 3090 располагает 24 ГБ VRAM, поэтому две карты дают значительный запас для распределения весов и KV-cache. Точный результат задают четыре величины:

  • размер и тип квантизации GGUF;
  • объём свободной VRAM после загрузки драйвера и других процессов;
  • размер контекстного окна и число одновременно обрабатываемых токенов;
  • способ распределения модели между GPU.

Размер файла GGUF показывает объём весов на диске, но не равен итоговому расходу VRAM. При запуске нужны рабочие буферы, память под вычисления, KV-cache и служебные структуры. Увеличение контекста может привести к CUDA out of memory даже после успешной загрузки весов.

Отсутствие NVLink ограничивает обмен между видеокартами. Равномерно занятая память на двух устройствах ещё не доказывает, что вычисления распределены эффективно. В логах llama.cpp нужно искать сообщения о размещении слоёв или тензоров, сведения о CUDA backend и признаки CPU-fallback. Во время генерации полезно отдельно наблюдать загрузку GPU, занятую VRAM и активность шины.

Перед настройкой проверьте:

  • модель GPU и объём VRAM каждой карты;
  • версию драйвера NVIDIA и сборку CUDA backend;
  • версию llama.cpp;
  • свободную память на обеих RTX 3090;
  • подключение карт к PCIe и отсутствие фоновых задач, забирающих VRAM;
  • режим модели, Instruct или другой вариант обучения;
  • поддержку нужной архитектуры в выбранной версии llama.cpp.

Если конкретная сборка Qwen3.8 не помещается с выбранным контекстом, tensor split не устранит нехватку памяти. Он меняет раскладку вычислений, но не отменяет размер весов и KV-cache.

Как выбрать Qwen3.8 GGUF для llama.cpp

Что известно о Qwen3.8-14B-Instruct-Turbo.Q6_K.gguf

Подтвержденный пример GGUF для этой темы называется Qwen3.8-14B-Instruct-Turbo.Q6_K.gguf. Файл размещен в репозитории mradermacher/Qwen3.8-14B-Instruct-Turbo-GGUF. В описании указана загрузка большого файла через hf CLI. Сам факт публикации файла не подтверждает его размер в гигабайтах, скорость на RTX 3090, объём необходимой VRAM или качество по сравнению с другими квантами.

Эту сборку нужно отделять от предположения о наличии Qwen3.8 на 27 миллиардов параметров. Название статьи может ориентироваться на 27B-сценарий, но техническая инструкция должна опираться на реально найденные веса. Если файл имеет другой размер модели, это меняет требования к памяти, смысл tensor split и ожидаемый масштаб эксперимента.

Перед скачиванием проверьте точное имя файла и репозитория. Большой GGUF-файл лучше получать через поддерживаемый hf CLI, а не через случайную копию с неизвестными метаданными. После загрузки сохраните имя файла без переименования: оно помогает быстро сверить семейство, режим и тип квантизации.

Q6_K и другие варианты квантизации: что сравнивать

Обозначение Q6_K описывает способ квантизации весов. В общем случае более тяжёлый квант требует больше места, но оставляет больший запас точности. Более компактный вариант освобождает VRAM для контекста и рабочих буферов, однако потенциальная потеря качества зависит от архитектуры, конкретных слоёв и задач.

Для сравнения квантов фиксируйте четыре параметра:

ПараметрЧто проверять
Размер весовСколько места занимает GGUF и сколько VRAM остаётся после загрузки
КонтекстКакой размер окна удаётся удерживать без ошибок памяти
СкоростьPrompt processing и generation tokens/s в одинаковом сценарии
КачествоСледование инструкции, код, рассуждения, форматирование и tool calling, если он нужен

Q6_K нельзя автоматически объявлять лучшим выбором для двух RTX 3090. Его пригодность зависит от того, сколько памяти потребуется под контекст и какие задачи стоят перед моделью. Для коротких запросов запас под KV-cache может быть менее важен. Для длинных документов он быстро становится ограничивающим фактором.

Проверка файла до запуска

Проверку удобно проводить в несколько этапов:

  1. Сверьте имя файла с заявленным семейством Qwen3.8, размером модели, режимом Instruct и типом квантизации.
  2. Убедитесь, что загрузка завершилась без ошибки и файл не имеет подозрительно малого размера.
  3. Прочитайте GGUF metadata через инструмент, который используется в вашей сборке llama.cpp.
  4. Проверьте архитектуру, специальные токены, размер словаря и наличие chat template в метаданных.
  5. Сопоставьте архитектуру с поддержкой текущей версии llama.cpp.

В метаданных ищите название семейства, вариант обучения, сведения о контекстном окне, параметры RoPE и шаблон диалога. Отсутствие ожидаемых полей не всегда означает повреждение файла, но требует сверки с документацией конкретной модели.

После проверки файла запишите контрольные данные в журнал эксперимента: имя GGUF, дату загрузки, версию llama.cpp, драйвер и параметры запуска. Без этого сравнение двух конфигураций быстро превращается в догадки.

Базовый запуск llama.cpp как точка отсчёта

Сначала нужен запуск без MTP и сложных вариантов KV-cache. Базовая конфигурация должна отвечать на простой вопрос: загружается ли модель, используется ли CUDA и какая часть памяти остаётся под контекст.

Зафиксируйте:

  • версию llama.cpp и способ сборки;
  • имя GGUF-файла;
  • число слоёв, вынесенных на GPU;
  • размер контекста;
  • размер batch и microbatch;
  • раскладку GPU;
  • шаблон чата и параметры sampling;
  • seed, prompt и длину ответа.

Первый тест лучше проводить с умеренным контекстом и коротким ответом. Он должен показать, что модель отвечает без служебных маркеров, не падает на старте и не переводит вычисления на CPU. После этого контекст и batch можно менять по одному параметру.

Разделяйте две метрики. Prompt processing показывает скорость обработки входных токенов. Generation показывает скорость вывода новых токенов. Большой batch может заметно изменить первую величину, но не гарантирует такого же эффекта для второй.

Полезный минимальный набор тестов включает короткий вопрос, генерацию кода и запрос с длинным контекстом. Один и тот же prompt нужно запускать с одинаковыми параметрами sampling. Сравнение ответов при разных шаблонах или случайных seed не даёт чистой картины.

Для общего понимания компромиссов между квантованием, KV-cache, контекстом и speculative decoding можно использовать разбор запуска Qwen 27B с контекстом 100K. Его параметры нельзя переносить на Qwen3.8 и две RTX 3090 без повторной проверки.

Tensor split на двух RTX 3090 без NVLink

Как понять, что обе видеокарты действительно используются

Tensor split распределяет части вычислений или связанные с ними данные между несколькими GPU. В конкретной версии llama.cpp поддержка и синтаксис параметров могут различаться, поэтому сначала сверяйте справку самой сборки.

После старта проверьте три группы признаков:

  • логи llama.cpp сообщают о двух CUDA-устройствах и раскладке модели;
  • VRAM занята на обеих картах, а не почти полностью на одной;
  • во время генерации обе GPU выполняют вычисления, а CPU не становится основным исполнителем.

Мониторинг только занятой памяти недостаточен. Часть данных может находиться на второй карте, пока вычислительная нагрузка остаётся на первой. Смотрите загрузку устройств в течение нескольких десятков секунд генерации, а не один снимок после запуска.

Начните с равномерного распределения. Затем изменяйте пропорции небольшими шагами, если одна карта упирается в VRAM раньше другой или обмен через PCIe становится заметным. Каждое изменение проверяйте на одном prompt, одинаковом контексте и одинаковой длине ответа.

Почему отсутствие NVLink влияет на результат

NVLink предоставляет отдельный высокоскоростной канал между совместимыми устройствами. При его отсутствии обмен идёт через доступную системную инфраструктуру, а задержки и пропускная способность зависят от платформы, PCIe-линий и текущей нагрузки.

Из-за этого две RTX 3090 не складываются в одну карту с линейным удвоением скорости. Распределение веса между GPU может помочь загрузить модель, но цена обмена данными способна ограничить generation. Эффект меняется при разных batch size, длине последовательности и типе параллелизма.

Нужно различать распределение слоёв и tensor split. При размещении слоёв модель делят по группам слоёв, а при tensor parallelism отдельные тензорные операции распределяются между устройствами. Эти схемы создают разную коммуникационную нагрузку и требуют разных возможностей backend.

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

  1. Запустите модель на одной GPU, если она помещается в выбранной квантизации.
  2. Зафиксируйте prompt processing, generation, расход VRAM и время до первого токена.
  3. Подключите вторую карту с равномерной раскладкой.
  4. Проверьте логи, загрузку обеих GPU и наличие CPU-fallback.
  5. Изменяйте пропорции только после подтверждения стабильного запуска.

Если цель состоит в увеличении доступного контекста, небольшое снижение tokens/s может быть приемлемым. Если важна потоковая генерация, нужно оценивать задержку обмена и скорость вывода на длинной последовательности.

Отдельный материал AI-Manual посвящён схеме Qwen3.8 27B на двух RTX 3090 с DFlash2 и LMCache. Он полезен для сравнения архитектурных подходов, но его настройки относятся к другой связке инструментов и не подтверждают результат для llama.cpp: разбор локального стека на двух RTX 3090.

MTP в llama.cpp: когда спекулятивное декодирование имеет смысл

Какие компоненты нужны для MTP

MTP, или multi-token prediction, использует дополнительные предсказания для проверки нескольких следующих токенов. В удачном сценарии основная модель принимает часть предложенных токенов за один цикл, сокращая число дорогих последовательных шагов декодирования.

Название модели и наличие GGUF сами по себе не подтверждают поддержку MTP. Нужны совместимые:

  • архитектура основной модели;
  • GGUF-веса и связанные компоненты, если они требуются;
  • draft model или другой компонент для спекулятивного предсказания;
  • версия llama.cpp;
  • CUDA backend и параметры запуска.

В исследованных материалах нет подтверждения MTP для Qwen3.8 в llama.cpp на двух RTX 3090. Поэтому включать такую функцию можно только после проверки документации и вывода самой сборки. Если llama.cpp сообщает о неподдерживаемом типе модели или не находит draft-компонент, проблема находится в совместимости, а не в tensor split.

Дополнительная модель расходует память. На конфигурации с длинным контекстом это может уменьшить доступное окно и вызвать CUDA out of memory. MTP нужно оценивать как обмен памяти на потенциальное ускорение, а не как бесплатный переключатель.

Как измерять эффект без самообмана

Сравнение baseline и MTP проводите на одном железе и одной сборке основной модели. Зафиксируйте:

  • одинаковый prompt и объём контекста;
  • одинаковую длину генерируемого ответа;
  • seed и параметры sampling;
  • размеры batch и microbatch;
  • раскладку по GPU;
  • число прогонов после прогрева.

Записывайте prompt processing, generation tokens/s, задержку первого токена, расход VRAM и ошибки. Для спекулятивного режима добавьте acceptance rate, если сборка его показывает. Низкая доля принятых draft-токенов может свести ожидаемую пользу к нулю.

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

Для контекста Qwen3.8 27B и MTP есть отдельный практический разбор на RTX 4090, где приведены результаты именно той конфигурации. Эти цифры нельзя выдавать за показатели двух RTX 3090, но методика сравнения baseline и MTP пригодна как ориентир: разбор Qwen3.8 27B в 24 ГБ VRAM.

Длинный контекст и KV-cache: где заканчивается запас VRAM

Как подбирать размер контекста

KV-cache хранит состояния внимания для уже обработанных токенов. При росте контекста увеличивается объём данных, которые нужно удерживать для продолжения диалога. Память расходуется на веса, KV-cache, временные буферы и операции backend.

Подбирайте окно пошагово:

  1. Начните с умеренного контекста, который уверенно помещается после загрузки модели.
  2. Запустите одинаковый тестовый prompt и генерацию.
  3. Увеличьте контекст небольшим шагом.
  4. Повторите проверку VRAM, скорости и стабильности.
  5. Остановитесь при OOM, резком падении скорости, CPU-fallback или деградации ответов.

Формальное значение максимального контекста в метаданных не гарантирует, что конкретная связка GPU выдержит его с выбранным квантом. Рабочий предел зависит от свободной памяти, batch size, backend, KV-cache и дополнительных компонентов MTP.

Длинный prompt влияет на prompt processing и может увеличить задержку первого токена. Генерация после заполнения окна тоже способна замедлиться из-за роста операций с KV-cache. Эти режимы нужно измерять отдельно.

Когда имеет смысл ужимать KV-cache

Квантизация KV-cache снижает расход памяти на состояния внимания и может освободить место под большее окно. Цена зависит от архитектуры и режима инференса. Сжатие способно повлиять на точность ответа, особенно при длинных цепочках рассуждений, работе с кодом и извлечении фактов из большого документа.

Проверяйте варианты KV-cache парно:

ПроверкаЧто сравнить
ПамятьСвободная VRAM и максимальный стабильный контекст
СкоростьВремя первого токена и generation tokens/s
КачествоОтветы на одинаковые вопросы, извлечение фактов и генерация кода
СтабильностьОшибки CUDA, повторяемость и отсутствие CPU-fallback

Не переносите конкретный тип KV-cache из другой модели или версии llama.cpp без проверки совместимости. Доступный параметр может называться иначе, поддерживаться частично или работать только для определённых CUDA-квантов.

Chat template выбирается отдельно от весов

Как распознать неправильный шаблон

GGUF может содержать метаданные chat template, но наличие поля не отменяет необходимость проверить формат сообщений. Instruct-вариант ожидает определённую структуру ролей, специальных токенов и маркера завершения ответа.

На неподходящий шаблон указывают:

  • повторение слов user, assistant или других служебных маркеров в ответе;
  • игнорирование system prompt;
  • неестественное начало генерации;
  • ответ от лица неправильной роли;
  • отсутствие корректной остановки;
  • нестабильное поведение на одинаковых запросах.

Такие симптомы не доказывают проблему GPU. Сначала проверьте встроенный шаблон, специальные токены и формат массива сообщений. Затем сравните ответ на одном prompt с другим допустимым вариантом. Переменные sampling, контекст и модель при этом менять нельзя.

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

Чеклист проверки: скорость, качество и стабильность

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

ПолеПример записи
МодельПолное имя GGUF-файла и режим Instruct
ПОВерсия llama.cpp, драйвера и CUDA backend
GPUДве RTX 3090, занятая VRAM на каждой карте
РаскладкаБазовый режим, tensor split или другая схема
КонтекстРазмер окна в токенах
KV-cacheТип и параметры, если они менялись
MTPВыключен или включён, draft-компонент и его параметры
СкоростьPrompt processing и generation tokens/s
ЗадержкаВремя до первого токена
КачествоОшибки в фактах, коде, формате и следовании инструкции
СтабильностьOOM, зависания, fallback на CPU и повторяемость

Минимальный протокол состоит из базового запуска, tensor split, MTP и двух значений контекста. В отдельном прогоне сравните варианты KV-cache. Для каждого теста используйте один набор запросов: короткий диалог, генерацию кода, извлечение фактов из длинного текста и задачу с системной инструкцией.

Скорость без качества не даёт полезной настройки. Быстрый ответ с пропущенными ограничениями system prompt или повреждённым кодом может оказаться хуже более медленного режима. Записывайте результат полностью, а не только одну цифру tokens/s.

Типовые ошибки при запуске Qwen3.8 в llama.cpp

Что проверить перед публикацией собственных бенчмарков

Публичный benchmark должен содержать точное имя GGUF и версию llama.cpp. Формулировка «Qwen3.8 на двух RTX 3090 работает со скоростью X» недостаточна: неизвестны квант, контекст, batch, раскладка GPU, MTP, длина ответа и метод подсчёта.

Перед публикацией укажите:

  • полную модель и тип квантизации;
  • версию llama.cpp и backend;
  • драйвер, CPU и схему подключения GPU;
  • размер контекста и batch;
  • параметры tensor split;
  • наличие MTP и draft model;
  • тип KV-cache;
  • prompt, длину вывода и число прогонов;
  • prompt processing, generation и задержку первого токена;
  • ошибки и фактическую загрузку обеих видеокарт.

Не называйте наблюдение универсальной характеристикой модели. Результат без подробной методики относится к конкретному компьютеру и конкретной сборке.

Диагностический порядок

CUDA out of memory. Уменьшите контекст и batch, проверьте остаток VRAM после загрузки весов, затем оцените более компактный квант или KV-cache. Не включайте MTP до того, как базовый запуск начнёт стабильно работать.

Несовместимая архитектура. Сверьте метаданные GGUF и поддержку семейства текущей версией llama.cpp. Ошибка на этапе чтения модели не исправляется изменением tensor split.

Вторая GPU почти не используется. Проверьте параметр раскладки, логи CUDA, PCIe и наличие CPU-fallback. Видимость двух устройств в системе не доказывает распределение вычислений.

MTP не запускается. Проверьте поддержку функции в llama.cpp, совместимость основной модели, наличие draft-компонента и синтаксис параметров. Исследованные материалы не подтверждают конкретную MTP-конфигурацию для Qwen3.8 в llama.cpp.

Модель отвечает странно. Проверьте chat template, роли, system prompt, специальные токены и остановку генерации. Квантование и GPU стоит анализировать после проверки формата диалога.

Длинный контекст работает, но слишком медленно. Сравните prompt processing и generation, уменьшите batch только в одном тесте, проверьте KV-cache и зафиксируйте загрузку GPU. Большое окно само по себе не означает высокую скорость.

Для проверки заявлений о сверхдлинном контексте полезен материал о запуске Qwen3.8-27B на двух RTX 5090: разбор контекста в 1 048 576 токенов. Он показывает, почему значение max context нужно отделять от рабочего сценария с реальным retrieval и стабильной генерацией.

Для связки из двух RTX 3090 итоговый чеклист прост: подтвердите модель и квант, добейтесь стабильного базового запуска, проверьте обе GPU, измерьте tensor split, затем отдельно тестируйте MTP и KV-cache. Доступные факты подтверждают наличие файла Qwen3.8-14B-Instruct-Turbo.Q6_K.gguf и загрузку через hf CLI, но не дают оснований обещать характеристики 27B-сборки или фиксированное ускорение на RTX 3090.

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