Перейти к содержанию

Оптимизация mul_mat_id в Vulkan-бэкенде llama.cpp для MoE до 1024 экспертов

5.0/10

В релизе llama.cpp b11029 лимит выноса идентификаторов строк (row-id hoisting) для операции mul_mat_id в бэкенде Vulkan увеличен с 256 до 1024 экспертов. Ранее модели с большим числом экспертов, такие как Qwen3.8-Flash-Next с 512 экспертами, откатывались на неоптимальный путь выполнения, заставляя каждую рабочую группу заново сканировать весь тензор ids. На APU AMD Strix Halo (Radeon 8060S, RADV) при батче 2048 время матричных умножений экспертов сократилось с 12,5 до 9,5 мс для квантования iq3_s и с 14,0 до 7,5 мс для iq4_nl на операцию. В результате скорость обработки контекста (prompt processing) на длине 8k токенов выросла примерно на 19%.

Метод оптимизации

В шейдере count_experts.comp размер разделяемой памяти отвязали от константы BLOCK_SIZE (256) и увеличили до отдельного параметра MAX_EXPERTS, равного 1024, что соответствует глобальному LLAMA_MAX_EXPERTS. Три разделяемых массива теперь суммарно занимают 12 КиБ (3 × 1024 × 4 байта), полностью укладываясь в гарантированный спецификацией Vulkan базовый лимит maxComputeSharedMemorySize в 16 КиБ. Инициализация массивов переведена на поэлементную очистку в цикле вместо строго одного элемента на поток, что разблокировало row-id hoisting на стороне хоста для многоэкспертных MoE-архитектур.

Эффект оптимизации

Вычислительная задержка matmul на эксперт снизилась в 1,32–1,87 раза (до 7,5 мс на квантовании iq4_nl), обеспечив совокупное ускорение обработки длинных промптов (8k токенов) на 19% при пакетной обработке размером 2048.