Gere imagens e vídeos com vLLM-Omni no SageMaker AI – Parte 2

Da imagem ao vídeo com um único contêiner no SageMaker AI

A AWS publicou a segunda parte da série dedicada ao vLLM-Omni no Amazon SageMaker AI, e desta vez o foco é geração de mídia: você parte de um prompt de texto, gera uma imagem estática e depois anima essa imagem em um curto vídeo. Tudo isso usando dois endpoints implantados a partir do mesmo Contêiner de Aprendizado Profundo (DLC) da AWS.

Para quem perdeu a primeira parte, ela abordava streaming bidirecional de voz em tempo real. A Parte 1 da série usa o vLLM-Omni com SageMaker AI para aplicações de fala em tempo real. Já esta Parte 2 demonstra dois padrões distintos de inferência — tempo real e assíncrona — aplicados a modelos de imagem e vídeo.

O que é o vLLM-Omni e por que ele importa aqui

Os AWS Deep Learning Containers empacotam frameworks e dependências prontas para treinamento e inferência na AWS. O AWS vLLM-Omni DLC vai além: ele rastreia as versões do vLLM-Omni e adiciona um middleware de roteamento específico para o SageMaker AI.

O vLLM-Omni estende o vLLM tradicional — que normalmente lida apenas com texto — para modelos que processam ou geram texto, áudio, imagens e vídeo, tudo por meio de APIs compatíveis com o padrão OpenAI. Isso significa que você pode usar chamadas de API familiares para acionar modelos multimodais sem precisar reescrever sua lógica de integração.

Visão geral da solução

A solução implanta a mesma imagem do AWS vLLM-Omni DLC em dois endpoints do SageMaker AI. O script de implantação altera a variável SM_VLLM_MODEL para carregar o FLUX.2-klein-4B em um endpoint e o Wan2.1-VACE-1.3B no outro. Usar uma imagem de contêiner comum reduz a variação na pilha de serviço, enquanto endpoints separados permitem que cada modelo use o tipo de instância e a opção de inferência mais adequados à sua carga de trabalho.

O fluxo funciona assim:

  • Um endpoint de inferência em tempo real do SageMaker AI executa o FLUX.2-klein e roteia requisições para /v1/images/generations.
  • Um endpoint de Inferência Assíncrona do SageMaker executa o Wan VACE e roteia requisições para /v1/videos/sync.
  • O Amazon S3 armazena tanto a requisição multipart do vídeo quanto o arquivo MP4 gerado.

A aplicação envia o prompt de imagem ao FLUX.2-klein e recebe um arquivo PNG codificado em base64. Em seguida, redimensiona a imagem para as dimensões do vídeo, converte para JPEG em formato de URL de dados e insere essa referência na requisição do Wan VACE. A Inferência Assíncrona do SageMaker lê a requisição multipart do Amazon S3 e grava o MP4 no local de saída retornado.

Por que usar inferência em tempo real para imagem e assíncrona para vídeo?

A escolha de padrões de inferência diferentes para cada modelo não é arbitrária. A geração de imagem usa inferência em tempo real porque a aplicação precisa da resposta diretamente antes de construir a próxima requisição — o PNG gerado é o insumo para o passo seguinte.

Já a geração de vídeo é uma operação mais demorada e carrega um payload multipart condicionado à imagem. A Inferência Assíncrona do SageMaker enfileira a requisição e usa o Amazon S3 para entrada e saída, permitindo que o cliente consulte o local do resultado em vez de manter uma requisição síncrona aberta. Vale reforçar: isso é uma escolha de arquitetura para esta carga de trabalho específica, não uma regra universal para todos os modelos de vídeo.

Pré-requisitos

Antes de começar, você vai precisar de:

  • Uma conta AWS com credenciais configuradas para o CLI da AWS ou um SDK.
  • Uma role de execução do SageMaker AI com acesso ao bucket Amazon S3 do exemplo.
  • Permissão para criar e invocar endpoints do SageMaker AI.
  • Cota de endpoint para ml.g6.xlarge e ml.g6e.xlarge na região AWS selecionada.
  • Git e Python 3.11 ou superior.

O exemplo usa a região Leste dos EUA (Norte da Virgínia). Revise os preços do SageMaker AI antes de implantar os endpoints com GPU.

Passo a passo: gerando a imagem e animando-a

1. Clone o repositório

Clone o repositório de exemplos e acesse o diretório do exemplo de imagem e vídeo com vLLM-Omni:

git clone https://github.com/aws-samples/sagemaker-genai-hosting-examples.git
cd sagemaker-genai-hosting-examples/03-features/vllm-omni-image-video

2. Instale as dependências Python

Crie um ambiente virtual e instale os requisitos do exemplo:

python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt

3. Implante os endpoints de imagem e vídeo

Configure a role de execução do SageMaker AI e execute o script de implantação. O script fixa a versão omni-sagemaker-cuda-v1.6, cria um endpoint de imagem em tempo real, cria um endpoint de vídeo assíncrono e salva os nomes dos recursos em .vllm_omni_media_state.json:

export SAGEMAKER_ROLE_ARN=<your-sagemaker-execution-role-arn>
python deploy.py \
  --role-arn "$SAGEMAKER_ROLE_ARN" \
  --region us-east-1

A variável de ambiente SM_VLLM_MODEL indica a cada contêiner qual modelo carregar. O endpoint de vídeo ativa o tiling do Codificador Variacional Automático (VAE) para reduzir o pico de memória durante a decodificação de vídeo. Se as credenciais AWS locais expirarem enquanto um endpoint está sendo iniciado, atualize-as e reexecute o comando com --resume — o script reutilizará os recursos já criados.

4. Gere uma imagem e anime-a

Execute o fluxo de linha de comando de ponta a ponta com um prompt de imagem e um prompt de movimento:

python generate.py \
  --image-prompt "Cinematic photograph of a coastal observatory at sunrise" \
  --video-prompt "Slow camera push-in toward the coastal observatory; preserve the building and coastline"

O FLUX.2-klein retorna uma resposta JSON compatível com OpenAI contendo o PNG como dados em base64. O helper de requisição compartilhado redimensiona a imagem para as dimensões alvo do vídeo e a codifica como JPEG antes de construir a requisição do Wan VACE:

reference_image = prepare_video_reference(
    image_bytes,
    width=480,
    height=320,
)
fields = {
    "prompt": video_prompt,
    "image_reference": json.dumps(
        {"image_url": image_data_url(reference_image, "image/jpeg")}
    ),
    "num_frames": "17",
    "num_inference_steps": "30",
}
body, content_type = encode_multipart_formdata(fields)

Essa conversão mantém a referência de imagem segura para JSON abaixo do limite de tamanho por parte do parser multipart da API de Vídeos. O exemplo faz upload da requisição completa para o Amazon S3 e a submete ao endpoint assíncrono com route=/v1/videos/sync. O SageMaker AI retorna os locais de saída e falha. O script consulta esses locais antes de validar e salvar o MP4 em outputs/.

Para requisições menores, o InvokeEndpointAsync também aceita dados de requisição inline pelo parâmetro Body até 128.000 bytes. Use Body ou InputLocation, nunca os dois juntos. Este fluxo usa InputLocation porque a requisição multipart condicionada à imagem é maior que o limite de 128.000 bytes do parâmetro inline Body.

As configurações padrão de vídeo usam 17 frames e 30 passos de difusão. Use quatro passos apenas para um teste rápido de validação do endpoint, pois essa configuração reduzida não preservou bem a composição da fonte nos testes realizados.

Em uma execução de validação na região Leste dos EUA (Norte da Virgínia), o endpoint de imagem ml.g6.xlarge ficou ativo em 9 minutos e 30 segundos. O endpoint de vídeo ml.g6e.xlarge ficou ativo em 8 minutos e 40 segundos. Uma invocação padrão aquecida retornou a imagem em 4,7 segundos. O Wan VACE reportou 8,9 segundos de latência do modelo, e o CLI recuperou o MP4 em 11,8 segundos. Esses valores são pontos de referência de reprodução, não benchmarks de desempenho.

5. Execute a aplicação Streamlit

Inicie a aplicação Streamlit após ambos os endpoints atingirem o status InService:

streamlit run app.py

Na interface, você pode atualizar o prompt de imagem, o tamanho da imagem ou o seed e então gerar a imagem. Após revisar o resultado do FLUX.2-klein, insira um prompt de movimento e ajuste a contagem de frames, os frames por segundo ou os passos de inferência antes de gerar o vídeo. A aplicação invoca os endpoints implantados e usa os mesmos helpers de requisição do fluxo de linha de comando.

Tipos de instância e pools de capacidade

O exemplo usa os tipos de instância fixos ml.g6.xlarge e ml.g6e.xlarge. Para o endpoint de imagem em tempo real, os pools de instâncias com consciência de capacidade do SageMaker podem listar tipos de instância compatíveis em ordem de prioridade. Adicione um pool somente após validar cada tipo candidato quanto aos requisitos de memória de GPU e desempenho do modelo de imagem. O exemplo mantém o endpoint de vídeo assíncrono em um tipo de instância fixo.

Limpeza dos recursos

Ao terminar, delete os endpoints, as configurações de endpoint e os modelos com o script de limpeza:

python cleanup.py

O script de limpeza mantém os objetos gerados sob o prefixo de saída do Amazon S3 para revisão. Delete esse prefixo quando não precisar mais dos artefatos. Lembre-se: um endpoint GPU em execução continua gerando cobranças.

O que esse padrão demonstra

A solução mostra como um único runtime de serviço compartilhado pode suportar diferentes famílias de modelos enquanto o SageMaker AI aplica o padrão de resposta que melhor se adequa a cada carga de trabalho. Usar o mesmo DLC para dois modelos com comportamentos muito diferentes — um que retorna resultado imediato e outro que processa de forma assíncrona — simplifica a operação sem sacrificar a flexibilidade.

Para explorar mais, a AWS disponibiliza o código de exemplo completo, a documentação do vLLM-Omni DLC e o guia do desenvolvedor de Inferência Assíncrona do SageMaker para adaptar o padrão a outros modelos de imagem e vídeo suportados.

Recursos adicionais

Fonte

Generate images and video with vLLM-Omni on SageMaker AI – Part 2 (https://aws.amazon.com/blogs/machine-learning/generate-images-and-video-with-vllm-omni-on-sagemaker-ai-part-2/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *