3 сентября 2026 г.
Qwen научили рисовать акварель кодом: полный прогон занял 34 часа на одной H200
Серхио Паньего повторил закрытый проект в открытую: код, 178 эталонных картин и три LoRA-адаптера лежат на Hugging Face.
Баг в OpenEnv стоил Серхио Паньего двух недоделанных прогонов: закрытый websocket кэшировался и блокировал следующие вызовы.
Задача звучит несерьёзно: модель учат рисовать акварель кодом. Под ней полноценный GRPO-прогон на живой задаче, который повторяется по шагам.
Что обучали. Qwen3.5-35B-A3B на 36B параметров, MoE, писала JS-скетчи на библиотеке p5.brush. Из 47 методов библиотеки модели разрешили 10, среди них fillBleed и fillTexture.
Награду собрали из четырёх частей. Больше половины веса, 0,6, отдали попарному VLM-судье: он сравнивал картинку с эталонным пулом. Ещё 0,3 весила эстетическая модель HPSv3 на 7B, остальное — проверка, что код компилируется и хоть что-то рисует.
Прогонов было три, и все три подняли среднюю награду. Лучший вырос с 0,57 до 0,82 за 110 шагов, прогон с упором на судью дал самую большую дельту: с 0,45 до 0,72.
Оригинал этой идеи закрыт. Сурья Нарредди сделал её первым, но артефакты оставил при себе. Теперь открыты и пул из 178 картин (их нарисовали четыре модели по одному фото гибискуса), и роллауты трёх прогонов на 470, 861 и 872 картины, и сами адаптеры — коллекция HuggingEnvs/paint-with-code.
Как повторить у себя
Два Space и одна команда. Сначала разворачиваются скорер HPSv3 на a100-large и среда на cpu-upgrade, каждый одной строкой `python3 tools/deploy.py`. Потом запускается обучение: `hf jobs uv run train/watercolour_grpo.py --flavor h200 --timeout 48h`. Нужна ещё квота Inference Providers, судьёй работает Qwen3-VL-30B-A3B-Instruct.
Цена времени: 18 часов на 60 шагов и около 34 часов на 110, то есть 15–18 минут на шаг. Space со скорером висит включённым весь прогон.
Дефолты TRL пришлось менять в четырёх местах: learning rate с 2e-5 на 5e-5, планировщик с linear на constant_with_warmup, scale_rewards с group на none, target_modules с ручного списка на all-linear. Без последнего LoRA не достаёт до всех линейных слоёв MoE.
Где узко
Считает не модель, а браузер. Один скетч рисуется 69–96 секунд при дедлайне 90: headless Chromium гонит WebGL программно, без GPU. На рендер уходит 70–80% времени шага.
Сбой награды теперь не обнуляет роллаут, а выбрасывает его: раньше возвращался 0.0, теперь None. Таких сбоев около 1,5%, в худшем прогоне 5,2%.
Фикс websocket ушёл в OpenEnv как PR #1103 — пока его не вмержили, те же грабли ждут следующего.
Первоисточник