В подвале у автора стоит сервер HP StoreVirtual 2013 года на двух Xeon E5-2690 v2 (Ivy Bridge) без GPU и с DDR3. Этот ящик за $300 неожиданно запустил Gemma 4 — модель Google на 26 млрд параметров с архитектурой mixture-of-experts. Скорость — около 5 токенов в секунду, то есть скорость чтения.
Всё началось с поста на Hacker News под названием «A 10 year old Xeon is all you need». Там автор запускал Gemma 4 на процессоре Broadwell 2016 года через форк llama.cpp — ik_llama.cpp с кучей оптимизаций: спекулятивный декодинг, CPU-aware роутинг MoE, flash attention на CPU. Автор попробовал повторить — сборка упала. Его процессоры оказались старше (Ivy Bridge против Broadwell), и оптимизированные ядра в том форке требовали AVX2 и FMA3, которых на этом чипе нет.
Тогда автор передал ошибку Claude. Тот проанализировал C++ код, определил, что проблема именно в инструкциях AVX2, и написал патч, который заставляет хот-паты корректно падать на скалярные вычисления на pre-AVX2 чипах. Ключевая находка — не просто «сломалось», а тихий баг: графовый билдер ik_llama.cpp безусловно создавал операции MOE_FUSED_UP_GATE и FUSED_UP_GATE, но диспетчер на сборке без GGML_USE_IQK_MULMAT не имел для них кейсов. В результате 240 тензоров на каждый проход оставались неинициализированными. Модель выдавала детерминированную «многоязычную абракадабру» — токены равномерно по всему словарю из 262К токенов. Claude вскрыл баг, инструментировав логиты до сэмплирования: средний логит оказался +16 (должен быть около нуля), а 80% словаря имели положительные значения — явный признак uninitialized memory.
Фикс состоит из трёх коммитов. Во-первых, правки компиляции: скалярные ветки quantize_row действительно ссылались на AVX2-хелперы, их переписали. Во-вторых, сам рантайм-баг: вместо переписывания диспетчера изменили графовый билдер — он теперь разбивает свёрнутый тензор на два отдельных mul_mat_id и склеивает их через fused_mul_unary, используя уже существующие скалярные реализации. В-третьих, CI-стабы для сборки на не-AVX2 железе. Всё за #if !GGML_USE_IQK_MULMAT, так что AVX2-билды не меняются.
Модель Gemma 4 26B-A4B в Q8_0 выдаёт теперь ~5.2 токен/с на декодинге и 16 токен/с на префиксе. Предупреждение: флаг --run-time-repack перепаковывает веса в AVX2-only формат Q8_0_R8 и ломает вывод на AVX1 — его просто убрали.
Автор подчёркивает: настоящий навык не в подписке на API, а в умении залезть под капот, прочитать чужой код и заставить тринадцатилетний CPU делать то, для чего он не предназначался. Весь патч висит в PR #2138 форка ik_llama.cpp.