Опубликовано
Qwen-Image-2.1 на RTX 4060: текст в кадре, прозрачность и референсы вместо IP-Adapter
Автор: Гусев Николай [портфолио]
Дата обновления не указана в исходнике.
Темы: qwen-image, local-generation
В Бонусе 4 я собирал локальный рисовательный стек на 8 ГБ VRAM: 5 SDXL-чекпойнтов, IP-Adapter для лица персонажа, 18-30 секунд на панель. У стека было три врождённых дырки: текст в кадре SDXL коверкает, прозрачность не умеет вовсе, а для серии с одним лицом нужен обвес из IP-Adapter и CLIP-Vision. 20 сентября Alibaba выложила Qwen-Image-2.1 - и все три дырки в ней закрыты из коробки. Я проверил за один вечер на своей 4060, вот цифры.
Что выпустили
Qwen-Image-2.1 - единая модель генерации и редактирования: 7B параметров в DiT-компоненте (32 single-stream слоя), текстовый энкодер Qwen3-VL 8B, VAE с нативной поддержкой альфа-канала. Заявлено: до 10 референсов на генерацию, локальные правки через нарисованные области, прозрачный фон без постобработки, текст и портреты лучше предшественника.
Важно, что день-в-день модель подхватили все: diffusers (через QwenImage21Pipeline), ComfyUI (свои веса и шаблоны), vLLM-Omni, SGLang, LightX2V. Официальный блог: qwen.ai/blog?id=qwen-image-2.1, веса: huggingface.co/Qwen/Qwen-Image-2.1, ComfyUI-версия: Comfy-Org/Qwen-Image-2.1.
Сколько весит и что качать на 8 ГБ
Полный набор Comfy-Org - 74 ГБ, это для владельцев 24-гигабайтных карт. Мне хватило 14.3 ГБ:
diffusion_models/qwen_image_2.1_int8_convrot.safetensors 7.26 GB DiT
text_encoders/qwen3vl_8b_w4a8.safetensors 6.31 GB энкодер
vae/qwen_image_2.1_vae_bf16.safetensors 0.68 GB VAE
К вечеру первого дня сообщество уже выложило кванты поменьше: int4-версия DiT на 3.67 ГБ (toxicdog/Qwen-Image-2.1-INT4ConvRot-ComfyUI) и GGUF Q2-Q8 от realrebelai - тех же ребят, которые квантовали LLaDA для моего стека. int4 влезает в VRAM целиком и работает быстрее на холодном старте, но у 4-битного кванта нашлась цена, о ней ниже.
Энкодер в VRAM не помещается - и не должен: ComfyUI с --lowvram держит его в RAM, кодирует промпт, выгружает и отдаёт карту DiT. Промпт кодируется заметно дольше, чем у SDXL, но это разовая цена за кадр.
Рабочий граф
Официальный шаблон ComfyUI разворачивается в простой API-граф, я пересобрал его руками для своих скриптов:
{
"1": {"class_type": "UNETLoader", "inputs": {"unet_name": "qwen_image_2.1_int8_convrot.safetensors"}},
"2": {"class_type": "CLIPLoader", "inputs": {"clip_name": "qwen3vl_8b_w4a8.safetensors", "type": "qwen_image"}},
"3": {"class_type": "VAELoader", "inputs": {"vae_name": "qwen_image_2.1_vae_bf16.safetensors"}},
"4": {"class_type": "TextEncodeQwenImage21", "inputs": {"clip": ["2", 0], "prompt": "...", "negative_prompt": ""}},
"6": {"class_type": "KSampler", "inputs": {"model": ["1", 0], "positive": ["4", 0], "negative": ["4", 1],
"latent_image": ["5", 0], "steps": 25, "cfg": 1.0, "sampler_name": "euler", "scheduler": "simple"}},
"7": {"class_type": "VAEDecode", "inputs": {"samples": ["6", 0], "vae": ["3", 0]}}
}
Три неочевидности, на которых я споткнулся. Первая: у CLIPLoader нет типа qwen_image_21, новая модель едет на старом типе qwen_image. Вторая: нода TextEncodeQwenImage21 выдаёт сразу positive, negative и пустой латент - отдельный CLIPTextEncode не нужен. Третья: official путь - cfg 1.0 без негатива, negative_prompt при этом заполняется пустой строкой.
Отправка и поллинг - десять строк поверх HTTP API:
import json, time, urllib.request
opener = urllib.request.build_opener(urllib.request.ProxyHandler({}))
res = json.load(opener.open(urllib.request.Request(
"http://127.0.0.1:8188/prompt",
data=json.dumps({"prompt": wf}).encode(),
headers={"Content-Type": "application/json"})))
pid = res["prompt_id"]
while pid not in json.load(opener.open(f"http://127.0.0.1:8188/history/{pid}")):
time.sleep(10)
Тест 1: текст в кадре
Промпт-детектор для диффузионок: вывеска с заданным текстом. "A neon shop sign that reads "QWEN IMAGE 2.1", rainy night, reflections on wet pavement".
[IMG: https://raw.githubusercontent.com/NikolayGusev-astra/channel-materials/master/2026-09-21-qwen-image-21/images/t2i-neon-int8.png | Neon-вывеска, int8. Текст прочитан верно с первого прогона]
"QWEN IMAGE 2.1" - все буквы на месте, отражения на мокром асфальте, никакого PIL-оверлея поверх. LLaDA в этом же тесте всегда выдавал кашу, у SDXL текст стабильно ломается без лор и вбивания текста отдельной нодой.
Тот же промпт на int4 выдал "OWEN IMAGE 2.1" - Q съела 4-битная квантизация. Скорость при этом одинаковая, около 2 минут на кадр 1024×1024. Вывод простой: если в кадре есть текст, квантование ниже 8 бит не допускаем, выигрыша по скорости оно не даёт.
Тест 2: прозрачный фон
Нативная RGBA-генерация - то, чего в локальном стеке не было совсем. Обёртка промпта официальная:
This is an RGBA format image with transparency. A cute cartoon dragon sticker,
waving, kawaii style. The image has an alpha channel and a transparent background.
[IMG: https://raw.githubusercontent.com/NikolayGusev-astra/channel-materials/master/2026-09-21-qwen-image-21/images/rgba-dragon-checker.png | Стикер дракона на шахматном фоне - прозрачность настоящая]
Проверял не глазами, а пикселями: PNG в режиме RGBA, 66.1% полностью прозрачных пикселей, 0.8% полупрозрачных краёв, остальное - дракон. Гладкая обводка, готовый стикер для стикерпака. Для маскотов, стикеров и иллюстраций с вырезанным фоном это экономит целый этап вырезания в редакторе.
Тест 3: редактирование по референсу
Синтетическая сцена (небо, дом, гора, солнце) с инструкцией "Change the background to a sunset beach". За 5.5 минут модель перестроила фон, сохранив объекты: дом и гора переехали в пляжную сцену, вписались в новое освещение.
[IMG: https://raw.githubusercontent.com/NikolayGusev-astra/channel-materials/master/2026-09-21-qwen-image-21/images/edit-before-after.png | Слева исходник, справа результат правки одной строкой промпта]
Для сравнения: LLaDA editing на том же железе - 33 минуты на кадр. Не в шесть раз быстрее, а именно что другое время жизни эксперимента: пока LLaDA дорисовывает одну правку, Qwen успевает пять итераций.
Тест 4: персонаж с двух референсов без IP-Adapter
Главная заявленная фича: референсы внутри модели. Промпт-ядро маскота канала (девушка-бармен с фиолетовыми пучками) я дал двумя картинками - канонический портрет и сцену за стойкой - и попросил новую сцену: крыша, ночной неоновый город, коктейль. В стеке Бонуса 4 для этого требовались IP-Adapter, CLIP-Vision и танцы с весами.
[IMG: https://raw.githubusercontent.com/NikolayGusev-astra/channel-materials/master/2026-09-21-qwen-image-21/images/jill-rooftop.png | Два референса и новая сцена: лицо, причёска и жилет держатся]
Одно лицо, одна причёска, жилет и рубашка на месте - и это без единой дополнительной модели поверх базовой. Референсы подаются прямо в ноду энкодера: images.image_1, images.image_2, до 16 входов. Внутри модель кодирует референс VAE и подмешивает латент в контекст, тот же механизм работает и на групповых фото из шести портретов, и на трёх ракурсах одного персонажа.
Цена вопроса: было / стало
Замер на RTX 4060 8GB, всё локально, 0 рублей за кадр:
Бонус 4 (SDXL+IP-Adapter) Qwen-Image-2.1
Панель 1024x1024 18-30 сек ~120 сек
Текст в кадре ломается верно (int8)
Прозрачный фон нет нативный
Правка по инструкции нет (только inpaint) 5.5 мин
Лицо персонажа в новой сцене IP-Adapter + CLIP-Vision референс в промпт
Доп. модели для персонажа +4.0 GB +0 GB
Диск под модель 6.5-7.1 GB на стиль 14.3 GB весь стек
SDXL остаётся быстрее в режиме "намолотить 50 однотипных панелей без текста". Qwen-Image-2.1 забирает всё, где SDXL ломался: текст, прозрачность, правки, персонаж с референса. Для моего цикла (обложки статей, стикеры маскота, иллюстрации с подписями) перекрытие почти полное, и стек упростился - выкинулся целый слой обвеса.
Ловушки
Энкодер на 6.3 ГБ при забитой RAM уходит в своп, и кодирование промпта растягивается на минуты. Перед батчем проверяю свободную память - правило из Бонуса 4, оно никуда не делось.
Куда дальше
Не проверено и честно отложено: группы из 6+ референсов, трёхракурсные развороты персонажа, локальные правки размазанной кистью (в UI это кружочки поверх картинки), 2K-генерация нативно, PE-редрайтеры на Qwen3.5-VL, которые разворачивают короткий промпт в развёрнутый. Скорость с двумя референсами просела с 2 до 9 минут на кадр - где у батч-серий с референсами проходит предел, покажет следующий замер.
Материалы: workflows, скрипты загрузки и все картинки - в репозитории канала, папка 2026-09-21-qwen-image-21. Предыдущая часть про SDXL-стек: Бонус 4.
