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

Экспериментальная ветка llama.cpp получила expert expansion для MoE-моделей: что это значит для локального запуска

Разбираем экспериментальную ветку llama.cpp с поддержкой expert expansion для MoE-моделей: что автор проверил на Metal, почему результат нельзя считать универса

Коротко

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

  1. 01

    Коротко: в llama.cpp тестируют новый режим для MoE-моделей

  2. 02

    Что такое expert expansion в контексте MoE

  3. 03

    Какие части llama.cpp потенциально затрагивает эксперимент

  4. 04

    Текущий статус: интересный эксперимент, но еще не готовая замена стабильной сборке

В кастомной ветке llama.cpp появилась экспериментальная поддержка expert expansion для MoE-моделей. Автор ветки пишет, что собрал этот вариант с помощью GLM 5.3 Flash и проверил его на Metal, где результат оказался лучше его предыдущей версии на DS4.

Эти сведения пока нельзя трактовать как появление новой функции в основном llama.cpp. В доступном описании нет diff, commit, числовых бенчмарков, списка проверенных моделей и независимых повторов. Точный статус такой: перспективный прототип для тестирования, а не готовая замена стабильной сборке.

Для локального запуска MoE-моделей эксперимент интересен из-за особенностей работы с экспертами, их весами и памятью. Потенциальный выигрыш зависит от конкретной архитектуры, квантования, backend и видеокарты. Результат на Metal нельзя автоматически переносить на CUDA, Vulkan или CPU.

Коротко: в llama.cpp тестируют новый режим для MoE-моделей

Что подтверждено, а что пока остается заявлением автора

Из описания эксперимента следуют четыре факта:

  • опубликована кастомная ветка llama.cpp;
  • в ней заявлена поддержка expert expansion для MoE-моделей;
  • автор использовал GLM 5.3 Flash при сборке или подготовке этого варианта;
  • проверка на Metal, по словам автора, дала результат лучше предыдущей версии на DS4.

Остальные детали пока не раскрыты. Неизвестно, какие именно файлы и операции изменились, какие модели запускаются без ошибок, какие форматы квантования поддерживаются и что означает формулировка лучше в конкретных единицах. Речь может идти о скорости генерации, обработке prompt, задержке, использовании памяти или другой метрике.

Без опубликованного diff нельзя определить, затронуты ли загрузчик модели, граф вычислений, маршрутизация токенов, размещение экспертных весов или отдельные ядра backend. По этой же причине нельзя утверждать, что ветка уже совместима со всеми MoE-архитектурами или снижает требования к VRAM.

Почему для MoE-моделей это вообще важно

MoE расшифровывается как Mixture of Experts, то есть смесь экспертов. Такая модель содержит несколько специализированных блоков, а маршрутизатор выбирает, какие из них обработают конкретный токен. Поэтому общий объём параметров модели и объём вычислений для одного токена могут заметно различаться.

Эта особенность помогает запускать модели с большим числом параметров при относительно меньшем активном вычислительном объёме. Но веса экспертов всё равно нужно хранить, загружать или перемещать между уровнями памяти. На скорость влияют пропускная способность памяти, накладные расходы маршрутизации, размер batch, работа с квантованными тензорами и способность backend эффективно выполнять нерегулярные операции.

Практический контекст хорошо виден в разборе запуска крупной MoE-модели на одной видеокарте, где отдельно рассматриваются unified memory, offload экспертов и управление batch в llama.cpp. Его результаты нельзя переносить на новую ветку без повторной проверки: другая модель или backend меняют профиль нагрузки.

Что такое expert expansion в контексте MoE

Как MoE-модель выбирает экспертов

В типичном MoE-слое маршрутизатор получает скрытое состояние токена и рассчитывает оценки для набора экспертов. Затем выбирается несколько наиболее подходящих блоков, часто через схему top-k. Токен направляется к выбранным экспертам, их результаты объединяются, после чего вычисления продолжаются в следующих слоях модели.

Число экспертов и значение k зависят от архитектуры. Эти параметры нельзя восстановить по одному упоминанию expert expansion. Для разных моделей отличаются формат весов, порядок операций, способы объединения результатов и требования к памяти.

Главное различие с плотной моделью состоит в характере нагрузки. Плотный слой применяет один набор весов ко всем токенам. MoE-слой должен выбрать экспертов, собрать соответствующие токены, выполнить несколько групп матричных операций и вернуть результаты в исходный порядок. При маленьком batch такие операции могут плохо загружать GPU, а при большом batch растут требования к памяти и обмену данными.

Что может означать расширение работы с экспертами

Expert expansion в этой новости нужно воспринимать как название экспериментального подхода к исполнению MoE-части в llama.cpp. Подробной спецификации термина нет, поэтому точный механизм нельзя выдавать за установленный факт.

Теоретически ветка может затрагивать несколько областей:

  • представление и упаковку экспертных весов;
  • выбор, загрузку и размещение экспертов в RAM, VRAM или unified memory;
  • формирование групп токенов после работы маршрутизатора;
  • вычисление MoE-слоёв и объединение результатов;
  • распределение операций между CPU и конкретным GPU-backend;
  • планирование перемещения весов и синхронизацию между этапами инференса.

Само слово expansion не доказывает, что для каждого токена запускается больше экспертов. Оно может описывать расширенный путь обработки экспертных блоков, иной формат данных или поддержку нового сценария исполнения. Ответ даст только исходный код ветки, описание commit и тесты на конкретных моделях.

Любое изменение в этой цепочке способно повлиять сразу на несколько характеристик: скорость обработки prompt, скорость генерации, время до первого токена, пиковое потребление памяти и стабильность при длинном контексте. Улучшение одной метрики может сопровождаться ростом другой, поэтому оценивать подход нужно комплексно.

Какие части llama.cpp потенциально затрагивает эксперимент

Изменения на уровне MoE-операций и экспертных весов

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

  • Граф вычислений: появился ли новый путь для MoE-операций или изменился порядок существующих узлов.
  • Маршрутизация: меняется ли только передача токенов экспертам или сам способ выбора и группировки.
  • Экспертные веса: меняются ли их формат, расположение, загрузка и перемещение между типами памяти.
  • Квантование: сохраняется ли прежний путь для поддерживаемых форматов или нужны отдельные kernels.
  • Охват архитектур: работает ли код со всеми MoE-слоями или рассчитан на конкретный вариант модели.
  • Fallback: существует ли запасной путь для операций, которые конкретный backend не умеет выполнять.

Эти вопросы отделяют реальную поддержку от изменения, которое успешно собирается только на одной конфигурации. По доступному описанию нельзя утверждать наличие offload, sparsity, экономии VRAM или ускорения для конкретного формата квантования.

Перемещение экспертных весов само по себе может стать узким местом. В разборе предзагрузки экспертов MoE рассматривается подход, который уменьшает влияние задержки обмена данными. Это отдельное направление, и оно не подтверждает наличие такого механизма в рассматриваемой ветке llama.cpp.

Роль backend: почему результат на Metal нельзя автоматически перенести на CUDA

Backend определяет, какие операции выполняются на GPU, как размещаются тензоры и сколько времени занимает передача данных. Metal, CUDA, Vulkan и CPU используют разные пути исполнения, наборы оптимизированных операций и способы работы с памятью.

Успешная проверка на Metal показывает, что автору удалось получить рабочий сценарий на этой платформе. Она не отвечает на вопросы о CUDA, Vulkan и CPU. Даже две видеокарты с похожей вычислительной мощностью могут показать разный результат из-за пропускной способности памяти, размера кэша, поддержки нужных операций и качества конкретного kernel.

Для MoE это особенно заметно. Маршрутизация создаёт неравномерные группы токенов, а эксперты могут обращаться к большим массивам весов. Backend с удачным fused-путём даст один профиль скорости, а backend с частыми промежуточными копированиями покажет другой. Сборка ветки без ошибок тоже не гарантирует корректный или быстрый инференс.

Текущий статус: интересный эксперимент, но еще не готовая замена стабильной сборке

Что означает заявленный результат на Metal

Фраза лучше предыдущей версии на DS4 пока описывает направление, а не полноценный бенчмарк. Для воспроизводимого сравнения нужны как минимум:

  • точная модель и её формат;
  • квантование экспертных и общих весов;
  • версия и commit обеих сборок;
  • модель устройства и объём доступной памяти;
  • версия ОС и параметры Metal-среды;
  • размер контекста, batch и число обрабатываемых токенов;
  • настройки offload и число CPU-потоков;
  • раздельные показатели для prompt processing и generation;
  • условия прогрева и число повторов.

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

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

Какие ограничения уже видны из описания

  • Проверка заявлена для Metal, а данные по CUDA, Vulkan и CPU отсутствуют.
  • Не опубликован список MoE-моделей, на которых ветка точно работает.
  • Нет числовых результатов, методики измерений и исходных условий сравнения.
  • Неизвестно, какие форматы квантования и размеры контекста поддерживаются.
  • Неясно, вошли ли изменения в upstream llama.cpp или остались в отдельной ветке.
  • Нет подтверждения снижения требований к VRAM, RAM или объёму unified memory.
  • Не описаны возможные регрессии, ограничения длительных запусков и fallback для неподдерживаемых операций.

Отдельная ветка сама по себе не говорит о низком качестве кода. Она показывает, что подход ещё нужно проверить на совместимость и устойчивость. Похожий вопрос разделения основной и экспериментальной веток разобран в материале о поддержке Minimax M3 в llama.cpp.

Как тестировать MoE-модели локально на новой ветке llama.cpp

Что зафиксировать до запуска

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

  • Код: название ветки или commit, дата сборки и параметры компиляции.
  • ОС и backend: Metal, CUDA, Vulkan или CPU, версия драйвера и доступные аппаратные ускорения.
  • Устройство: модель GPU или CPU, объём VRAM, RAM и unified memory, если она используется.
  • Модель: архитектура, размер, формат файла и квантование общих и экспертных весов.
  • Контекст: длина контекста, размер batch, число microbatch и настройки offload.
  • Инференс: число CPU-потоков, sampler, seed, температура и параметры генерации.
  • Сценарий: одинаковый prompt, одинаковая длина ответа, прогрев перед замером и число повторов.

Для Mac стоит отдельно записать версию macOS, модель устройства и параметры Metal-среды. Для CUDA полезно сохранить версию драйвера и CUDA toolchain. На CPU нужно указать тип процессора, число используемых потоков и набор инструкций, если он виден в отчёте сборки.

Какие метрики собирать

Скорость генерации в токенах в секунду даёт лишь часть картины. В протокол нужно включить следующие показатели:

  • Prompt processing: сколько токенов в секунду обрабатывается при загрузке контекста.
  • Generation: скорость выдачи новых токенов после обработки prompt.
  • Время до первого токена: задержка между отправкой запроса и началом ответа.
  • Память: пиковое использование VRAM и RAM, включая момент загрузки модели.
  • Стабильность: ошибки, зависания, падения, рост потребления памяти и сбои на длинной генерации.
  • Корректность: способность модели выдавать связный ответ без пропусков, повторов и повреждения текста.
  • Нагрузка: степень загрузки GPU и CPU, если средства мониторинга позволяют её снять.

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

Удобный шаблон записи результата выглядит так:

BackendАппаратная конфигурацияМодель и квантованиеPrompt, токенов в секундуGeneration, токенов в секундуПиковая памятьСтатус и ошибки
Metalмодель Mac и памятьназвание и форматзначениезначениеVRAM или unified memory, RAMуспешно или описание ошибки
CUDAGPU, VRAM, драйверназвание и форматзначениезначениезначениеуспешно или описание ошибки
VulkanGPU и драйверназвание и форматзначениезначениезначениеуспешно или описание ошибки
CPUпроцессор и потокиназвание и форматзначениезначениеRAMуспешно или описание ошибки

Как расширить проверку за пределы Metal

Начать стоит с той же модели и того же файла, на которых автор получил результат на Metal. Затем нужно повторить сценарий на CUDA, Vulkan и CPU, если ветка собирается и запускает выбранную архитектуру на этих backend. Отсутствие поддержки нужно фиксировать отдельно от ошибки сборки или ошибки конкретной модели.

Для каждой платформы полезно проверить несколько MoE-моделей с разным общим размером, числом экспертов и форматом квантования, но только если ветка заявляет совместимость с такими вариантами. В набор стоит включить короткий prompt, длинный контекст и продолжительную генерацию. Это помогает увидеть разницу между загрузкой модели, префиллом и стабильностью после нескольких минут работы.

Результат нужно публиковать как комбинацию конкретных условий: commit, backend, устройство, модель, квантование, параметры контекста, скорость, память и логи ошибок. Формулировка работает быстрее сама по себе без этой матрицы мало полезна. Она описывает одну конфигурацию и не доказывает универсальный эффект.

Почему expert expansion может повлиять на будущее локальных MoE-моделей

Что нужно доказать, чтобы подход стал практически значимым

Переход от прототипа к повседневному инструменту потребует измерений на нескольких архитектурах и платформах. Нужны следующие результаты:

  • воспроизводимое ускорение prompt processing или generation;
  • понятное влияние на время до первого токена;
  • предсказуемое потребление VRAM и RAM при разных размерах контекста;
  • стабильная работа с несколькими форматами квантования;
  • сохранение корректности ответов;
  • отсутствие критичных регрессий относительно прежнего пути;
  • описание ограничений и списка совместимых моделей;
  • рабочие fallback-сценарии для backend без нужных операций.

Для локального инференса особенно полезен измеримый баланс между активными вычислениями и перемещением весов. Быстрее выполнять MoE-операцию мало, если обмен данными занимает большую часть времени. Эксперимент должен показать, где сокращается задержка и какой ресурс становится новым ограничением.

Кому имеет смысл следить за этой веткой уже сейчас

Разработчикам и энтузиастам ветка подходит как объект воспроизводимых экспериментов. Они могут проверить собственные модели, найти ошибки на новых backend и передать автору данные для issue или pull request. Наибольшую пользу принесут точные логи, аппаратная конфигурация и сравнение со стабильной сборкой.

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

Следить за веткой стоит тем, кому требуется запускать крупные MoE-модели локально при ограничениях по VRAM или пропускной способности памяти. Потенциальный эффект может проявиться в скорости, задержке или распределении памяти, но конкретный результат зависит от модели и оборудования.

Вывод: за экспериментом стоит следить, но оценивать его нужно по данным

Expert expansion в кастомной ветке llama.cpp выглядит интересным направлением для локального инференса MoE-моделей. Заявление автора о лучшем результате на Metal по сравнению с предыдущей версией на DS4 даёт повод для проверки, но не заменяет полноценный бенчмарк.

Сейчас нет подтверждений универсального ускорения, списка совместимых моделей, снижения требований к памяти или готовности функции для основного upstream. Главный следующий шаг, независимые тесты на Metal, CUDA, Vulkan и CPU с одинаковыми моделями, параметрами и метриками.

Если вы проверяете ветку, публикуйте commit, параметры сборки, модель и квантование, конфигурацию памяти, показатели prompt processing и generation, а также ошибки и регрессии. Такая обратная связь поможет понять, превращается ли эксперимент в практичный механизм для локальных MoE-моделей или пока работает лишь в узком сценарии.

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