llama.cpp b11372: двукратное сокращение памяти скоринга в qwen4exp¶
4.0/10
В релизе llama.cpp b11372 интегрирован PR #29825, оптимизирующий потребление памяти при длинном контексте для экспериментальной архитектуры qwen4exp на бэкендах CUDA, Metal и Vulkan. Ранее граф вычислений одновременно удерживал два f32-тензора размерностью [n_pool, n_idx_h, n_tokens], которые являлись крупнейшими буферами памяти при обработке длинных последовательностей. За счет перевода вычислений на ggml_lightning_indexer и поэтапной аккумуляции буфер скоринга был уменьшен вдвое до одного тензора [n_pool, n_tokens]. Изменения также оптимизируют ядра под CUDA (поддержка 4 голов), Metal (константы функций) и Vulkan (тайлинг 64 ключей на 8 токенов с FP16 dot-product).
Метод оптимизации¶
Вместо параллельного вычисления всех голов внимания с материализацией промежуточных копий скоринг переведен на вызов ggml_lightning_indexer с пулом ключей и маской FP16, что позволяет читать ключи один раз без сохранения оценок по отдельным головам. Для Vulkan реализован тайлинг рабочей группы 64x8 с размещением ключей в разделяемой памяти и FP16 векторными инструкциями, а в CUDA задействован векторный кернел для конфигураций с 4 головами. Аллокатор графа автоматически переиспользует буферы через стандартные операции ggml_add и ggml_relu по месту без выделения дополнительных вычислительных емкостей.
Эффективность¶
Оптимизация ликвидирует дублирование крупнейшего буфера графа на длинных контекстах, сокращая пиковый footprint памяти промежуточных тензоров индексатора на 50%. Это снижает риск OOM при выполнении длинноконтекстного инференса на потребительских GPU с ограниченным объемом VRAM.