Я хотел локального помощника для кода, который работает без облака: дописать функцию на PHP, поправить несколько файлов, разобрать большой кусок чужого кода, вытащить данные из текста в JSON. Железо у меня обычное домашнее: Ryzen 5 5600, RTX 3060 на 12 ГБ, 32 ГБ DDR4, Kubuntu 24.04. С 7 по 9 ноября 2026 года я прогнал на нём несколько моделей и здесь рассказываю, что получилось.
Это не рейтинг рынка и не совет «какую модель брать всем». Я сравнивал конкретные сборки GGUF (формат файлов для локального запуска) на одной машине и на своих задачах. Чужие цифры с карточек Hugging Face и с других видеокарт сюда не попали.
Как я проверял
Проверка везде одна и та же. Модель получает фиксированный запрос через OpenAI-совместимый API, даёт один ответ, и скрипт автоматически его проверяет. Это не агент, который сам гоняет инструменты по кругу, так что про агентную работу эти замеры почти ничего не говорят. Агентный цикл (Pi) я пробовал только на Qwen3.5-9B, и то частично, в общую таблицу его не смешивал.
Первый набор — 15 задач на PHP из HumanEval-PHP: дописать функцию так, чтобы прошли скрытые тесты в Docker. На каждую задачу три попытки с разными сидами, всего 45. Температура 0,2, на ответ вместе с рассуждениями даю до 8192 токенов, отдельного бюджета на рассуждения нет. Ответ может оказаться правильным, неверным или оборваться по лимиту. Отдельно я считаю ошибки формата: код завёрнут в Markdown или повторена сигнатура функции, и PHP-парсер в Docker такой ответ просто не принимает. В самом раннем прогоне, 7 ноября (Q3, Flash без MTP, Qwen3.5-4B), формат отдельно не выделялся, такие ответы шли в общий неуспех.
Второй набор я называю Realworld: 14 прикладных задач по три повтора, всего 42. В нём:
- p1–p3 — написать PHP-функцию (разбор CSV-строки, SemVer, деление денег);
- m1–m3 — правка сразу нескольких PHP-файлов;
- l1 и l2 — прочитать большой PHP-код и ответить строгим JSON. По токенайзеру Qwen это 38 386 и 102 831 токен, у Gemma те же тексты дают 39 724 и 106 431, у gpt-oss — 33 070 и 88 433;
- j1 и j2 — вытащить строгий JSON из текста (счёт и лог);
- t1–t4 — вызовы инструментов.
Температура 0, на рассуждения 6144 токена, общий лимит 8192. Тут есть нюансы. gpt-oss-20b бюджет рассуждений не соблюдает, её ограничивает только общий лимит 8192. У движка Strata (на нём шла Flash) бюджет закрывается своим способом, так что сравнивать с llama.cpp можно с оговоркой.
Пара честных оговорок. При температуре 0 модель обычно отвечает трижды одно и то же, так что повторы почти не независимы. Задачи p1 и m2 я заодно использовал для подбора бюджета рассуждений, то есть это не совсем чистая проверка. PHP-задачи — это алгоритмика, и модели могли видеть их при обучении. И в целом попыток десятки, а не сотни: разница в пару баллов — это сигнал, а не приговор.
Немного терминов
Квант — это степень сжатия весов модели. Кванты unsloth с приставкой UD смешанные: разные части модели сжаты по-разному. Например, UD-Q4_K_XL у 35-миллиардной Qwen3.6 весит 22,85 ГБ, это в среднем около 5,2 бита на вес вместо исходных 16. Контекст — сколько текста модель держит в голове за один запрос. KV-кэш — память под уже прочитанный контекст: чем длиннее диалог и чем точнее хранится кэш, тем больше уходит видеопамяти.
Многие модели здесь устроены как MoE (Mixture of Experts, «смесь экспертов»): параметров у модели много, но на каждый токен работает только часть из них. Поэтому 35-миллиардная модель вообще может бегать на 12-гиговой карте. MTP (Multi-Token Prediction) — режим «черновика»: модель предлагает несколько следующих токенов наперёд и потом проверяет, угадала ли.
Скорость я считаю двумя цифрами. Prefill — как быстро модель читает запрос. Decode — как быстро пишет ответ. Для работы важнее всего второе, причём на уже заполненном окне: на коротком запросе любая модель выглядит бодро.
Что получилось
В столбце PHP — правильно / неверно / оборвано лимитом. В Realworld — правильно / неверно / оборвано, остальное подписано отдельно.
| Модель / квант | Движок и условия | PHP (из 45) | Realworld (из 42) | Генерация, ток/с | Контекст | Мой вывод |
|---|---|---|---|---|---|---|
| Qwen3.6-35B-A3B UD-Q4_K_XL (unsloth/…-MTP-GGUF) | llama.cpp-moe, коммит 906247a58f0d28cd8537999f1feceb441029392d; 48 слотов кэша экспертов; KV q8_0; MTP до 2 токенов; окно 131072 |
44 / 1 / 0 | 36 / 6 / 0 | 44,5–48 на 8K; 35,6–36,6 на ~100K заполненных | окно 131072; самый длинный пройденный вход — 102 831 | Сильный PHP и нормальная скорость на длинном контексте. Её я и оставил рабочей |
| Qwen3.6 UD-Q3_K_XL (тот же репозиторий) | тот же форк, KV q8_0, MTP 2, окно 131072. PHP — прогон 7.11 на 88 слотах, Realworld — 8.11 на 72 слотах | 43 / 2 / 0 (88 слотов) | 36 / 3 / 3 (72 слота) | 88 слотов: 49,2 на 8K, 37,5 на 102 379; 72 слота: 33–36 на l2 | тот же вход 102 831 | По качеству рядом с Q4. Удалил 8 ноября, когда кончилось место на диске |
| Gemma 4 26B-A4B UD-IQ4_XS + MTP-черновик (unsloth/…) | llama.cpp-moe, 22 слоя экспертов на CPU, KV q8_0, окно 131072 | 41 / 1 / 3 | 27 / 6 / 3 и ещё 6 ошибок формата | 29,8 на ~60K; 23 на ~100K; 19,9 на ~126K | заполнял до 125 978 при окне 131072 | PHP хороший, но у полного окна скорость уже ниже 20 |
| gpt-oss-20b MXFP4 | llama.cpp-moe, 12 слоёв экспертов на CPU, KV q8_0, окно 131072, без EAGLE3 | 25 / 1 / 0 и ещё 19 ошибок формата | 27 / 15 / 0 | 36,2–40,5 на 8K; 17,8–18,1 на ~100K; 16,1–16,4 на ~126K | заполнял до 125 979 | Слабый PHP и медленно на длинном окне. Не беру |
| ISTA Flash-Next Coder IQ1_M (ISTA-DASLab/…-Coder-GGUF), без MTP | Strata 0.1.57; окно 106496; KV q4_0; простые черновики --spec 2 |
26 / 8 / 11 | не запускал | ~22,7 на 8K; 24,0 на 102 399 | заполнял до 102 399 | Это не официальная Qwen3.8-Flash-Next, а Coder-сборка, где оставлено 256 экспертов из 512 |
| тот же ISTA Coder IQ1_M, с MTP | Strata 0.1.57; окно 131072; KV int8; MTP --spec 4 |
18 / 20 / 7 | частично: 6 правильно / 4 падения движка / 32 не запускались | 36,6–37,2 на 8K; 32,7 на 102 399; медиана в PHP 40,7 | сервер падал на HTTP-запросе l1 (38 424 токена) | Условия отличались от прогона без MTP, так что вывод «MTP ухудшил PHP» отсюда не следует |
| Qwen3.5-9B Q8_0 (unsloth/…-MTP-GGUF) | llama.cpp-moe, KV q8_0, MTP 2; качество на окне 65536 | 4 / 0 / 0 и ещё 41 ошибка формата | 27 / 12 / 0; l2 не влезла в окно (3 попытки) | 53,5–55 на 8K (окно 32K); 38,1 на 59 979 (окно 65K) | окно 65536, заполнял до 59 979 | Быстрая, но на PHP заворачивает код в Markdown. Для кода не годится |
| Qwen3.5-4B Q8_0 (bartowski), прогон 7.11 | llama.cpp-moe, целиком на GPU, KV q8_0, MTP 2, окно 128K | 13 / 2 / 21 и ещё 9 отказов парсера | не запускал | 79,2 на 8K; 34,0 на 102 379 | заполнял до 102 379 | Очень быстрая, но почти половину ответов обрывает лимит на рассуждениях |
| Qwen3.8-27B UD-IQ3_XXS (unsloth), ~10,9 ГБ | llama.cpp-moe; лучший вариант — целиком на GPU, KV q4_0, ub64, окно 16384; черновик MTP не влез ни в одной из опробованных схем | не запускал | не запускал | лучшее 18,94 на 8K (окно 16K); на окнах 65–131K от 1,2 до 6,5 | прилично работает только на 16K, а мой минимум — 60K | Отсеяна по скорости и контексту, качество не оценивалось |
| ISTA Qwen3.8-27B GSQ-RCO IQ2_XS (ISTA-DASLab/…-GSQ-RCO-GGUF), 8,42 ГБ, прогон 9.11 | llama.cpp-moe; окно 65536; KV q4_0; часть слоёв на CPU; черновик MTP не влез | не запускал | не запускал | 54 слоя на GPU: 8,70 на 8K, 6,24 на 32K, 4,83 на 60K; 58 слоёв: 7,64 и 6,65 | целиком на GPU окна 65–131K не запустились | Отдельная сборка ISTA, не то же, что строкой выше. Отсеяна по скорости на окне от 64K, качество не оценивалось |
| та же ISTA, другой файл IQ2_XS-mtp (~8,77 ГБ), прогон 7.11 | llama.cpp-moe; целиком на GPU; окно 32K; KV q4_0; MTP 2. Рабочий стол тогда занимал меньше видеопамяти | не запускал | — | 30,3 на 8K; 27,1 на ~30K | окно 32K; запрос на 102K не завершился | На коротком окне быстрая, но длинный контекст ей не по силам |
Скорости полной Flash-Next, которые гуляют по чужим стендам с другими видеокартами, в таблицу не попали: сам я их не получал.
Про MTP и скорость. По скорости я сравнивал с MTP и без почти везде, и черновик стабильно ускорял генерацию. У Q3 было 49 против 39 токенов в секунду на 8K и 44 против 34 на 32K. У Qwen3.5-9B — 53,5–55 против 32,6, у Gemma — 47,1 против 31,9, у Flash — 36,6 против 18,95 на 8K и 32,7 против 17,6 на 102K. А вот честного сравнения по качеству «тот же сервер с MTP и без» у меня нет.
Зачем мне длинный контекст и какая скорость нужна
Для себя я завёл простые мерки. Генерация на заполненном окне ниже 20 токенов в секунду — это уже мучение, 20–39 терпимо, около 40 — то, к чему стремлюсь, а 60–70 — мечта. Окно меньше 60K мне не подходит, 64–128K — плохо, 128–256K — хорошо, от 256K — отлично. По PHP ниже 30 из 45 — слабо, 30–39 — плохо, 40–44 — хорошо, 45 — отлично.
Длинное окно нужно, чтобы скормить модели большой кусок кода, лог или дамп целиком, без нарезки на куски. Но окно на 131072 токена — это только потолок настройки сервера. Самый длинный вход, который у меня реально прошёл, — 102 831 токен. Если ваша задача длиннее, проверяйте на ней самой.
На ~100K заполненного контекста Qwen3.6 UD-Q4_K_XL пишет ответ со скоростью 35,6–36,6 токена в секунду, и в диалоге это нормально. Gemma около 126K опускается до 19,9: ответ идёт, но ждать заметно дольше. Модели, которые на длинном окне дают меньше 20 токенов в секунду, в каждодневной правке кода быстро начинают раздражать.
Что выбрать
Если у вас RTX 3060 на 12 ГБ и 32 ГБ оперативки, а нужен повседневный помощник по PHP, я бы брал Qwen3.6-35B-A3B UD-Q4_K_XL на llama.cpp-moe с тем же коммитом. У меня она набрала 44 из 45 по PHP и 36 из 42 по Realworld, а при ~100K заполненного контекста выдаёт 35,6–36,6 токена в секунду. Это лучший баланс качества и скорости, который я нашёл на этой машине, а не «лучшая модель вообще». Команду запуска и смысл каждого флага я разобрал в отдельной заметке.
Ошибки у Q4 и Q3 почти одни и те же: задачу p3 (деление денег) обе провалили во всех трёх повторах. Разница только в m2: Q3 трижды не уложилась в лимит, а Q4 трижды ответила неверно.
Gemma 4 26B-A4B UD-IQ4_XS тоже неплохо пишет PHP (41 из 45), но на ~126K скорость падает до 19,9 токена в секунду. А в задачах l1 и l2 она каждый раз заворачивала JSON в Markdown, и проверка такие ответы не принимала. Без этой обёртки ответы проходили.
Если ищете «Flash-Next», не путайте её с ISTA Coder IQ1_M: у той 26 из 45 без MTP, и это другая модель. Полную Flash-Next под 32 ГБ оперативки я штатным способом не нашёл: в каталоге Strata полные кванты требуют от 48 ГБ (Q2_0) до 64 ГБ и больше. В чужих логах «Flash» часто означает именно Coder-сборку ISTA, так что на это стоит смотреть внимательно.
Для проверок кода на этом железе я бы не брал gpt-oss-20b (мало правильных ответов по PHP, много ошибок формата, медленно на длинном окне) и Qwen3.5-9B Q8_0 (ломает формат). Qwen3.5-4B очень быстрая, но слишком часто не успевает дорассуждать до ответа.
Обе 27-миллиардные Qwen3.8 я отсеял ещё до проверки качества. unsloth UD-IQ3_XXS даже в лучшем случае, на окне 16K, выдаёт около 18,9 токена в секунду, это ниже моего порога в 20. К тому же 16K меньше моего минимума в 60K, а на окнах 65–131K скорость падает до 1,2–6,5. Сборка ISTA IQ2_XS полегче, 8,42 ГБ. С окном 65K она целиком в видеопамять не влезает, часть слоёв остаётся на процессоре, и генерация падает до 4,8–8,7 токена в секунду. Её вариант со встроенным MTP 7 ноября целиком на GPU с окном 32K давал 27–39 токенов в секунду, но условия там были другие: короткое окно и рабочий стол занимал меньше видеопамяти. Насколько хорошо обе 27B пишут код, я не знаю: PHP и Realworld на них не запускал.
На 10 ноября на диске у меня остались только Qwen3.6 UD-Q4_K_XL и Gemma 4. Остальные модели я удалил: одни освобождали место, другие не прошли отбор.