Запуск плотных больших языковых моделей на стандартных серверных процессорах x86 долгое время упирался в узкое место архитектуры при обработке больших объемов промптов. Хотя сверхнизкобитные форматы матриц важности (Importance Matrix) сжимают модели до размеров, позволяющих уместить их в стандартную оперативную память, обработка длинных запросов и больших пакетов данных на центральных процессорах традиционно требовала огромных вычислительных затрат. Техническое предложение, направленное в репозиторий проекта с открытым исходным кодом ggml-org/llama.cpp, устраняет эту проблему для инструкций AVX2, кардинально меняя экономику пакетной обработки на базе CPU.
Пулреквест #27402 от контрибьютора llama.cpp под ником bartowski1182 нацелен на устранение потерь производительности при деквантовании во время пакетной обработки. В корпоративных сценариях с крупными пакетами данных — таких как расчет матриц важности (imatrix), пайплайны индексации документов и оценка перплексии — постоянные обращения к таблицам поиска критически ограничивали пропускную способность системы.
Преодоление узкого места деквантования При стандартном выполнении обработка промптов в плотных пакетах требует непрерывных повторных обращений к таблицам весов модели. Как объяснил bartowski1182 в описании пулреквеста, такая архитектура создавала колоссальные избыточные накладные расходы на трансляцию памяти при рутинных операциях:
«Отчасти это связано с тем, что при размере пакета в 512 токенов каждый вес модели декодируется из соответствующей таблицы поиска ровно 512 раз»
Чтобы устранить эту неэффективность, обновление внедряет специализированную GEMM-панель со структурой block_iqp_x8, охватывающую 8 строк весов по 256 колонкам. Вместо многократного декодирования каждого веса для пакета из 512 токенов движок декодирует сразу 8 строк во временный int8-тайл, помещающийся в процессорный кэш, и выполняет целочисленное матричное умножение уже внутри этой рабочей области. Такая реструктуризация обеспечивает до 10-кратного прироста пропускной способности на плотных архитектурах и двукратное ускорение на моделях со смешанной экспертной архитектурой (MoE), при этом отклонение перплексии остается в пределах статистической погрешности (около 0,24%).
Архитектура векторизованного ядра и бенчмарки Реализация опирается на четыре инженерных решения, максимизирующих эффективность инструкций AVX2 и VNNI. Во-первых, чередование восьми строк позволяет одной 32-байтовой загрузкой считывать четыре последовательные колонки сразу для восьми строк, что точно соответствует требованиям инструкции _mm256_dpbusd_epi32 к операндам. Во-вторых, размер подблоков стандартизирован до 16 весов вместо 32 для всех восьми поддерживаемых типов IQ, что позволило использовать единое унифицированное ядро. В-третьих, масштабирующие коэффициенты разделены на плавающую и целочисленную составляющие (dfac и iscales) — это позволяет выполнять промежуточные вычисления масштаба подблоков в целых числах через mullo_epi32 и сводит операции с плавающей запятой к одной на суперблок. Тестирование на эталонном стенде float64 показало, что подход с разделением масштаба на 12–22% точнее стандартного upstream-метода vec_dot. В-четвертых, специальная коррекция смещения компенсирует специфику беззнаково-знаковых операций VNNI.
Устранение избыточного деквантования весов переписывает экономику вычислений для локальной корпоративной инфраструктуры. Пока технические руководители балансируют бюджеты в условиях дефицита GPU-кластеров, оптимизированная векторная обработка делает обычные многоядерные CPU-серверы экономически оправданным решением для фоновых задач высокой пропускной способности и пакетной обработки документации.