Как стать автором
Поиск
Написать публикацию
Обновить
154.76
Raft
AI решения для бизнеса

Wan 2.1: генерация видео по тексту на практике

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров581

Всем привет! Меня зовут Артем, я Data Scientist в компании Raft Digital Solutions.
В этой статье расскажу, как я решил поэкспериментировать с библиотекой Wan 2.1 — моделью для генерации коротких видео по текстовым описаниям. Несмотря на открытость проекта и наличие моделей с 1.3B и 14B параметров, в публичных статьях практически не описано, как они работают на практике: что реально влияет на скорость, какие параметры важны и что происходит на разных GPU.

У Wan 2.1 есть несколько режимов генерации: Text-to-Video (T2V) — создание видео по тексту, и Image-to-Video (I2V) — анимация на основе одного изображения. Можно попробовать оба — в зависимости от задачи или просто настроения.

Пока решил сосредоточиться на T2V, чтобы посмотреть, как модель справляется с текстовыми описаниями и насколько это вообще удобно в реальной работе.

Согласно официальной документации, модель T2V‑1.3B совместима с потребительскими видеокартами — например, RTX 4090 с 24 GB VRAM — и способна генерировать 5‑секундное видео в разрешении 480p за ≈ 4 мин даже без оптимизаций. При этом оффлоад с CPU (--offload_model True и --t5_cpu) позволяет избежать ошибок OOM на GPU с ограниченной видеопамятью.

Я решил проверить, насколько быстро получится генерировать ролики на Wan 2.1‑T2V‑14B при хорошем железе — A100 или аналог. просто запустить, поиграться с параметрами и посмотреть, где реально есть прирост скорости, а где — нет.

Спойлер: первый запуск вышел не слишком впечатляющим. На первую генерацию ушло около 40 минут — явно не то, чего ожидаешь от топовой A100. Но это была "прямая" попытка без тонкой настройки, так что дальше — интереснее.

Что именно я пытался сделать

Задача была простая — протестировать генерацию видео с моделью Wan2.1-T2V-14B, при этом добиться хорошего качества и минимального времени генерации, чтобы не тратить лишние ресурсы на аренду GPU.

Почему выбрал именно 14B-модель? Потому что, как ни странно, у неё меньше визуальных глюков, чем у облегчённой 1.3B — картинка получается более стабильная, чёткая и плавная.

Разрешение видео

На выбор было два варианта: 1280×720 и 832×480. Первый даёт более качественное видео, но ждать по 10–30 минут за каждую генерацию — долго, особенно если видео всего на 5 секунд. А мне нужно было много запусков, чтобы быстро отследить влияние параметров и настроек.

Поэтому я остановился на 832×480 — это компромисс между качеством и скоростью.

Параметры генерации и подготовка к тестированию

Прежде чем перейти к экспериментам, я разобрался с ключевыми параметрами, которые могут повлиять на результат. Вот краткое описание некоторых из них:

Параметр

Описание

--size

Размер генерируемого кадра (например, 832x480).

--sample_steps

Число шагов семплинга для diffusion‑блока.

--sample_shift

Жёсткость следования prompt: чем выше значение, тем ближе видео к тексту.

--sample_guide_scale

Баланс качества и разнообразия — влияет на детализацию и динамику.

--ring_size

Размер кольца FSDP — распределение градиентов между GPU.

--dit_fsdp

Включение шардирования diffusion‑трансформера.

--t5_fsdp

Включение шардирования T5‑энкодера.

--use_prompt_extend

Включает расширение prompt через внешнюю Qwen‑модель.

--prompt_extend_*

Настройки расширения prompt язык 

--base_seed

Установка случайного зерна для повторяемости генерации.

Некоторые из этих параметров влияют на качество результата:

  • size

  • sample_steps

  • sample_shift

  • sample_guide_scale

  • use_prompt_extend

  • prompt_extend_*

Некоторые — на скорость генерации:

  • size

  • sample_steps

А есть и параметры, которые мне не удалось полноценно протестировать:

ring_size и ulysses_size, согласно документации, нужны при генерации на нескольких GPU с offloading или последовательной обработкой фреймов.
Но в моих экспериментах (5 секунд, 81 кадр, 16 fps, модель и данные полностью помещаются в память A100 80GB) никакого эффекта от них не наблюдалось. Вероятно, они становятся актуальны при генерации более длинных видео или больших batch-size.

Отдельно стоит упомянуть базовые параметры длины:

  • fps (частота кадров) — по умолчанию 16,

  • frame_num — количество кадров, по умолчанию 81.
    В сумме это даёт видео длиной 5 секунд.

Изображения в таких видео получаются достаточно плавными и стабильными, поэтому я решил не менять эти значения.

Теперь можно переходить к первому раунду тестов.

Начнём с простого — запустим генерацию на одной видеокарте с такими параметрами:

Скрытый текст

--task t2v-14B \
--size 832*480 \
--ckpt_dir ~/Wan2.1/Wan2.1-T2V-14B \
--sample_shift 10 \
--sample_guide_scale 6 \
--sample_steps 100 \
--base_seed 47 \
--prompt "A video postcawomen against the backdrop of a construction site congratulate on Builder's Day with smiles and warm words, creating an atmosphere of professional celebration and pride in the work."

Видео длиной 5 секунд (81 кадр, 16 fps) сгенерировалось за 37 минут.
Это, мягко говоря, не самый быстрый результат.

А вот что можно сказать о качестве?

В целом результат получился приемлемый, если не всматриваться в детали. Но, честно говоря, за 37 минут хотелось бы получить более качественную генерацию.

Наметим ориентиры:

  • видео должно генерироваться от 5 до 10 минут;

  • качество — выше среднего, без сильных артефактов и «плывущих» кадров.

Для начала попробуем сократить время генерации. На него в первую очередь влияет параметр sample_steps. В нашем первом запуске он был равен 100 — и это дало 37 минут генерации.

Теперь проведём серию тестов с уменьшением количества шагов. Оставим остальные параметры без изменений и прогоним модель с sample_steps = 50, 30, 20, 10. Посмотрим, как это отразится на времени генерации и качестве видео.

sample_steps = 50: время 19 минут
sample_steps = 50: время 19 минут
sample_steps = 30: время 11 минут
sample_steps = 30: время 11 минут
sample_steps = 20: время 7 минут
sample_steps = 20: время 7 минут
sample_steps = 10: время 4 минуты
sample_steps = 10: время 4 минуты

Генерация при sample_steps = 30 даёт хорошее качество — видео выглядит цельным, анимация достаточно плавная.
А вот при 20 шагах начинает чувствоваться медленная, немного "растянутая" анимация и нарушается синхронность движений.

Поэтому за базовое значение я выбрал 30 шагов.
На одной A100 (80 ГБ) это даёт время генерации около 11 минут.

Если понадобится ускорение — можно масштабировать процесс на несколько GPU, но пока что сосредоточимся на улучшении качества видео. Настройки времени нас устраивают.

Влияние параметров sample_shift и sample_guide_scale на генерацию видео

Перед тем как переходить к ключевым настройкам промпта, стоит разобраться с базовыми параметрами генерации, которые влияют на то, насколько строго модель следует тексту и как двигается видео.

Вот два параметра, которые напрямую на это влияют:

  • sample_shift — управляет строгостью следования промпту.

  • sample_guide_scale — влияет на динамику и скорость видео.

Почему только они?

Это самые простые параметры для анализа. В отличие от промпта или prompt_extend_model, где трудно оценить качество, здесь всё прозрачно: задал числа — получил видео — сравнил.

Ограничения и диапазоны

  • sample_shift: нельзя ставить 0 (выдаст ошибку).

  • sample_shift и sample_guide_scale: максимум — 12. При 13 модель падает.

  • Поэтому перебираем:

    • sample_shift = 2, 4, 6, 8, 10, 12

    • sample_guide_scale = 0, 2, 4, 6, 8, 10, 12

Итого: 6 × 7 = 42 видео.

Главное наблюдение

Даже при одинаковом seed, модель генерирует разные видео — достаточно изменить sample_shift или sample_guide_scale.

Это подтверждает: даже небольшие изменения параметров влияют на поведение модели сильнее, чем мы ожидали. И это можно использовать для тонкой настройки генерации.

Поскольку полная таблица (6×7) слишком велика, ниже показана выборка из неё: значения sample_shift от 8 до 12 и sample_guide_scale от 4 до 10.

Таблица результатов

По оси X — sample_guide_scale, по оси Y — sample_shift.
Начало координат — верхний левый угол

Вывод по таблице

Итоговое (субъективное) наблюдение:
наиболее стабильное и визуально цельное видео получается при параметрах:
--sample_shift 10
--sample_guide_scale 8 

Почему именно они?

  • Меньше всего визуальных "глюков" при быстрых движениях — модель лучше держит форму объектов.

  • Есть задник (фон), он не исчезает и не размывается.

  • Динамика — не слишком медленно, но и не в хаосе.

Чтож, базовые параметры разобраны.
Теперь — к главному: как реально поднять качество видео с помощью промпта и его расширения.
Дальше будет про:

  • --use_prompt_extend

  • --prompt_extend_method

  • --prompt_extend_model

  • и конечно, сам текстовый промпт, который влияет сильнее всего.

Повышение качества генерации с помощью расширенного промпта

Для получения наилучшего качества генерации в Wan 2.1 критически важно тщательно и подробно формулировать prompt — именно от него в значительной степени зависит финальный результат.
Чем точнее и богаче описание, тем реалистичнее, осмысленнее и визуально последовательнее будет видео.

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

  • уточняет исходный текст,

  • добавляет детали,

  • усиливает семантику (в особенности полезно при коротких, размытых запросах).

Доступны три уровня моделей:

  • Qwen-3B — лёгкая и быстрая. Минимальные требования к ресурсам, но ограниченная "фантазия".

  • Qwen-7B — компромисс между качеством и скоростью.

  • Qwen-14B — максимальная проработка смысла и деталей, наилучшее качество, но требует больше GPU-памяти.

Важно:
Модель не влияет на скорость генерации самого видео, но добавляет время на обработку пайплайна перед генерацией. Это время я не учитывал в замерах.

Посмотрим, что дает использование prompt_extend

Ниже — примеры, показывающие, насколько сильно промпт и его расширение могут влиять на итоговое видео.
Для чистоты эксперимента:

  • все параметры sample_shift и sample_guide_scale были зафиксированы (на значениях 10 и 8 соответственно);

  • менялся только prompt и флаг --use_prompt_extend.

Теперь покажу, каких результатов можно достичь с помощью промпта.

Параметры

prompt "A tall construction worker (subject) on a sunny urban building site (scene), smiling and raising his helmet (motion), shot with a slow dolly in (camera), in warm golden-hour soft light (style)."

Параметры

--use_prompt_extend \
--prompt_extend_target_lang 'en'\
--prompt "A tall construction worker (subject) on a sunny urban building site (scene), smiling and raising his helmet (motion), shot with a slow dolly in (camera), in warm golden-hour soft light (style)

Параметры

--use_prompt_extend \
--prompt_extend_target_lang 'en'\
--prompt "A proud construction worker with sun-kissed skin and a reflective vest stands amid scaffolding, lifting his helmet in salute as confetti drifts gently in the warm air. Behind him, a partially completed skyscraper glows in the setting sun. The shot uses cinematic realism, slow dolly movement, and detailed textures to evoke a heartfelt tribute."

Параметры

--use_prompt_extend
--prompt_extend_target_lang 'en'
--prompt "A construction worker pauses atop a building at golden hour, gazing out across the city with satisfaction. He lifts his helmet slightly and smiles. The shot features soft cinematic lighting, slow dolly-in, and distant fireworks to frame the moment with emotion and realism, honoring those who build the world."

А теперь парочку неудачных

Параметры

--use_prompt_extend
--prompt_extend_target_lang 'en'
--prompt "A tall construction worker in a bright yellow hard hat stands confidently on a rooftop at sunset, smiling with pride and raising his helmet as golden-hour light bathes the urban skyline. In the background, colorful fireworks bloom across the sky, captured in slow cinematic dolly-in with soft lens flares and natural lighting, celebrating the spirit of builders."

Параметры

--use_prompt_extend \
--prompt_extend_target_lang 'en'\
--prompt "A tall construction worker wearing a bright yellow hard hat, standing proudly on a sunny urban building site, smiling broadly and lifting his helmet high in celebration, framed with festive confetti and bold graphic borders, shot with a smooth slow dolly‑in, bathed in warm golden‑hour light and rendered in a cheerful greeting‑card illustration style."

Работа с промптом: творчество с ограничениями

Промпт действительно существенно влияет на качество генерации.
Но важно помнить: чрезмерное усложнение или перегрузка описания может привести к непредсказуемым результатам. Именно это и произошло в одной из последних генераций — из-за избыточного описания картинка стала перегруженной и стилистически расплывчатой.

Как лучше формулировать промпт?

Оптимальный подход — использовать структурированный шаблон, в котором каждое ключевое измерение описания занимает своё место:

  • Subject — кто или что в кадре (например, "a young man", "a robot dog").

  • Scene — где происходит действие (например, "in a rainy city street", "on Mars").

  • Motion — основное движение в сцене (например, "walking toward the camera", "floating in zero gravity").

  • Camera — работа камеры (например, "tracking shot", "zoom out", "handheld").

  • Style — художественный стиль (например, "cinematic", "cyberpunk", "80s VHS aesthetics").

Такой шаблон помогает взять под контроль всю сцену и мыслить как режиссёр: сначала определить ключевые элементы, затем построить последовательность событий, выбрать угол съёмки и задать атмосферу.

Важно: все эти элементы можно как явно указывать, так и встраивать в контекст — итоговое качество при этом не страдает.

Предупреждение: дословное восприятие стиля

Модель способна интерпретировать отдельные фразы буквально.
Пример: фраза

Даже если весь промпт настроен на реалистичный стиль, финальная вставка вроде "rendered in a cheerful greeting-card illustration style" может полностью переопределить результат и сделать его мультяшным.

Поэтому стоит быть внимательным с описаниями в стиле "as if...", "in the style of...", особенно если цель — реализм.

Автоматическое дополнение промпта: усиление смысла

Для повышения выразительности генераций в Wan 2.1 предусмотрена возможность автоматического дополнения пользовательского промпта с помощью языковых моделей семейства Qwen. Это особенно полезно, когда изначальный запрос слишком короткий, неполный или неструктурированный.

Встроенные модели не просто "переписывают" промпт — они усиливают его семантику, уточняют детали сцены и добавляют стилистические акценты. Такая обработка может значительно улучшить итоговое качество видео даже при минимальном вводе со стороны пользователя.

Доступные языковые модели:

  • Qwen-3B
    Компактная модель. Быстрая в работе, подходит для ускоренного прототипирования. Даёт простые, но логичные дополнения.

  • Qwen-7B
    Компромисс между качеством и скоростью. Обогащает промпт более связными описаниями сцен, при этом не добавляя лишнего.

  • Qwen-14B
    Крупная модель, дающая наиболее продуманные и художественные расширения. Учитывает стилистику, контекст, эмоции. Лучше всего справляется с задачами кинематографического построения кадра. Требует больше оперативной памяти и ресурсов.

Особенности использования:

  • Выбор Qwen-модели не влияет на время генерации видео, но влияет на время загрузки модели в GPU перед запуском.

  • Чем выше уровень модели, тем более качественным и структурированным будет итоговый промпт.

Когда это особенно полезно?

  • При лаконичных или абстрактных промптах вроде: "sunset over the ocean" — дополнение превратит их в более насыщенные описания.

  • При быстрой генерации черновиков, когда нет времени вручную прорабатывать сцену.

  • Когда хочется задать определённый стиль или эмоциональный тон, но не получается точно сформулировать его вручную.

Да, модель действительно может дополнить промпт, если тот слишком краткий или абстрактный. Но что произойдёт, если исходный промпт уже детально проработан?

Например, рассмотрим следующий пример:

An adult construction worker (30–35 years old) wearing a yellow hard hat smiles warmly and waves at the camera on a busy construction site at sunset, with soft volumetric lighting shot using a slow zoom-in close-up to emphasize pride and celebration. In the background, a celebratory explosion of fireworks is going off in the distance.

Этот промпт уже содержит:

  • возраст и эмоции персонажа,

  • конкретные действия (улыбка, жест),

  • место и время суток,

  • тип освещения,

  • движение камеры,

  • настроение сцены,

  • фоновое событие.

Если поверх такого промпта применить автоматическое дополнение, возможны два варианта:

  1. Модель аккуратно усилит описание, добавив незначительные детали (например, цвет одежды или материалы на фоне).

  2. Или начнёт "переизобретать" сцену, добавляя избыточные, а иногда даже противоречивые детали (например, сменит стиль с реалистичного на мультяшный, изменит эмоции или упрощает текст).

Вот несколько генераций по вышеуказанному промпту:

Но давайте не будем теоретизировать — посмотрим, что происходит на практике.

Параметры

--use_prompt_extend  
--prompt_extend_method 'local_qwen'
--prompt_extend_target_lang 'en'
--prompt_extend_model 'Qwen/Qwen2.5-3B-Instruct'
--prompt "An adult construction worker (30-35 years old) wearing a yellow hard hat smiles warmly and waves at the camera on a busy construction site at sunset, with soft volumetric lighting shot using a slow zoom in close-up to emphasize pride and celebration. In the background, a celebratory explosion of fireworks is going off in the distance"

Параметры

--use_prompt_extend
--prompt_extend_method 'local_qwen'
--prompt_extend_model 'Qwen/Qwen2.5-3B-Instruct'
--prompt_extend_target_lang 'en'
--prompt "An adult construction worker (30-35 years old) wearing a yellow hard hat smiles warmly and waves at the camera on a busy construction site at sunset, with soft volumetric lighting shot using a slow zoom in close-up to emphasize pride and celebration. In the background, a celebratory explosion of fireworks is going off in the distance"

Параметры

--use_prompt_extend
--prompt_extend_method 'local_qwen'
--prompt_extend_model 'Qwen/Qwen2.5-14B-Instruct'
--prompt_extend_target_lang 'en'
--prompt "An adult construction worker (30-35 years old) wearing a yellow hard hat smiles warmly and waves at the camera on a busy construction site at sunset, with soft volumetric lighting shot using a slow zoom in close-up to emphasize pride and celebration. In the background, a celebratory explosion of fireworks is going off in the distance"

Изначально промпт уже достаточно детализирован, и кажется, что дописывать его больше просто некуда. Но даже в таком случае модель Qwen продолжает дополнять его — иногда добавляя неожиданные, но уместные нюансы, усиливая атмосферу сцены или подчёркивая эмоции персонажа.

И главное — всё это не ухудшает качество, а наоборот, часто работает на усиление образа. Улучшается освещение, композиция становится кинематографичнее, добавляются мелкие детали, которые делают картинку "живой".

При этом стоит отметить, что время генерации таких сложных, проработанных сцен остаётся в пределах 11 минут — что вполне приемлемо, учитывая визуальное качество результата.

Таким образом, автоматическое дописывание промпта — не враг, а помощник, особенно если начальный текст уже задан на высоком уровне.

Ускорение генерации: используем несколько GPU

Теперь, когда мы зафиксировали оптимальные параметры генерации и получили высокое качество видео, логично перейти к оптимизации скорости. Один из самых очевидных путей — распараллеливание задачи на несколько видеокарт.

В библиотеке Wan2.1 для генерации видео предусмотрены специальные параметры, позволяющие оптимизировать использование нескольких GPU. Среди них — ring_size и ulysses_size, относящиеся к механизмам межкарточного взаимодействия и параллелизации.

Практика использования

Параллельные стратегии для двух GPU

При запуске генерации на двух GPU в Wan 2.1 необходимо выбрать одну из двух стратегий параллелизма:

  1. Data‑parallel (Ring Strategy)
    Параметр --ring_size 2 объединяет оба GPU в кольцевую группу для одновременной обработки кадров и синхронизации градиентов. Это ускоряет генерацию за счёт равномерного распределения семплинга между картами.

  2. Model‑parallel (Ulysses Strategy)
    Параметр --ulysses_size 2 разбивает внутри себя модель (например, attention‑heads) на две части, по одной на каждый GPU. Это позволяет работать с очень большими моделями, которые не умещаются целиком в память одной карты.

Как выбрать стратегию

  • Если модель умещается в память каждого GPU, но вы хотите ускорить процесс, лучше использовать Ring Strategy (--ring_size = число карт, --ulysses_size = 1).

Если модель не помещается даже после шардирования FSDP, требуется Model‑parallel (--ulysses_size > 1) или комбинация:

ring_size × ulysses_size = total_GPU_count

  • Для случаев нехватки видеопамяти существуют флаги --offload_model True и --t5_cpu, которые переносит часть вычислений (модель и/или T5‑энкодер) на CPU. В моих экспериментах они не использовались, так как модель целиком помещалась на одну A100.

Ускорение обработки: параметры --dit_fsdp и --t5_fsdp

Для максимальной эффективности генерации видео на нескольких GPU Wan 2.1 предоставляет два ключевых флага:

  • --dit_fsdp — включает FSDP‑шардирование для Diffusion Transformer (DiT), отвечающего за визуальную декодировку кадров.

  • --t5_fsdp — включает FSDP‑шардирование для текстового энкодера T5, который обрабатывает пользовательский prompt.
    При включении этих флагов модель распределяется по доступным GPU, что способствует снижению памяти на один устройство и ускорению traceback‑шагов выполнения.

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

  • При multi‑GPU конфигурации (2–8 карт) рекомендуется одновременно активировать --dit_fsdp и --t5_fsdp для обеих подсистем модели — это обеспечивает сбалансированную нагрузку и ускоряет работу.

  • В официальной примерной конфигурации для модели Т2V-14B на 8 GPU используются именно оба флага вместе с ulysses_size=8 или ring_size=8 и dit_fsdp, t5_fsdp

Практический результат

В тестах с моделью Wan2.1-T2V-14B на разрешении 832×480:

  • 1×A100: генерация одного видео заняла ~10 мин.

  • 2×A100 + --ring_size 2 (без ulysses_size): время сократилось до ~5 мин.

  • 4×A100+ --ring_size 4 (без ulysses_size): время сократилось до ~3 мин.

  • Тест --ulysses_size 2 не дал дополнительного ускорения — обе стратегии показали одинаковое время, потому что модель помещалась на каждую карту и ключевую роль играл именно data‑parallel через torchrun --nproc_per_node=2.

Что в итоге

В итоге получилось так: если аккуратно подобрать параметры (--sample_shift, --sample_guide_scale), можно заметно сократить артефакты и сделать видео приятнее, особенно в движении. Промпт тоже сильно влияет — но перебарщивать с ним не стоит, иначе выходит перегруженная сцена или вообще не то, что ожидалось.

Подключение Qwen помогает дополнить промпт, особенно если он короткий. Но если промпт уже проработан, результат всё равно может немного меняться — в лучшую сторону, но не всегда предсказуемо.

Ну и наконец, если нужно ускорить генерацию — можно использовать сразу несколько видеокарт, благо Wan2.1 это позволяет через ring_size и ulysses_size. Это полезно, если надо сгенерировать не одно видео, а много, и желательно не ждать по 10 минут на каждое.

Теги:
Хабы:
+7
Комментарии0

Публикации

Информация

Сайт
ai.raftds.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
Евгений Кокуйкин