Qwen Image 2.1 + MiniMax H3: локальный видеопайплайн по первому и последнему кадру
Как выбрать полностью локальные 768p или гибридные 2K, подготовить кадры в Qwen, запустить H3-Base локально, сравнить с облачной версией на одинаковых входах и найти источник сбоев.
Содержание

Вы уже можете получить в Qwen убедительные первый и последний кадры. Главная проблема — сможет ли H3 связать их в один непрерывный план: не заменить героя, не вставить лишнюю склейку и не выдать зависимый от API путь 2K за локальный. Ниже — практический маршрут: сначала доказать полностью локальную цепочку 768p, затем переходить на гибридные 2K только при реальной необходимости и сравнивать локальный и размещённый H3 на одинаковых входах.
С чего начать: локальные 768p подходят большинству задач
Если нужно проверить передачу кадров, оставить материалы на своей машине или найти причину лишних склеек, начните с полностью локальных 768p. Гибридные 2K выбирайте только тогда, когда 2K обязателен для выдачи и допустимы удалённые вызовы H3-Context-IR и H3-Regenerate-2K.
| Ваша цель | С чего начать | Почему | Когда рекомендация меняется |
|---|---|---|---|
| Доказать, что вся цепочка работает | Полностью локальные 768p | Меньше переменных: проблемы Qwen и H3 проще разделить | Переходите дальше, когда 768p стабилен и выдаче действительно нужен 2K |
| Не отправлять материалы наружу | Полностью локальные 768p | Кадры Qwen и H3-Base остаются на вашей машине | Если одновременно нужен 2K и запрещены удалённые API, документированный полный путь не подходит; потребуется другое локальное 2K-решение |
| Получить финальный ролик 2K | Гибридные 2K | Официальный полный путь зависит от двух размещённых модулей | Возвращайтесь к 768p или меняйте решение, если материалы нельзя отправлять удалённо |
| Выбрать между локальным и размещённым H3 | Сначала запустите локальные 768p, затем делайте парное сравнение | Иначе ошибки развёртывания смешаются с качеством модели | Фиксируйте долгосрочный вариант после повторов на нескольких типах планов |
Не обещайте совместимость только по названию видеокарты. В примере MiniMax с SGLang используются четыре GPU, а публичный запуск выполнен на DGX Spark; ни один из них не даёт минимальный VRAM и не доказывает работу на обычной потребительской карте.
Что действительно можно оставить на своей машине
Локально выполняются создание кадров в Qwen и H3-Base 768p; официальный полный путь 2K остаётся гибридным.
| Этап | Можно выполнить локально? | Документированная граница |
|---|---|---|
| Создание и редактирование первого/последнего кадра в Qwen Image 2.1 | Да | Официальный репозиторий содержит QwenImage21Pipeline, локальные примеры Diffusers, нативные размеры 2K и поддержку до 10 референсных изображений |
| Преобразование первого/последнего кадра в аудиовидео с MiniMax H3-Base | Да | Открытый checkpoint FL2VA принимает ноль, одно или два изображения; два изображения включают режим первого и последнего кадра, локальная проверка выполняется в 768p |
| H3-Context-IR | Не в виде полного официального локального решения | MiniMax описывает его как размещённую систему предобработки и оркестрации, не вошедшую в открытый релиз; можно вызвать API либо построить собственную предобработку по руководству по промптам |
| H3-Regenerate-2K | Не из текущих открытых компонентов | Модуль пока не открыт; официальный полный 2K-процесс обращается к нему через API |
| Сравнение с размещённым H3 | Нет | Web/API-запуск по определению удалённый и служит контрольной группой |
MiniMax также указывает длительность 4–15 секунд, 24 FPS, стерео 32 кГц и короткую сторону 768 пикселей по умолчанию; 2K создаётся через H3-Regenerate-2K. Это границы модели, а не обещание, что любая конфигурация поместится в ваше оборудование.
Один публичный тест доказывает реализуемость, но не выбирает победителя
Используйте этот пример как схему проверки, а не как доказательство, что локальный H3 всегда лучше.
Кинематографист Sam Wasserman показал один локальный запуск «идея → изображение → видео» на DGX Spark с Qwen Image 2.1 и MiniMax H3. Прикреплённый ролик длится примерно восемь секунд. В следующей публикации он сообщил, что повторил тот же prompt, те же спецификации и те же первый/последний кадры в платном Web H3. По его оценке, веб-версия вставила нежелательную склейку, тогда как локальная сохранила задуманную последовательность.
Это полезное подтверждение реализуемости и хороший дизайн парного сравнения. Но это не доказательство, что локальный H3 в целом лучше. В публикациях нет команд установки, пикового потребления памяти, времени генерации, обработки звука, seed или неудачных попыток. Сравнение сделал тот же автор на одном входе, а не независимая команда.
Шаг 1. Сведите идею к одному непрерывному плану
Задайте одну локацию, одну цепочку действий и одно конечное состояние. Запишите их как контракт плана — короткую спецификацию, по которой можно проверить и инструкцию, и результат.
| Поле | Что определить |
|---|---|
| Объект и окружение | Люди, предметы, одежда, фон и признаки идентичности, которые должны сохраняться |
| Начальное состояние | Положение, поза, взгляд, крупность, композиция и свет в первом кадре |
| Конечное состояние | Только допустимое изменение к последнему кадру; не меняйте одновременно героя, локацию и положение камеры |
| Траектория движения | Как движется объект, движется ли камера и в каком порядке происходят действия |
| Ограничения непрерывности | Явные формулировки «один непрерывный план», «без склеек», «без телепортации» |
| Выходные параметры | Длительность, соотношение сторон, необходимость речи, атмосферы или музыки |
| Запреты | Нежелательные персонажи, субтитры, смены сцен, замена фона и лишние действия |
Если тест должен выявить нежелательные склейки, не просите в одном prompt несколько локаций, временных периодов или монтажную последовательность. Иначе склейка может быть разумной интерпретацией инструкции, а не ошибкой модели.
Например, «герой идёт от двери к столу, берёт чашку, без склеек» подходит для проверки первого и последнего кадров. «Перейти с улицы в офис, затем показать флешбэк детства» естественно требует нескольких сцен и не подходит для чистой проверки лишних склеек.
Шаг 2. Сначала создайте первый кадр, затем отредактируйте его в последний
Получайте последний кадр редактированием первого, а не двумя независимыми prompt. Так проще сохранить героя, одежду, композицию и фон ещё до запуска H3.
Официальный ID модели — Qwen/Qwen-Image-2.1. Qwen документирует визуальный генератор на 7B параметров, локальную работу через Diffusers, генерацию и редактирование, нативный 2K и до 10 референсных изображений.
pip install "torch>=2.4.0" "transformers>=5.17" accelerate pillow
pip install git+https://github.com/huggingface/diffusers
from pathlib import Path
import torch
from diffusers import QwenImage21Pipeline
first_prompt = Path("first_prompt.txt").read_text(encoding="utf-8").strip()
last_edit_prompt = Path("last_edit_prompt.txt").read_text(encoding="utf-8").strip()
pipe = QwenImage21Pipeline.from_pretrained(
"Qwen/Qwen-Image-2.1",
torch_dtype=torch.bfloat16,
).to("cuda")
first = pipe(
prompt=first_prompt,
width=2752,
height=1536,
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(42),
).images[0]
first.convert("RGB").save("first.png")
last = pipe(
prompt=last_edit_prompt,
image=first,
width=2752,
height=1536,
num_inference_steps=40,
generator=torch.Generator("cuda").manual_seed(43),
).images[0]
last.convert("RGB").save("last.png")
Код объединяет официальные интерфейсы генерации и редактирования одного изображения; first_prompt и last_edit_prompt задаёте вы. Используются документированный размер 16:9 2752 × 1536, 40 шагов и непрозрачные RGB PNG. В публичном описании H3 не указано, как при такой передаче обрабатывается alpha-канал, поэтому непрозрачные кадры убирают одну переменную, если RGBA не проверялся отдельно.
После генерации запишите не только имена файлов:
- ID модели, версию фреймворка, prompt первого кадра и prompt редактирования последнего;
- оба seed, ширину, высоту, число шагов и список референсов;
- SHA-256, размер в пикселях и цветовой режим обоих файлов;
- стабильность личности, одежды, композиции, света и фона;
- показывает ли последний кадр только конечное состояние, а не весь сценарий движения.
Qwen также документирует enable_model_cpu_offload() для ограниченной памяти. Это подтверждает наличие offload-пути, но не устанавливает минимальный VRAM и не гарантирует скорость всей связки.
Шаг 3. Дайте локальному и размещённому H3 один и тот же вход
Не вводите параметры по памяти в двух интерфейсах. Сохраните кадры, prompt и настройки вывода в одном манифесте: другой seed, длительность или переписанный prompt способны обесценить всё сравнение.
experiment_id: "qwen-h3-001"
qwen_model: "Qwen/Qwen-Image-2.1"
h3_model: "MiniMaxAI/MiniMax-H3"
h3_variant: "fl2va"
prompt_file: "prompt.txt"
first_frame: "first.png"
last_frame: "last.png"
prompt_sha256: "<sha256>"
first_frame_sha256: "<sha256>"
last_frame_sha256: "<sha256>"
duration_seconds: "<same value>"
aspect_ratio: "<same value>"
local_seed: "<record if exposed>"
hosted_seed: "<record or not_exposed>"
Локальный и размещённый запуски должны читать этот манифест. Если Web-интерфейс скрывает seed, переписывает prompt или ограничивает длительность, укажите not_exposed либо сохраните переписанный текст. Не изображайте параметры одинаковыми, когда это нельзя проверить: различие результатов имеет смысл только после контроля наблюдаемых входов.
Шаг 4. Сначала добейтесь локального результата H3-Base в 768p
Сначала примите результат 768p и только потом думайте о 2K. Статичные кадры Qwen могут быть 2K, но локальное видео H3-Base от этого не становится 2K.
MiniMax публикует два специализированных checkpoint. Здесь нужен MiniMax-H3 Base FL2VA, который поддерживает генерацию аудиовидео из текста, первого, последнего или обоих кадров в BF16. Официальные команды загрузки и пример SGLang:
hf download MiniMaxAI/MiniMax-H3 \
--include "FL2VA/*" \
--local-dir MiniMax-H3
sglang serve \
--model-path MiniMaxAI/MiniMax-H3 \
--num-gpus 4 \
--ulysses-degree 4 \
--performance-mode speed \
--host 0.0.0.0 \
--port 30010 \
--model-variant fl2va
Вторая команда — пример MiniMax для четырёх GPU. Это не опубликованная конфигурация DGX Spark от Wasserman и не минимальное требование. Меняйте её только по документации выбранного фреймворка и фиксируйте все изменения; не выдавайте пример за гарантию для любой машины.
Сделайте оба кадра доступными процессу SGLang
FL2VA принимает одно или два изображения с role: "keyframe". В официальном руководстве SGLang для H3 frame_index: 0 означает первый кадр, frame_index: -1 — последний, а набор [0, -1] задаёт оба граничных кадра. В воспроизводимом скрипте MiniMax показан вариант только с первым кадром; ниже те же поля используются сразу для двух изображений.
URI file:// разрешает процесс сервера SGLang, а не терминал, из которого запущен curl. Если сервер и команда работают на одном хосте, подходят абсолютные пути из realpath. При запуске SGLang в контейнере или на другой машине сначала смонтируйте либо скопируйте туда оба файла и задайте FIRST_URI и LAST_URI как пути, доступные серверу.
Сохраните контракт плана в prompt.txt. Для полностью локального 768p это может быть ваш структурированный prompt. В гибридном пути 2K поместите результат H3-Context-IR в то же поле prompt, а затем передайте результат H3-Base в H3-Regenerate-2K.
Отправьте FL2VA, дождитесь завершения и сохраните MP4
Скрипт следует документированному асинхронному циклу: создаёт задачу через POST /v1/videos, читает .id, опрашивает GET /v1/videos/{id} и обращается к GET /v1/videos/{id}/content только после status: "completed". Официальный cookbook считает failed конечной ошибкой; при любом другом непустом статусе опрос продолжается.
set -euo pipefail
BASE_URL="${BASE_URL:-http://127.0.0.1:30010}"
FIRST_URI="${FIRST_URI:-file://$(realpath first.png)}"
LAST_URI="${LAST_URI:-file://$(realpath last.png)}"
PROMPT_FILE="${PROMPT_FILE:-prompt.txt}"
OUTPUT_FILE="${OUTPUT_FILE:-fl2va.mp4}"
payload=$(
jq -n \
--rawfile prompt "$PROMPT_FILE" \
--arg first "$FIRST_URI" \
--arg last "$LAST_URI" \
'{
model: "MiniMaxAI/MiniMax-H3",
task: "fl2va",
prompt: $prompt,
seconds: 8,
conditions: [
{
type: "image",
uri: $first,
role: "keyframe",
frame_index: 0
},
{
type: "image",
uri: $last,
role: "keyframe",
frame_index: -1
}
],
target: {
short_edge: 768,
aspect_ratio: "auto",
duration_seconds: 8
},
seed: 0
}'
)
response=$(
curl --fail-with-body --silent --show-error \
--request POST \
--url "$BASE_URL/v1/videos" \
--header 'Content-Type: application/json' \
--data-binary "$payload"
)
video_id=$(printf '%s\n' "$response" | jq -er '.id')
printf 'video_id=%s\n' "$video_id"
while true; do
task_json=$(
curl --fail-with-body --silent --show-error \
--request GET \
--url "$BASE_URL/v1/videos/$video_id"
)
status=$(printf '%s\n' "$task_json" | jq -er '.status')
printf 'status=%s\n' "$status"
case "$status" in
completed)
break
;;
failed)
printf '%s\n' "$task_json" | jq .
exit 1
;;
*)
sleep 1
;;
esac
done
curl --fail-with-body --silent --show-error --location \
--request GET \
--url "$BASE_URL/v1/videos/$video_id/content" \
--output "$OUTPUT_FILE"
test -s "$OUTPUT_FILE"
if command -v ffprobe >/dev/null 2>&1; then
ffprobe -v error \
-show_entries stream=codec_type,codec_name,r_frame_rate,sample_rate,channels \
-of default=noprint_wrappers=1 \
"$OUTPUT_FILE"
fi
printf 'saved=%s\n' "$OUTPUT_FILE"
curl --fail-with-body немедленно завершает работу при ответе не 2xx, а jq -e — если в ответе нет .id или .status. При failed скрипт печатает полный JSON задачи и выходит с ненулевым кодом; для успеха также нужны удачная загрузка и непустой MP4.
Если установлен ffprobe, скрипт выводит сведения о медиапотоках. Документированный контракт SGLang — MP4 с видео H.264, 24 кадра/с, и одной стереодорожкой AAC 32 кГц. Если задача имеет completed, но файл пуст, не декодируется или имеет неожиданные свойства, не переходите к размещённому сравнению: сначала проверьте журнал SGLang, доступность URI изображений со стороны сервера и JSON запроса.
Поля и endpoints взяты из официального воспроизводимого FL2VA-скрипта MiniMax, cookbook MiniMax-H3 в SGLang и описания video API SGLang. Полностью локальный путь на этом этапе заканчивается MP4 H3-Base в 768p; полный 2K по-прежнему требует описанного выше гибридного процесса.
Шаг 5. Сравнивайте с размещённым H3 только после стабилизации локальной цепочки
Не сравнивайте качество, пока локальный запуск ещё ломается. Иначе ошибки развёртывания, различия входов и поведение модели невозможно разделить. Меняйте только место исполнения:
- Загрузите побайтно те же первый и последний кадры и проверьте хэши.
- Повторите тот же prompt, длительность, соотношение сторон, язык и намерение по звуку.
- Запишите, переписывает ли Web/API prompt, раскрывает ли seed и использует ли H3-Context-IR.
- Сохраните исходные файлы без монтажа, перекодирования и добавления музыки.
- Скройте метки происхождения и проведите слепую оценку, чтобы ожидание «локальное лучше» или «платное лучше» не влияло на вывод.
Для сравнения стоимости запишите собственный счёт API, время занятости машины и расход электроэнергии. Сами ярлыки «локально» и «платный Web» не показывают, какой путь дешевле для вашей нагрузки.
Шаг 6. Выберите путь для своих планов по одной шкале
Сначала проверьте, выполнена ли творческая задача, и только потом сравнивайте время и оборудование. Более высокое разрешение не помогает, если ролик постоянно вставляет лишние склейки.
| Критерий | Как проверять | Что записать |
|---|---|---|
| Верность первому кадру | Сохраняет ли начало героя, композицию и ключевые предметы, а не заменяет их сразу | Отклонение и таймкод |
| Достижение последнего кадра | Приходит ли ролик к конечному состоянию естественно, без резкого переключения на финальную картинку | Конечное состояние и качество перехода |
| Непрерывность одного плана | Есть ли непрошенные склейки, телепортации, замены сцены или временные скачки | Таймкоды и кадры до/после |
| Стабильность личности и фона | Сохраняются ли лицо, одежда, руки, реквизит и геометрия фона | Объект дрейфа и длительность |
| Траектория | Движутся ли герой и камера в согласованном порядке и направлении | Ошибка направления, скачок скорости, остановка |
| Аудио | При запросе есть ли дорожка, синхронизирована ли она, нет ли щелчков и постороннего содержания | Свойства медиа, рассинхрон, аномальный фрагмент |
| Спецификация | Соответствуют ли длительность, формат кадра, FPS и разрешение настройкам | Фактические метаданные |
| Ресурсы запуска | Стеновое время, пик памяти ускорителя, системная память и число повторов | Сырые логи каждого запуска, не оценки |
| Повторяемость | Возникает ли проблема снова при повторе контролируемого входа | Повторные результаты и доступные случайные параметры |
MiniMax заявляет генерацию стерео 32 кГц, но публикации Wasserman не сообщают, был ли звук включён, сохранён или обработан после генерации. Свой результат проверять можно, а ссылаться на этот пример как на проверку качества звука — нельзя.
Исправляйте верхний слой, а не перезапускайте всё подряд
Неверный первый кадр исправляется в Qwen, нарушение непрерывности — в H3, а расхождение разрешения начинается с проверки выбора между локальными 768p и гибридными 2K. Такая диагностика быстрее, чем менять все параметры сразу.
| Симптом | Сначала проверить | Действие |
|---|---|---|
| Первый кадр уже неверен | Этап Qwen | Исправьте prompt, референсы и seed, а не пытайтесь чинить композицию внутри H3 |
| В последнем кадре меняются герой или фон | Передаваемый актив Qwen | Редактируйте первый кадр вместо независимой генерации; уменьшите число изменений и повторно используйте стабильные референсы |
| Появляется нежелательная склейка | Prompt H3 и ограничения движения | Потребуйте один непрерывный план, удалите язык монтажа/нескольких сцен и повторите с теми же хэшами изображений |
| Ролик не доходит до финала | Длительность и план движения | Сократите цепочку действий и задайте порядок начало—процесс—конец |
| Звук отсутствует или не совпадает | Вариант H3, клиент и контейнер | Проверьте аудиовидео checkpoint и путь запроса; запуски без сопоставимого звука пометьте как несравнимые |
| Qwen не помещается в память | Развёртывание изображения | Попробуйте документированный CPU offload и измерьте влияние на скорость; не выводите универсальный минимум VRAM |
| H3 не стартует на текущем железе | Развёртывание H3 | Следуйте руководству фреймворка; официальный пример использует четыре GPU, но работа на потребительской карте не гарантирована |
| Локально доступно 768p, а 2K требует API | Граница архитектуры | Это документированная схема, а не сбой; примите 768p или выберите гибридный 2K |
| Локальный и облачный результаты сильно различаются | Входы и предобработка | Проверьте переписывание prompt, Context-IR, seed, длительность, формат и перекодирование до вывода о модели |
Как выбрать локальный или размещённый H3 для постоянной работы
Решение должно опираться на набор ваших планов, а не на один самый красивый пример. Проверьте статичную камеру, движение человека, изменение объекта, диалог и окружение, сохраняя успехи и неудачи; разделяйте следующие величины:
- длительность ролика, например около восьми секунд в публичном примере;
- время генерации, стеновой интервал от отправки до готового файла, которого в примере нет;
- спецификацию модели из документации поставщика;
- фактическое использование оборудования, измеренное у вас, а не угаданное по названию устройства;
- одно визуальное суждение, описывающее конкретный запуск, но не общий процент побед.
Если материалы не должны покидать вашу машину, по умолчанию сохраняйте локальный путь 768p. Если финальная выдача требует 2K и удалённые API допустимы, выбирайте гибридные 2K. Если важнее всего непрерывность, проведите слепую оценку локального и размещённого H3 на одном наборе планов и предпочитайте вариант, который стабильнее проходит вашу шкалу. Публичный пример показывает, что локальный путь запускается и в одном тесте избежал лишней склейки; он не заменяет ваши повторные проверки.
Проверьте эти восемь пунктов перед запуском
- Запуск помечен как «полностью локальный 768p» либо «гибридный 2K», термины не смешаны.
- Для обоих кадров сохранены модель Qwen, prompt, seed, размеры и референсы.
- Кадры и prompt хэшированы, оба запуска H3 читают один вход.
- Локальный запуск использует
fl2vaи сначала принимается как результат H3-Base 768p. - Переписывание prompt и скрытые параметры размещённой версии записаны честно.
- Исходные видео не отредактированы и оцениваются одной шкалой непрерывности, склеек, звука и спецификации.
- Время, пик памяти, повторы и ошибки взяты из логов.
- Вывод ограничен протестированными входами, оборудованием и датой проверки.
Итог
Рекомендация по умолчанию проста: локально создайте первый и последний кадры в Qwen Image 2.1, затем добейтесь локального 768p через MiniMax H3-Base fl2va. Переходите на H3-Context-IR → локальный H3-Base → H3-Regenerate-2K только тогда, когда 2K обязателен и удалённые API допустимы.
В любом варианте зафиксируйте кадры, prompt, длительность и соотношение сторон, затем сравнивайте непрерывность, лишние склейки, звук, время и нагрузку на оборудование при одинаковом входе. Так демонстрация превращается в проверяемый процесс, который можно осознанно принять или отклонить.
Ссылки
- Официальный репозиторий Qwen Image 2.1
- Официальное объявление об открытии MiniMax H3
- Официальный воспроизводимый FL2VA-запрос MiniMax H3
- Официальный cookbook SGLang для MiniMax-H3
- Описание video API SGLang Diffusion
- Локальный сквозной запуск Sam Wasserman
- Сравнение того же автора с Web H3 на одинаковых входах
Факты проверены 26 сентября 2026 года.