На RTX 5090 с llama.cpp b10326 MoE-модель Qwen3.5-35B-A3B достигает лишь 41% пропускной способности памяти, тогда как плотная Qwen3.5-9B — 72%. При этом MoE быстрее в абсолюте: 317 токенов в секунду против 240. Автор провёл детальные измерения и выяснил, что дело не в маршрутизации экспертов, а в неэффективном чтении памяти при малых объёмах данных на ядро.

Маршрутизация экспертов, на которую часто списывают потери производительности MoE, здесь почти ни при чём. Автор измерил её отдельно: ядра topk_moe вместе с выборкой строк занимают 7.0% времени в ядрах, тогда как матрично-векторные умножения (mul_mat_vec) — 51%. CUDA-графы захватываются корректно, GPU занят на 97%, но полоса памяти используется лишь на 41%. Это означает, что ядра выполняются, но читают память неэффективно.

ПараметрMoE 35B-A3BПлотная 9B
Слоёв41 (11 внимания, 30 GDN)33 (9 внимания, 24 GDN)
Эксперты256 всего, на токен 8 маршрутизируемых плюс 1 общийнет
Веса на токен2.007 ГБ4.900 ГБ
Состояние GDN (чтение и запись)0.126 ГБ0.101 ГБ
Всего на токен2.133 ГБ5.000 ГБ
Замер, т/с317.45 (разброс 0.74%)239.62 ± 0.86

Ключевая гипотеза: пока ядро читает мало байт, оно не успевает наполнить контроллер памяти запросами и не выходит на полную полосу. Автор проверил это на настоящем ядре ggml с холодными данными: рабочий набор в сорок раз больше кэша L2 (96 МиБ), поэтому каждый вес читается один раз за токен. Результаты показали, что при объёме чтения 1 МБ на ядро полоса составляет 381 ГБ/с (23% пика), а при 537 МБ — 1683 ГБ/с (100%). Пик кривой 1683 ГБ/с совпадает с независимо измеренной полосой 1671 ГБ/с с точностью 0.7%.

Причина — не маршрутизация экспертов, а неэффективное чтение памяти при малых объёмах данных на ядро.

Практический вывод: для MoE-моделей, где на токен читается всего 2.133 ГБ (против 5.000 ГБ у плотной), ядра не добирают полосу из-за малого объёма данных. Автор прогнозирует, что укрупнение ядер (обработка большего объёма за один вызов) даст выигрыш от 1.38 до 1.54 раза. Это может быть реализовано, например, путём объединения нескольких матриц в одну или изменения стратегии декодирования.

Измерения проводились на стенде: RTX 5090 32 ГБ GDDR7, драйвер 580.159.03, llama.cpp b10326 (коммит 3653e6d6d), CUDA 12.8, квант Q4_0 (фактически смесь: голова q6_K, часть тензоров q8_0 и q5_0, треть матвеков в f32). Полоса измерена, а не взята из спецификации: паспортные 1792 ГБ/с недостижимы, реальная полоса — 1671 ГБ/с (93% паспортной). Скорость снята с помощью llama-bench с пятью повторами на точку, при пустом контексте. При контексте 32K скорость MoE падает на 14.5% — с 317.45 до 271.53 т/с.

Эти результаты важны для разработчиков, оптимизирующих инференс LLM: они показывают, что узким местом MoE может быть не маршрутизация, а эффективность чтения памяти. Укрупнение ядер — перспективное направление, которое может существенно ускорить MoE-модели на современных GPU.