Articleaws.amazon.com·2026년 9월 28일·0

Generate images and video with vLLM-Omni on SageMaker AI – Part 2

Quick Summary

Amazon SageMaker AI에서 동일한 AWS vLLM Omni DLC로 FLUX.2 klein 4B의 실시간 이미지 생성과 Wan2.1 VACE 1.3B의 비동기 영상 생성을 연결하는 구현 사례다.

Generate images and video with vLLM-Omni on SageMaker AI – Part 2 관련 대표 이미지

🖼️ 인포그래픽

Generate images and video with vLLM-Omni on SageMaker AI – Part 2 내용을 설명하는 본문 이미지

🖼️ 4컷 인포그래픽

Generate images and video with vLLM-Omni on SageMaker AI – Part 2의 핵심 내용을 4단계로 요약한 인포그래픽
Generate images and video with vLLM-Omni on SageMaker AI – Part 2 핵심 내용을 4단계로 압축한 4컷 인포그래픽

💡 한 줄 요약

Amazon SageMaker AI에서 동일한 AWS vLLM-Omni DLC로 FLUX.2-klein-4B의 실시간 이미지 생성과 Wan2.1-VACE-1.3B의 비동기 영상 생성을 연결하는 구현 사례다.

📌 핵심 요약

  • 동일한 고정 버전 AWS vLLM-Omni DLC를 두 엔드포인트에 배포하고, SM_VLLM_MODEL로 FLUX.2-klein-4B와 Wan2.1-VACE-1.3B를 각각 로드한다. 이미지에는 실시간 추론을, 영상에는 SageMaker Asynchronous Inference를 사용한다.
  • FLUX.2-klein의 base64 PNG를 480×320 크기의 JPEG 데이터 URL로 변환해 동작 프롬프트와 함께 multipart 요청에 넣는다. Amazon S3에 요청을 업로드한 뒤 비동기 영상 엔드포인트를 호출하고, 결과 위치를 폴링해 MP4를 가져온다.
  • InvokeEndpointAsync의 인라인 Body 한도는 128,000바이트이며 Body와 InputLocation을 함께 사용할 수 없다. 샘플 요청은 이 한도보다 커서 InputLocation을 사용하며, 영상 기본 설정은 17프레임과 30 diffusion steps다. 4 steps는 원본 구도를 보존하지 못해 간단한 엔드포인트 동작 확인용으로만 권장된다.
  • 미국 동부 버지니아 북부 리전의 단일 검증에서 ml.g6.xlarge 이미지 엔드포인트 준비는 9분 30초, ml.g6e.xlarge 영상 엔드포인트 준비는 8분 40초였다. 웜 상태 이미지 응답은 4.7초, Wan VACE 모델 지연은 8.9초, CLI의 MP4 수신은 11.8초였으며 성능 벤치마크는 아니다.
  • 샘플은 CLI와 선택적 Streamlit 인터페이스를 제공한다. 실행에는 AWS 자격 증명, Amazon S3 접근이 가능한 실행 역할, 엔드포인트 생성·호출 권한과 인스턴스 할당량, Git, Python 3.11 이상이 필요하다. cleanup.py는 엔드포인트·구성·모델을 삭제하지만 Amazon S3 출력은 남기며, 실행 중인 GPU 엔드포인트에는 계속 비용이 발생한다.

🧩 주요 포인트

  1. 공통 AWS vLLM-Omni DLC와 개별 엔드포인트의 조합 → 서빙 스택의 차이를 줄이면서 모델별 인스턴스와 추론 방식을 선택할 수 있다.
  2. 이미지 직접 응답과 Amazon S3 기반 영상 요청·결과 전달 → 다음 단계에 필요한 이미지를 먼저 확보하고, 긴 영상 생성 동안 동기 연결을 유지할 필요를 줄인다. 비동기 선택은 모든 영상 모델의 규칙이 아니라 지연 시간·페이로드·클라이언트 상호작용에 따른 판단이다.
  3. ,000바이트 요청 제약, 30 diffusion steps의 기본값, 단일 검증 수치 → 요청 전달 방식·영상 구도 보존·성능 재현을 구분해 판단해야 하며, 실행 중인 GPU 엔드포인트의 비용은 별도로 관리해야 한다.

🧠 상세 정리

1. 텍스트에서 이미지와 영상으로 이어지는 구성

이 글은 Amazon SageMaker AI에서 텍스트 프롬프트로 정지 이미지를 만든 다음, 그 이미지와 동작 프롬프트를 입력해 짧은 영상으로 변환하는 과정을 설명한다. 이미지 생성에는 FLUX.2-klein-4B를, 이미지 조건부 영상 생성에는 Wan2.1-VACE-1.3B를 사용하며, 두 모델은 동일한 AWS vLLM-Omni Deep Learning Container를 기반으로 제공된다. AWS DLC는 AWS에서 학습과 추론에 필요한 프레임워크와 의존성을 묶고, 이 DLC는 추적되는 vLLM-Omni 릴리스와 SageMaker AI용 라우팅 미들웨어를 포함한다. vLLM-Omni는 vLLM의 범위를 텍스트 밖으로 넓혀 OpenAI 호환 API로 텍스트·오디오·이미지·영상을 처리하거나 생성하는 모델을 지원한다. 양방향 스트리밍을 이용한 실시간 음성을 다룬 Part 1에 이어, Part 2는 이미지의 직접 응답과 영상의 Amazon S3 기반 비동기 응답을 별도로 설명해 모델·페이로드·응답 방식의 차이를 드러낸다.

2. 공통 컨테이너와 분리된 엔드포인트

배포 스크립트는 동일한 고정 버전 컨테이너 이미지를 두 SageMaker AI 엔드포인트에 사용하고, SM_VLLM_MODEL 값을 달리해 각 모델을 로드한다. FLUX.2-klein 실시간 엔드포인트는 /v1/images/generations로, Wan VACE 비동기 엔드포인트는 /v1/videos/sync로 요청을 전달한다. SageMaker AI가 추론 요청을 보내는 진입점은 /invocations이며, DLC는 CustomAttributes 헤더를 읽어 선택된 vLLM-Omni 경로로 전달한다. 공통 이미지는 서빙 스택의 차이를 줄이고, 엔드포인트 분리는 각 모델의 작업에 적합한 인스턴스 유형과 추론 옵션을 선택할 수 있게 한다. 영상 요청은 업로드 전에 multipart 본문 전체를 구성하므로 Videos API에 전달되는 내용을 명확히 확인할 수 있고, 성공 응답과 호출 실패는 서로 다른 Amazon S3 접두사 아래 저장된다.

3. 실시간·비동기 선택과 인스턴스 조건

이미지 생성에는 다음 영상 요청을 구성하기 전에 결과를 직접 받아야 한다는 이유로 실시간 추론을 사용한다. 영상 생성은 상대적으로 오래 걸리고 이미지 조건부 multipart 페이로드를 전달하므로, SageMaker Asynchronous Inference가 요청을 대기열에 넣고 Amazon S3를 입출력 저장소로 사용하는 방식이 적용된다. 클라이언트는 하나의 동기 요청을 계속 열어 두는 대신 결과 위치를 폴링하지만, 글은 이 선택이 모든 영상 모델에 적용되는 규칙은 아니며 모델 지연 시간·페이로드·클라이언트 상호작용에 따라 판단해야 한다고 설명한다. 샘플은 이미지에 ml.g6.xlarge, 영상에 ml.g6e.xlarge라는 고정 인스턴스 유형을 사용한다. 실시간 이미지 엔드포인트에는 용량 인식 인스턴스 풀로 호환 유형의 우선순위를 지정할 수 있으나, 각 후보의 GPU 메모리와 성능 요건을 검증한 뒤 추가해야 하며 샘플의 비동기 영상 엔드포인트는 고정 유형을 유지한다.

4. 실행 준비와 배포 복구

실행 전에는 AWS CLI 또는 SDK용 자격 증명을 설정한 AWS 계정, 샘플 Amazon S3 버킷에 접근할 수 있는 SageMaker AI 실행 역할, 엔드포인트 생성·호출 권한이 필요하다. 선택한 리전에서 ml.g6.xlarge와 ml.g6e.xlarge의 엔드포인트 할당량을 확보하고 Git과 Python 3.11 이상도 준비해야 하며, 예제는 미국 동부 버지니아 북부 리전을 사용하고 GPU 배포 전 가격 검토를 안내한다. 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 tiling을 활성화하며, 시작 도중 로컬 AWS 자격 증명이 만료되면 갱신 후 --resume으로 다시 실행해 저장된 리소스를 재사용할 수 있다.

5. 이미지 변환과 비동기 영상 요청

generate.py는 이미지 프롬프트와 동작 프롬프트를 받아 이미지 생성부터 영상 수신까지 수행하며, 예제는 일출 무렵 해안 관측소를 만든 뒤 건물과 해안선을 보존하면서 카메라가 천천히 접근하도록 요청한다. FLUX.2-klein은 OpenAI 호환 JSON 안에 PNG를 base64로 반환하고, 공통 요청 도우미는 이를 목표 영상 크기인 480×320으로 조정해 JPEG로 인코딩한다. 변환된 이미지는 image_reference 필드의 JPEG 데이터 URL로 들어가며, 이 과정은 JSON에 담을 이미지 참조를 Videos API multipart 파서의 파트별 크기 제한 아래로 줄이기 위한 것이다. 완성된 multipart 요청을 Amazon S3에 올린 뒤 route=/v1/videos/sync로 비동기 호출하면, SageMaker AI는 결과와 실패 정보를 확인할 위치를 반환한다. 스크립트는 두 위치를 폴링하고 MP4를 검증해 outputs/에 저장하며, 이 요청은 InvokeEndpointAsync의 인라인 Body 한도인 128,000바이트보다 크므로 InputLocation을 사용한다. 더 작은 요청은 Body로 직접 전달할 수 있지만 Body와 InputLocation을 동시에 사용할 수는 없다.

6. 영상 기본값과 단일 실행 검증

영상 생성 기본값은 17프레임과 30 diffusion steps이며, 글은 4 steps를 빠른 엔드포인트 동작 확인에만 사용하도록 권장한다. 검토 과정에서 낮은 설정이 원본 구도를 보존하지 못했기 때문에, 단순한 호출 성공 여부와 결과 영상의 구성 보존을 구분해 해석해야 한다. 미국 동부 버지니아 북부 리전에서 수행한 한 차례 검증에서는 ml.g6.xlarge 이미지 엔드포인트가 9분 30초 만에, ml.g6e.xlarge 영상 엔드포인트가 8분 40초 만에 InService 상태가 됐다. 웜 상태의 기본 호출에서 이미지는 4.7초 만에 반환됐고, Wan VACE가 보고한 모델 지연은 8.9초였으며 CLI가 MP4를 가져오기까지는 11.8초가 걸렸다. 이 수치들은 엔드포인트 준비 시간, 모델 처리 지연, 클라이언트 결과 수신이라는 서로 다른 구간을 나타내며, 글은 단일 실행의 재현 확인 기준일 뿐 성능 벤치마크가 아니라고 명시한다.

7. Streamlit에서 결과 확인과 영상 생성

두 엔드포인트가 모두 InService에 도달하면 streamlit run app.py로 선택적 Streamlit 애플리케이션을 실행할 수 있다. 사용자는 이미지 프롬프트·이미지 크기·시드를 조정한 뒤 Generate image를 선택하고, 반환된 FLUX.2-klein 이미지를 먼저 확인한다. 이어 동작 프롬프트를 입력하고 프레임 수·초당 프레임 수·추론 스텝을 조정한 다음 Generate video를 선택해 Wan VACE 영상을 만든다. 글에 제시된 데모는 검증 실행에서 확보한 결과물을 재생하지만, 공개된 애플리케이션은 실제로 배포된 엔드포인트를 호출한다는 차이를 명시한다. 애플리케이션은 이미지와 영상 모두 표시하고 내려받을 수 있게 하며, CLI와 동일한 요청 도우미를 사용하므로 인터페이스가 달라져도 이미지 변환과 영상 요청 구성의 공통 흐름을 유지한다.

8. 리소스 정리와 적용 범위

작업이 끝나면 cleanup.py를 실행해 엔드포인트, 엔드포인트 구성, 모델을 삭제하며, 실행 중인 GPU 엔드포인트는 계속 비용을 발생시키므로 정리가 필요하다. 정리 스크립트는 결과 검토를 위해 Amazon S3 출력 접두사 아래 생성 객체를 남기므로, 산출물이 더 이상 필요하지 않을 때 해당 접두사도 별도로 삭제해야 한다. 이 사례의 결론은 하나의 AWS vLLM-Omni DLC 릴리스로 서로 다른 생성형 미디어 모델을 제공하면서, FLUX.2-klein 이미지는 실시간 응답으로 받고 Wan VACE 영상은 비동기 추론과 Amazon S3로 회수할 수 있다는 것이다. 공통 서빙 런타임이 여러 모델 계열을 지원하더라도 SageMaker AI의 응답 방식은 각 작업 특성에 맞게 선택한다는 구성이 핵심이다. 글은 코드 샘플을 실행한 뒤 vLLM-Omni DLC 문서와 SageMaker Asynchronous Inference 개발자 가이드를 검토해 이 패턴을 다른 지원 이미지·영상 모델에 적용하도록 안내한다.

🧾 핵심 주장 / 시사점

  • 서빙 컨테이너를 통일하는 것과 모델별 실행 자원을 분리하는 것은 양립할 수 있으며, 이 사례는 공통 런타임 위에서 서로 다른 추론 방식을 구성한다.
  • 이미지에서 영상으로 넘어가는 연결 단계에서는 모델 선택뿐 아니라 이미지 인코딩, multipart 파트 크기, 비동기 요청 전달 한도가 실제 구현을 좌우한다.
  • 낮은 추론 스텝의 호출 성공은 원본 구도 보존을 보장하지 않으며, 단일 실행 지연 수치도 일반적인 성능 보장으로 확대해석할 수 없다.

✅ 액션 아이템

  • AWS 자격 증명, Amazon S3 접근 실행 역할, 엔드포인트 생성·호출 권한과 ml.g6.xlarge·ml.g6e.xlarge 할당량을 확인한 뒤 두 모델 배포 진행.
  • 128,000바이트를 넘는 영상 요청에 InputLocation을 사용하고, 17프레임·30 diffusion steps 기본 설정으로 이미지 구도 보존과 영상 수신 결과 확인.
  • 사용 완료 후 cleanup.py로 GPU 엔드포인트·구성·모델을 삭제하고, 보존 필요가 없는 Amazon S3 출력도 별도 삭제.

❓ 열린 질문

  • 적용할 작업의 지연 시간·페이로드·클라이언트 상호작용에도 SageMaker Asynchronous Inference를 이용한 영상 생성 방식이 적합한가?
  • 17프레임·30 diffusion steps 설정은 사용할 이미지와 동작 프롬프트에서도 원하는 원본 구도를 보존하는가?
  • 동일 조건의 반복 실행에서도 이미지 응답 4.7초와 CLI의 MP4 수신 11.8초가 재현되는가?

관련 문서

공통 태그와 주제 흐름을 기준으로 같이 보면 좋은 문서를 이어서 제안합니다.