Загрузка...

Локальные LLM на RTX 3060: какие модели я сравнил для работы с кодом и что выбрал

Локальные LLM на RTX 3060: какие модели я сравнил для работы с кодом и что выбрал

Я хотел локального помощника для кода, который работает без облака: дописать функцию на 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. Остальные модели я удалил: одни освобождали место, другие не прошли отбор.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *