Технологии

«Сначала кадр, потом движение»: AWS показала генерацию изображений и видео на одном контейнере vLLM-Omni

Один и тот же образ AWS vLLM-Omni Deep Learning Container разворачивается двумя эндпоинтами Amazon SageMaker AI: FLUX.2-klein-4B рисует изображение в реальном времени, а Wan2.1-VACE-1.3B анимирует его асинхронно. Готовый MP4 сценарий забирает из Amazon S3, а поверх конвейера есть необязательный интерфейс на Streamlit. Модели и режимы вывода разные, обслуживающий стек — общий.

«Сначала кадр, потом движение»: AWS показала генерацию изображений и видео на одном контейнере vLLM-Omni

Один образ, два эндпоинта, два режима

Разбор идёт от текстовой подсказки к изображению, а затем к короткому видео на Amazon SageMaker AI. Из одного AWS vLLM-Omni Deep Learning Container разворачиваются два эндпоинта: эндпоинт реального времени для генерации изображений на FLUX.2-klein-4B и асинхронный эндпоинт для генерации видео на Wan2.1-VACE-1.3B. Изображение и подсказка о движении уходят в видеоэндпоинт, а готовый MP4 забирается из Amazon Simple Storage Service (Amazon S3).

Оба эндпоинта поднимаются из одного закреплённого образа AWS vLLM-Omni DLC, а различает их переменная SM_VLLM_MODEL, которую скрипт развёртывания переключает между FLUX.2-klein и Wan VACE. Общий образ сокращает разброс в обслуживающем стеке, а раздельные эндпоинты позволяют подобрать каждому модельному семейству свой тип инстанса и свой режим инференса. Авторы разбора отдельно отмечают, что разделение генерации изображений и видео с голосовым сценарием из первой части делает нагляднее разницу моделей, полезных нагрузок и шаблонов ответа.

Режимы выбраны по характеру нагрузки. Эндпоинт реального времени принимает запросы на /v1/images/generations, асинхронный — на /v1/videos/sync. Изображение приходит прямо в ответе, потому что приложение должно получить его до того, как соберёт следующий запрос, а генерация видео — операция длинная и несёт многокомпонентную нагрузку с опорой на изображение. Асинхронный режим ставит запрос в очередь и использует Amazon S3 для входа и выхода, поэтому клиент опрашивает место результата вместо того, чтобы держать один синхронный запрос открытым.

Это выбор под конкретную нагрузку, а не правило для всех видеомоделей: асинхронный вывод в SageMaker AI рассчитан на большие полезные нагрузки до 1 ГБ, длительную обработку до часа и требования почти реального времени. Такой эндпоинт умеет масштабироваться до нуля инстансов, когда запросов нет, поэтому расходы остаются только на время обработки.

Путь запроса: base64-PNG, JPEG-ссылка и multipart

FLUX.2-klein отвечает OpenAI-совместимым JSON, в котором PNG передаётся в base64. Пример изменяет размер изображения под целевые размеры видео и кодирует его в JPEG, после чего собирает запрос к Wan VACE. В коде это выглядит так: prepare_video_reference(image_bytes, width=480, height=320), ссылка на изображение — data URL с типом image/jpeg, 17 кадров и 30 шагов диффузии по умолчанию, а тело запроса собирает encode_multipart_formdata.

Преобразование нужно, чтобы ссылка на изображение оставалась меньше ограничения на размер одной части у multipart-парсера Videos API. Готовое тело запроса целиком выгружается в Amazon S3 и передаётся асинхронному эндпоинту с маршрутом /v1/videos/sync; SageMaker AI возвращает места результата и ошибок, а скрипт опрашивает их и сохраняет MP4 в папку outputs/.

SageMaker AI направляет трафик инференса на /invocations, а образ DLC читает заголовок CustomAttributes и перенаправляет запрос на выбранный маршрут vLLM-Omni. Тот же механизм описан в документации контейнера: образ для SageMaker дополнительно содержит промежуточное звено, которое через CustomAttributes распределяет /invocations по маршрутам конкретных модальностей. Пример заранее собирает тело multipart-запроса до выгрузки в Amazon S3, чтобы точный запрос к Videos API оставался явным, а успешные ответы и ошибки вызова хранятся в разных префиксах Amazon S3.

У инлайн-передачи есть предел: InvokeEndpointAsync принимает данные запроса прямо в теле через Body только до 128 000 байт, и использовать нужно либо Body, либо InputLocation, но не оба поля сразу. В этом сценарии выбран InputLocation, потому что многокомпонентный запрос с изображением больше указанного проектного лимита. Асинхронный вызов вообще начинается с того, что полезная нагрузка запроса кладётся в Amazon S3, а в InvokeEndpointAsync уходит указатель на неё.

Инстансы, квоты и стартовые условия

Пример использует фиксированные типы инстансов ml.g6.xlarge и ml.g6e.xlarge. Для эндпоинта изображений реального времени можно подключить capacity-aware instance pools SageMaker и перечислить совместимые типы по приоритету, но пул стоит добавлять только после проверки, что каждый кандидат подходит модели по памяти GPU и производительности; асинхронный видеоэндпоинт в примере остаётся на фиксированном типе.

Асинхронный эндпоинт создаётся почти как обычный: достаточно указать объект AsyncInferenceConfig при создании конфигурации эндпоинта. Наличие этого объекта означает, что эндпоинт принимает только асинхронные вызовы. После обработки SageMaker AI кладёт результат в заданное место Amazon S3, а уведомления об успехе или ошибке можно получать через Amazon SNS.

До старта нужны аккаунт AWS с настроенными учётными данными для AWS CLI или AWS SDK, роль исполнения SageMaker AI с доступом к демонстрационному бакету Amazon S3, право создавать и вызывать эндпоинты, квота эндпоинтов на ml.g6.xlarge и ml.g6e.xlarge в выбранном регионе, а также Git и Python 3.11 или новее. Разбор ведётся в регионе US East (N. Virginia), а перед развёртыванием GPU-эндпоинтов AWS советует свериться с ценами SageMaker AI.

Работа начинается с клонирования репозитория aws-samples/sagemaker-genai-hosting-examples и перехода в каталог 03-features/vllm-omni-image-video, после чего создаётся виртуальное окружение и ставятся зависимости из requirements.txt. Скрипт deploy.py принимает роль исполнения и регион, фиксирует версию образа omni-sagemaker-cuda-v1.6, создаёт эндпоинт изображений и асинхронный эндпоинт видео, а их имена записывает в.vllm_omni_media_state.json. На видеоэндпоинте включается тайлинг вариационного автоэнкодера (VAE), снижающий пиковое потребление памяти при декодировании видео. Если локальные учётные данные AWS истекут, пока эндпоинт выходит в работу, команду повторяют с флагом --resume, и скрипт переиспользует сохранённые ресурсы.

Тайминги одного прогона и осторожность с настройками

В одном проверочном прогоне в регионе US East (N. Virginia) эндпоинт изображений на ml.g6.xlarge дошёл до состояния InService за 9 минут 30 секунд, а видеоэндпоинт на ml.g6e.xlarge — за 8 минут 40 секунд. Тёплый вызов с настройками по умолчанию вернул изображение за 4,7 секунды; Wan VACE отчитался о 8,9 секунды модельной задержки, а командная строка забрала MP4 за 11,8 секунды. AWS прямо называет эти значения контрольными точками воспроизведения одного прогона, а не бенчмарками.

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

Конвейер можно прогнать и через приложение: после команды streamlit run app.py задаются подсказка для изображения, его размер и seed, затем подсказка о движении, число кадров, частота кадров и число шагов инференса. Приложение показывает и позволяет скачать оба артефакта, используя те же вспомогательные функции запросов, что и работа из командной строки.

Завершается всё уборкой: скрипт cleanup.py удаляет эндпоинты, их конфигурации и модели, но оставляет сгенерированные объекты в выходном префиксе Amazon S3 для проверки. Работающий GPU-эндпоинт продолжает стоить денег, поэтому префикс нужно удалить, когда артефакты больше не нужны.

Место в серии и рамки контейнера

Это вторая часть серии о специализированных контейнерах AWS DLC: первая часть разбирала потоковый синтез речи на vLLM-Omni и SageMaker AI, а вторая показывает реальный и асинхронный инференс на одном обслуживающем рантайме. Шаблон при этом не привязан к двум конкретным моделям: один и тот же подход позволяет разным семействам моделей отвечать тем способом, который подходит нагрузке.

Сам контейнер шире, чем генерация медиа: образы собираются для обслуживания мультимодальных моделей на AWS и поддерживают синтез речи, генерацию аудио, изображений и видео, а также мультимодальный чат через OpenAI-совместимые API. Образы построены на Amazon Linux 2023 с постоянным патчингом безопасности, а версия CUDA 13.0 требует драйвера NVIDIA 580+ на хосте — на более старых датацентровых драйверах включается слой обратной совместимости через VLLM_ENABLE_CUDA_COMPATIBILITY=1. Публикуются два варианта образа: для EC2 и EKS и отдельно для Amazon SageMaker AI, оба слушают порт 8080.

Соответствие маршрутов и модальностей AWS ведёт отдельными списками: в документации контейнера перечислены маршруты и примеры моделей — генерация изображений на /v1/images/generations с FLUX.2-klein-4B и ERNIE-Image-Turbo, видео на /v1/videos и /v1/videos/sync с Wan2.1-T2V-1.3B и Wan2.1-VACE-1.3B, синтез речи на /v1/audio/speech, аудиогенерация на /v1/audio/generate и мультимодальный чат на /v1/chat/completions. Для адаптации шаблона к другим поддерживаемым моделям изображений и видео AWS отсылает к той же документации контейнера.

Первоисточники

  1. AWS Machine Learning Blog — «Generate images and video with vLLM-Omni on SageMaker AI – Part 2» (28 сентября 2026)
  2. AWS Deep Learning Containers — «Multimodal Serving using vLLM-Omni DLC»
  3. Amazon SageMaker AI Developer Guide — «Asynchronous inference»