На 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.

