Перейти к содержанию
Публикация AiManual

Как создать ретро-игру за минуты: практический разбор Qwen 3.8 27B на двух RTX 3090

Практический разбор генерации ретро-игры RetroCraft с помощью Qwen 3.8 27B на двух RTX 3090. Точные метрики скорости, конфигурация инференса и влияние reasoning

Коротко

Что будет в материале

  1. 01

    Введение: генерация игры за минуты - реальность или маркетинг?

  2. 02

    Обзор модели Qwen 3.8 27B и её особенности

  3. 03

    Тестовая конфигурация: оборудование и сервер инференса

  4. 04

    Процесс генерации RetroCraft: пошаговый разбор

Введение: генерация игры за минуты - реальность или маркетинг?

Локальные LLM обещают быструю генерацию рабочих приложений без облачных API и подписок. Звучит привлекательно, но сколько из этих обещаний подтверждается на реальном железе? Мы проверили это на практике: взяли модель Qwen 3.8 27B в кванте Q8_K_XL, запустили на двух RTX 3090 и поставили задачу - создать одностраничную HTML/js/css-игру RetroCraft в стиле 80-х и GeoCities. Результат: рабочий прототип получен за несколько итераций, а полный цикл генерации занял минуты, а не часы.

В этом разборе - точные метрики производительности, конфигурация сервера инференса, детальный лог llama-swap и разбор того, как сохранение reasoning tokens влияет на качество кода. Никаких общих слов: только цифры, параметры и практические выводы.

Главный ответ на вопрос из заголовка: да, генерация игры за минуты реальна, если правильно настроить инференс и понимать ограничения модели. Ниже - доказательства.

Обзор модели Qwen 3.8 27B и её особенности

Qwen 3.8 27B - модель среднего размера, которая балансирует между качеством генерации кода и требованиями к VRAM. На двух RTX 3090 с суммарными 48 ГБ видеопамяти она помещается полностью, без оффлоада на CPU. Это критично для скорости: когда модель не выгружается в системную память, генерация идёт стабильно и предсказуемо.

Модель поддерживает рассуждение (reasoning) - перед финальным ответом она генерирует внутренние токены размышления. Это увеличивает задержку, но улучшает связность кода и способность исправлять ошибки. В нашем тесте именно этот механизм позволил модели довести игру до рабочего состояния за три итерации.

Квантование Q8_K_XL: что это и зачем

Квантование снижает точность весов модели, чтобы уменьшить размер и ускорить инференс. Q8_K_XL - это 8-битный квант с расширенным набором параметров, который сохраняет качество, близкое к оригинальной модели, но занимает меньше VRAM. Для сравнения: Q4_K_M уменьшает размер примерно вдвое относительно Q8, но заметно теряет в точности генерации кода. Q6_K - промежуточный вариант, который часто выбирают для 24 ГБ карт.

На двух RTX 3090 выбор Q8_K_XL оправдан: модель занимает около 28-30 ГБ VRAM, оставляя достаточно места для кэша KV и батчей. Это позволяет держать контекст до 32K токенов без деградации скорости. Если бы мы взяли Q4, выиграли бы в скорости, но потеряли бы в качестве исправления ошибок - а для генерации игры это критично.

Тестовая конфигурация: оборудование и сервер инференса

Стенд: две NVIDIA RTX 3090 по 24 ГБ VRAM, CPU AMD Ryzen 9 5950X, 128 ГБ DDR4 RAM. Программная часть - llama-swap с поддержкой параллельных слотов инференса. Модель загружена в режиме tensor split: обе карты работают синхронно, распределяя слои модели.

Ключевые параметры запуска:

  • Квант: Q8_K_XL
  • Контекст: 32768 токенов
  • Батч: 512
  • Micro-batch: 128
  • Кэш KV: q8_0
  • MTP: включён
  • preserve_thinking: включён

Эта конфигурация дала стабильную работу без падений скорости на протяжении всей сессии генерации RetroCraft. Лог llama-swap показал, что пиковая скорость генерации достигала 48 токенов/с, а обработка промпта - 890 токенов/с. При заполнении контекста до 24K токенов скорость генерации снижалась до 31 токена/с, что ожидаемо для двух карт без NVLink.

Параметры выборки и их влияние на генерацию

Для генерации кода мы использовали следующие параметры выборки:

  • temperature: 0.7
  • top_p: 0.9
  • top_k: 40
  • repetition_penalty: 1.1

Temperature 0.7 даёт достаточно вариативности для креативных элементов игры (цвета, стили GeoCities), но не уводит модель в хаос. top_p 0.9 и top_k 40 ограничивают выбор токенов, снижая вероятность синтаксических ошибок в JavaScript. repetition_penalty 1.1 предотвращает зацикливание на одних и тех же конструкциях кода.

Если поднять temperature до 1.0, модель начинает генерировать более смелые, но менее стабильные решения - в нашем тесте это привело к двум дополнительным итерациям отладки. Для задач, где важна точность, рекомендуем держать temperature в диапазоне 0.6-0.8.

MTP и preserve_thinking: что это и зачем включать

MTP (Multi-Token Prediction) - механизм, при котором модель предсказывает несколько токенов за один проход. Это ускоряет генерацию на 15-20% без потери качества. В логе llama-swap видно, что включение MTP подняло среднюю скорость с 38 до 44 токенов/с.

preserve_thinking - параметр, который сохраняет reasoning tokens в контексте между итерациями. Без него модель «забывает» свои размышления при следующем запросе, и качество исправления ошибок падает. В сессии RetroCraft preserve_thinking позволил модели во второй итерации вспомнить, какую структуру HTML она запланировала в первой, и не переписывать её заново. Это сэкономило примерно 40% времени на отладку.

Процесс генерации RetroCraft: пошаговый разбор

Начальный промпт был простым: «Создай одностраничную HTML/js/css игру в стиле 80-х и GeoCities. Название: RetroCraft. Игра должна быть играбельной, с управлением с клавиатуры, счётом и ретро-эстетикой». Никаких дополнительных уточнений - мы хотели проверить, насколько модель справится с задачей с первого раза.

Итерация 1: генерация базовой структуры

Модель сгенерировала HTML-каркас: контейнер для канваса, блок счёта, заголовок с мигающим текстом. JavaScript содержал базовый игровой цикл и обработчик клавиш. Ошибки: отсутствовала проверка на столкновения, а функция отрисовки не была вызвана в цикле. Модель сама отметила в reasoning tokens, что «нужно добавить collision detection» - это показывало, что она понимает неполноту своего ответа.

Итерация 2: добавление стилей и логики

Мы отправили уточняющий промпт: «Добавь CSS в духе GeoCities: яркие цвета, мигающие элементы, рамки. Исправь игровую логику: столкновения, счёт, условие поражения». Модель сгенерировала CSS с анимированными градиентами и неоновыми тенями, а также дополнила JavaScript функциями checkCollision и updateScore. Благодаря preserve_thinking она не переписала HTML заново, а только внесла точечные изменения.

Итерация 3: отладка и финальные штрихи

В третьем запросе мы указали на конкретную ошибку: «При нажатии стрелки вверх объект не двигается». Модель проанализировала код в reasoning tokens, нашла проблему - обработчик события был привязан к window, а не к document - и исправила её. Также добавила звуковой эффект через Web Audio API, что стало приятным бонусом. Итог: играбельный прототип с управлением, счётом и ретро-стилем за три итерации.

Общее время генерации: 2 минуты 47 секунд, включая обработку промптов и генерацию ответов. Без preserve_thinking, по нашей оценке, потребовалось бы 4-5 итераций и примерно 4 минуты.

Метрики производительности: скорость генерации и обработки промпта

Данные из лога llama-swap по трём итерациям:

ИтерацияСкорость генерации (ток/с)Скорость обработки промпта (ток/с)Объём кэша (токенов)Время выполнения (с)
144890124038
241870418052
336850912077

Скорость генерации падает с ростом контекста: с 44 до 36 токенов/с. Это связано с увеличением объёма кэша KV, который приходится обрабатывать на каждом шаге. Обработка промпта остаётся стабильной - 850-890 токенов/с, так как батч 512 позволяет эффективно использовать обе карты.

Анализ лога llama-swap: неоднородность производительности

Лог показывает, что скорость не была постоянной даже внутри одной итерации. На коротких ответах (до 200 токенов) скорость достигала 48 токенов/с, но при генерации длинных блоков JavaScript падала до 33 токенов/с. Причины: переключение контекста между слотами, термальный троттлинг на второй карте (температура поднималась до 82°C) и фрагментация кэша.

Для стабилизации мы рекомендуем: следить за температурами, использовать кастомную кривую вентиляторов, и не держать в контексте лишние токены. В нашем случае очистка кэша после второй итерации подняла бы скорость третьей на 5-7%, но мы сознательно не делали этого, чтобы проверить поведение модели при накоплении контекста.

Сравнение с другими конфигурациями

На одной RTX 3090 Qwen 3.8 27B в кванте Q8_K_XL не помещается - требуется оффлоад на CPU, что снижает скорость до 8-12 токенов/с. Две карты дают прирост в 3-4 раза. По сравнению с Qwen 3.6 27B на RTX 5090, где скорость достигала 94 токенов/с на коротких запросах, наша конфигурация медленнее, но RTX 5090 имеет 32 ГБ VRAM и более быструю память. Для бюджета двух RTX 3090 результат достойный.

Если вам интересен разбор оптимизации llama.cpp для Qwen на RTX 5090, у нас есть отдельная статья с цифрами и готовой командой запуска.

Влияние reasoning tokens на качество генерации

Reasoning tokens - это токены, которые модель генерирует «про себя» перед финальным ответом. Они содержат план, анализ проблемы, проверку гипотез. preserve_thinking сохраняет эти токены в контексте, чтобы модель могла использовать их в следующих итерациях.

В нашем тесте с RetroCraft разница была очевидна. С включённым preserve_thinking модель во второй итерации помнила, что планировала использовать canvas для отрисовки, и не пыталась переключиться на DOM-элементы. С выключенным параметром она начинала каждую итерацию «с чистого листа», что приводило к дублированию кода и новым ошибкам.

Пример: как рассуждения помогли исправить ошибку

В третьей итерации модель получила запрос об ошибке с управлением. В reasoning tokens она написала: «Обработчик keydown привязан к window, но canvas находится внутри div с tabindex=-1. Нужно привязать к document или добавить tabindex к canvas». Затем в финальном ответе она исправила код именно так, как запланировала. Без reasoning tokens модель могла бы просто перегенерировать весь блок JavaScript, внеся новые ошибки.

Это показывает, что для задач, требующих многошагового исправления кода, preserve_thinking - обязательный параметр. Он увеличивает объём контекста на 20-30%, но экономит итерации и время.

Практические выводы и рекомендации

Qwen 3.8 27B на двух RTX 3090 - рабочая связка для генерации прототипов одностраничных приложений. Скорость 36-44 токенов/с комфортна для интерактивной работы, а качество кода достаточно высокое, чтобы получить играбельный результат за три итерации.

Когда стоит использовать Qwen 3.8 27B

Модель подходит для: генерации HTML/js/css прототипов, создания одностраничных игр и демо, помощи в написании и отладке кода, быстрой проверки идей. Для продакшн-бэкенда или сложных многофайловых проектов её возможностей может не хватить - там лучше смотреть в сторону более крупных моделей или специализированных кодогенераторов.

Если вы работаете с ограниченной VRAM, обратите внимание на разбор пределов малых моделей до 48 ГБ VRAM - там мы анализируем, когда параметры упираются в память, а когда в датасет.

Оптимизация конфигурации для максимальной скорости

Четыре рекомендации по настройке:

  1. Включайте MTP - это даёт 15-20% прироста скорости без потери качества.
  2. Включайте preserve_thinking для задач с итеративной отладкой кода.
  3. Держите temperature в диапазоне 0.6-0.8 для генерации кода.
  4. Используйте llama-swap для мониторинга скорости и объёма кэша в реальном времени.

Для сборки локальной AI-лаборатории на других конфигурациях железа у нас есть гайд по подбору моделей на RTX 5070 Ti с 64 ГБ RAM.

Заключение

Эксперимент с RetroCraft подтвердил: Qwen 3.8 27B на двух RTX 3090 генерирует рабочую ретро-игру за 2 минуты 47 секунд. Ключевые факторы успеха - квант Q8_K_XL, включённые MTP и preserve_thinking, а также правильно подобранные параметры выборки. Скорость генерации 36-44 токенов/с достаточна для комфортной итеративной работы.

Если вы хотите воспроизвести этот кейс, начните с конфигурации из раздела выше и не отключайте reasoning tokens. Результат вас удивит. Попробуйте сами и поделитесь опытом - нам интересно, какие игры получились у вас.

Подписаться на канал