AWS 기술 블로그

이미지 비디오 Multi-modal 추론 모델, LLaVA-NeXT-Video 모델을 Amazon SageMaker에 배포하기

LLaVA-NeXT-Video 모델 소개

LLaVA-NeXT-Video 모델은 LLaVA-NeXT의 후속 모델로, 비디오 이해 능력을 강화한 대형 멀티모달 모델 (Large Multimodal Model, LMM)입니다. 이 모델은 주로 텍스트-이미지 데이터로 학습된 LLaVA-NeXT를 기반으로 하여 비디오 데이터에 대한 성능을 향상시키기 위해 개발되었습니다.

주요 특징

  • 제로샷(Zero-shot) 비디오 표현 능력: LLaVA-NeXT-Video는 AnyRes 기술을 활용하여 고해상도 이미지를 여러 이미지로 분할하고, 이를 사전 학습된 비전 트랜스포머 (Vision Transformer, ViT)에 입력합니다. 이 기술은 비디오를 여러 프레임으로 간주하여 자연스럽게 일반화할 수 있으며, 이를 통해 이미지 전용으로 학습된 모델이 비디오 작업에서도 강력한 성능을 발휘할 수 있도록 합니다.
  • 길이 일반화: 선형 스케일링 (Linear scaling) 기술을 통해 영상의 길이를 일반화하여, “max_token_length”의 한계를 극복하고 긴 비디오도 효과적으로 처리할 수 있습니다.
  • 강력한 비디오 이해 능력: LLaVA-NeXT-Video는 Supervised Fine-Tuning (SFT)을 통해 비디오 데이터에 대해 추가 학습을 수행하여, 기존의 오픈 소스 LMM보다 뛰어난 비디오 이해 능력을 보여줍니다. 또한, Direct Preference Optimization (DPO)을 통해 AI 피드백을 사용하여 모델의 성능을 더욱 향상시켰습니다.

LLaVA-NeXT-Video는 이러한 기술들을 통해 비디오 이해 작업에서 강력한 성능을 발휘하며, 특히 제로샷(Zero-shot) 모드에서 기존의 오픈 소스 모델들을 능가하는 성과를 보이고 있습니다.

다음은 LLaVA-NeXT-Video 모델의 비디오 이해 능력을 보여주는 예제입니다.

(출처: https://huggingface.co/datasets/raushan-testing-hf/videos-test/resolve/main/sample_demo_1.mp4)

위에 있는 비디오와 What do you see in this video? 라는 프롬프트를 LLaVA-NeXT-Video 모델에 입력하면, 다음과 같이 답변을 받게 됩니다.

USER: What do you see in this video?
ASSISTANT: I see a baby reading a book.

첫번째에 이어서 Why is it funny? 라는 프롬프트를 입력 하면, 아래와 같은 답변을 받을 수 있습니다.

USER: Why is it funny?
ASSISTANT: It is funny because the baby is wearing a book like a superhero costume,
           and the person's hand is making the baby look silly by holding the "book" 
           over the baby's face while they read, which creates a cute and humorous
           visual effect. The baby seems to be enjoying the reading experience,
           which adds to the humor.

여기서 놀라운 점은 “Why is it funny?” 라는 사용자의 질문에 LLaVA-NeXT-Vidoe 모델이 비디오의 내용을 이해하고, 입력된 비디오에서 재미있는 장면들을 언급 하면서, 적절한 답변을 해주고 있다는 점입니다.

이러한 LLaVA-NeXT-Video 모델을 사용하기 위해서 AWS에 다양한 방식으로 배포 가능합니다. 이 블로그 포스팅에서는 ML 모델 추론 서비스 구축을 위한 완전 관리형 서비스인 Amazon SageMaker EnpointAWS Cloud Development Kit (CDK)를 사용하여 LLaVA-NeXT-Video 모델을 호스팅하는 방법에 대해 자세히 설명하겠습니다.

AWS CDK 프로젝트 디렉토리 구조 및 주요 파일 설명

먼저 LLaVA-NeXT-Video 모델을 SageMaker 실시간 추론 엔드포인트 (Real-time Inference Endpoint)에 배포 하기 위한 AWS CDK 프로젝트의 디렉토리 구조와 주요 코드에 대해서 살펴보겠습니다.

이 CDK 프로젝트의 전체 코드는 GitHub 리포지토리에서 확인할 수 있습니다.

./
├── README.md
├── app.py
├── cdk.context.json
├── cdk.json
├── cdk_stacks
│   ├── __init__.py
│   ├── sm_llava_next_video_realtime_endpoint.py
│   └── sm_realtime_endpoint_autoscaling.py
├── requirements.txt
├── source.bat
└── src
    └── python
        └── code
            ├── inference.py
            └── requirements.txt

디렉토리 구조 설명

  • app.py: CDK 애플리케이션의 진입점 스크립트(Entrypoint script); CDK 스택(Stack)을 인스턴스화하고 애플리케이션을 구성함
  • cdk_stacks: AWS 리소스와 속성을 정의한 CDK 스택(Stack)을 정의하는 파일들이 있는 폴더
    • __init__.py: Python 패키지 정의 파일
    • sm_llava_next_video_realtime_endpoint.py: SageMaker 실시간 추론 엔드포인트 CDK 스택(Stack) 정의 파일
    • sm_realtime_endpoint_autoscaling.py: SageMaker 실시간 추론 엔드포인트 자동 확장 (AutoScaling) 정책을 위한 CDK 스택 정의 파일
  • context.json: CDK 애플리케이션에서 사용되는 문맥 정보 (Context)를 키-값(Key-Value) 형식으로 저장한 파일; cdk.json과 같은 일종의 설정 파일
  • cdk.json: CDK 애플리케이션 설정 파일; CDK CLI에게 애플리케이션 실행 방법을 알려줌
  • requirements.txt: CDK 프로젝트의 Python 의존성을 명시하는 파일
  • src/python/code: 사용자 정의 추론 스크립트 파일(inference.py)과 추론 스크립트 실행에 필요한 Python 패키지 목록(requirements.txt)을 정의한 파일이 있는 폴더

AWS CDK를 이용한 Amazon SageMaker Endpoint 배포 방법

PyTorch Deep Learning Container (DLC) 와 Custom 모델을 이용한 배포

SageMaker Endpoint에 사전 학습된 모델 뿐만 아니라, 사전 학습된 모델을 미세 조정(fine-tuning)한 custom 모델을 배포할 수 있습니다.
또한, 사용자가 정의한 추론 스크립트 모델과 함께 SageMaker Endpoint에 배포할 수 있습니다.

이 CDK 프로젝트에서는 Hugging Face에서 제공하는 사전 학습된 오픈 소스 LLaVA-NeXT-Video 모델과 사용자 정의 추론 스크립트를 SageMaker Endpoint에 함께 배포합니다. 모델과 함께 추론 스크립트를 배포하기 위해서 모델과 추론 스크립트를 tar.gz 파일 형식으로 모델 아티팩트(model artifacts)를 생성해서 S3에 저장합니다. 그리고, 모델 아티팩트가 저장된 S3 위치 정보와 모델 추론용 컨테이너를 이용해서 SageMaker Endpoint를 생성합니다.

다음은 LLaVA-NeXT-Video 모델과 추론 스크립트를 S3에 업로드한 후에 PyTorch Inference 컨테이너를 이용해서 SageMaker Endpoint에 배포하는 CDK 스택(Stack)의 주요 코드입니다. CDK 스택은 AWS 리소스를 정의한 Python 클래스입니다.


model_id = 'llava-hf/LLaVA-NeXT-Video-7B-hf'
model_data_url = f's3://{bucket}/{model_artifacts}'

container = DeepLearningContainerImage.from_deep_learning_container_image(
    'pytorch-inference',
    '2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker'
)

sagemaker_endpoint = CustomSageMakerEndpoint(
    self,
    'PyTorchSageMakerEndpoint',
    model_id=model_id,
    instance_type=SageMakerInstanceType.ML_G5_2_XLARGE,
    container=container,
    endpoint_name=sagemaker_endpoint_name,
    environment={
        'HF_MODEL_ID': model_id,
 
        # The pipeline tag "video-to-text" is not in the official list.
        # Therefore, set "image-to-text" to task
        'HF_TASK': 'image-to-text',

        # In order to avoid timeout when torchserver starting.
        'SAGEMAKER_TS_RESPONSE_TIMEOUT': '600'
    },
    model_data_url=model_data_url
)

코드 설명

  • CustomSageMakerEndpoint: 사용자 정의 모델을 배포하기 위한 AWS CDK 구성 요소(Construct)입니다.
  • self: 현재 CDK 스택(Stack) 클래스의 인스턴스를 참조합니다.
  • 'PyTorchSageMakerEndpoint': 리소스의 논리적 이름입니다.
  • model_id: 사용자 정의 모델의 식별자(ID)입니다. (예: llava-hf/LLaVA-NeXT-Video-7B-hf)
  • instance_type: 모델을 배포할 EC2 인스턴스 유형입니다. ML_G5_2_XLARGE인스턴스 유형은 GPU 가속을 지원하는 g5.2xlarge 인스턴스입니다.
  • container: 모델을 실행할 컨테이너 이미지입니다. 여기서는 PyTorch Inference 컨테이너 (pytorch-inference:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker)를 사용합니다.
  • endpoint_name: 생성될 SageMaker Endpoint의 이름입니다.
  • environment: 모델 실행 시 사용할 환경 변수입니다. 환경 변수는 사용자 정의 모델의 요구사항에 맞게 설정합니다.
  • model_data_url: Amazon S3에 저장된 모델 아티팩트의 URL입니다.

모델 아티팩트 (model.tar.gz) 저장 구조

LLaVA-NeXT-Video 모델 아티팩트 저장 구조는 다음과 같은 일반적인 PyTorch 모델 아티팩트 저장 구조를 따릅니다.

model/
├── model.pth
└── code
    ├── inference.py
    └── requirements.txt
  • model.pth: PyToch 모델 파일; 모델 파일들은 디렉토리의 최상위에 있어야 함.
  • code: 사용자 정의 추론 스크립트를 저장하는 폴더
    • inference.py: 추론 서버 스크립트
    • requirements.txt: (선택 사항) 추론 서버에 설치할 Python 패키지 목록

하지만, 이 프로젝트에서는 SageMaker Endpoint에서 사용자 정의 추론 스크립트(inference.py)가 실행될 때, LLaVA-NeXT-Video 모델을 Hugging Face Hub에서 다운로드 받기 때문에 모델 아티팩트(model.tar.gz)을 만들 때, 모델 파일을 포함시키지 않았습니다.

inference.py 파일에는 모델 서빙을 위해서 모델 로드(model_fn), 입력 데이터 처리(input_fn), 예측(predict_fn), 출력 데이터 처리(output_fn)를 수행하는 함수들을 포함합니다.

inference.py에서 제공하는 주요 함수들

(1) model_fn(model_dir)
model_fn 함수는 모델을 로드하는 역할을 합니다. 이 함수는 모델이 저장된 디렉토리 경로를 인자로 받아 모델 객체를 반환합니다.


def model_fn(model_dir):
    # 모델 로드 로직
    model = ...  # 모델 로드
    return model

(2) input_fn(input_data, content_type)
input_fn 함수는 입력 데이터를 처리하는 역할을 합니다. 이 함수는 원시 입력 데이터와 콘텐츠 타입을 인자로 받아 모델이 예측을 수행할 수 있는 형식으로 데이터를 변환합니다.


def input_fn(input_data, content_type):
    # 입력 데이터 처리 로직
    processed_data = ...  # 데이터 처리
    return processed_data

(3) predict_fn(data, model)
predict_fn 함수는 예측을 수행하는 역할을 합니다. 이 함수는 처리된 입력 데이터와 로드된 모델을 인자로 받아 예측 결과를 반환합니다.


def predict_fn(data, model):
    # 예측 로직
    predictions = model(data)
    return predictions

(4) output_fn(prediction, accept)
output_fn 함수는 예측 결과를 반환하는 역할을 합니다. 이 함수는 예측 결과와 응답 콘텐츠 타입을 인자로 받아 클라이언트에게 반환할 형식으로 데이터를 변환합니다.


def output_fn(prediction, accept):
    # 출력 데이터 처리 로직
    response = ...  # 데이터 변환
    return response

ℹ️ inference.py의 주요 함수에 대해서는 참고 자료 [9], [10]에서 자세한 내용을 확인할 수 있습니다.

이 프로젝트에서는 LLaVA-NeXT-Video 모델을 로드하는 model_fn 함수에서 환경 변수(HF_MODEL_ID)로 전달된 Hugging Face 모델 ID를 이용해서 Hugging Face Hub에서 미리 학습된 모델과 입력 데이터 처리를 위한 프로세서를 다운로드 한 후 초기화 합니다.


import os
import torch
from transformers import (
  BitsAndBytesConfig,
  LlavaNextVideoForConditionalGeneration,
  LlavaNextVideoProcessor
)

def model_fn(model_dir, context=None):
  # 환경 변수에서 모델 ID를 가져옴
  model_id = os.environ['HF_MODEL_ID']
  
  # 모델을 4비트 양자화로 로드하기 위한 설정을 정의
  quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16
  )

  # 사전 학습된 비디오 프로세서를 로드하여 입력 데이터를 처리할 준비를 함
  processor = LlavaNextVideoProcessor.from_pretrained(model_id)
  
  # 사전 학습된 비디오 생성 모델 로드 및 양자화 설정 적용
  model = LlavaNextVideoForConditionalGeneration.from_pretrained(
    model_id,
    quantization_config=quantization_config,
    device_map='auto'
  )

  # 모델의 특정 가중치들을 공유하여 메모리 사용을 최적화
  model.tie_weights()

  return model, processor

ℹ️ 주요 클래스에 대한 설명

  • BitsAndBytesConfig: 이 클래스는 모델을 양자화(Quantization)하여 메모리 사용량을 줄이고 연산 속도를 높이기 위한 설정을 정의하는 데 사용됩니다. 이 클래스는 특히 4비트 및 8비트 양자화를 지원합니다. 주요 파라미터는 다음과 같습니다:
    • load_in_4bit: 4비트 양자화를 활성화합니다.
    • bnb_4bit_compute_dtype: 4비트 양자화 연산에 사용할 데이터 타입을 설정합니다. 예를 들어, float16이 사용될 수 있습니다.
    • bnb_4bit_quant_type: 양자화 유형을 설정합니다. 기본값은 fp4입니다.
  • LlavaNextVideoProcessor: 이클래스는 비디오와 이미지 데이터를 텍스트 데이터와 결합하여 모델 입력으로 사용할 수 있도록 준비하기 위한 전처리기를 제공합니다. 이 클래스는 비디오 프로세서, 이미지 프로세서 및 토크나이저를 결합하여 단일 프로세서로 작동합니다. 주요 기능은 다음과 같습니다:
    • video_processor: 비디오 데이터를 처리하는 데 사용됩니다.
    • image_processor: 이미지 데이터를 처리하는 데 사용됩니다.
    • tokenizer: 텍스트 데이터를 토큰화하는 데 사용됩니다.
  • LlavaNextVideoForConditionalGeneration: 이클래스는 조건부 비디오 생성 모델을 정의합니다. 이 모델은 비디오나 이미지 데이터를 이해하고 처리하는 역할을 비전 백본(vision backbone)과 텍스트 데이터를 처리하고 생성하는 언어 모델로 구성되어 있으며, 주어진 조건(예: 텍스트 프롬프트)에 따라 비디오를 생성할 수 있습니다. 주요 함수는 다음과 같습니다:
    • from_pretrained: 사전 학습된 모델을 로드합니다.
    • tie_weights: 모델의 특정 가중치를 공유하여 메모리 사용을 최적화 합니다.

LLaVA-NeXT-Video 모델 배포 하기

사전 준비 사항

CDK 프로젝트를 배포하기 위해서 아래와 같이 준비합니다.


aws configure --profile [your-profile]
AWS Access Key ID [None]: xxxxxx
AWS Secret Access Key [None]:yyyyyyyyyy
Default region name [None]: us-east-1
Default output format [None]: json

ℹ️ region name은 이 CDK 프로젝트를 배포할 AWS Region으로 설정합니다.

CDK 프로젝트 배포 순서는 다음과 같습니다.

  1. 배포 환경 설정
  2. 모델 아티팩트(tar.gz) 준비
  3. CDK 컨텍스트 (contex.json) 설정
  4. 배포

1. 배포 환경 설정

이 CDK 프로젝트의 리포지토리는 표준 Python 프로젝트로 구조화되어 있습니다. CDK 프로젝트에는 CDK 명령어로 앱(App)을 실행하는 방법을 지시하는 설정 파일 (cdk.json)이 포함되어 있습니다.

Step 1) Git 리포지토리에서 코드를 다운로드:


git clone --depth=1 https://github.com/aws-samples/aws-kr-startup-samples.git
cd aws-kr-startup-samples
git sparse-checkout init --cone
git sparse-checkout set machine-learning/sagemaker/llava-next-video-model-on-sagemaker-endpoint/sagemaker-realtime-inference
cd machine-learning/sagemaker/llava-next-video-model-on-sagemaker-endpoint/sagemaker-realtime-inference

Step 2) Python virtualenv를 이용하여 가상 환경을 구성하고 필요한 Python 패키지를 설치:


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

2. 모델 아티팩트(model.tar.gz) 준비

모델을 Amazon SageMaker에 호스팅하기 위해 먼저 모델 아티팩트를 저장해야 합니다. 모델 아티팩트는 모델 파라미터, 설정 파일, 전처리 컴포넌트, 메타데이터 등을 포함합니다.

Step 1) 모델 아티팩트 디렉토리 생성:


mkdir -p model

Step 2) 모델 아티팩트를 model.tar.gz로 압축:


cp -rp src/python/code model
tar -czf model.tar.gz -C model .

ℹ️ 사용자 정의 추론 스크립트(inference.py)가 실행될 때, LLaVA-NeXT-Video 모델을 다운로드 받기 때문에 모델 아티팩트(model.tar.gz)을 만들 때, 모델 파일 없이 모델 아티팩트를 생성합니다.

Step 3) 모델 아티팩트(model.tar.gz)를 S3에 업로드:


export MODEL_URI="s3://<bucket_name>/<key_prefix>/model.tar.gz"
aws s3 cp model.tar.gz ${MODEL_URI}

ℹ️ 이 CDK 프로젝트에서는 cdklabs.generative-ai-cdk-constructs 를 이용해서 SageMaker Endpoint를 생성합니다.
이 라이브러리는 SageMaker Endpoint 생성에 필요한 모델 아티팩트(model.tar.gz )가 sagemaker 또는 SageMaker라는 단어가 포함된 s3의 버킷에 저장되었다고 가정하기 때문에 s3의 bucket_name은 반드시 sagemaker 또는 SageMaker 라는 단어를 포함해야 합니다. (예: sagemaker-us-east-1-123456789012, SageMaker-us-east-1-123456789012)

3. CDK 컨텍스트 설정

배포에 필요한 설정들을 cdk.context.json 파일에 저장합니다.


{
  "model_id": "llava-hf/LLaVA-NeXT-Video-7B-hf",
  "model_data_source": {
    "s3_bucket_name": "sagemaker-us-east-1-123456789012",
    "s3_object_key_name": "llava-next-video-7b-hf/model.tar.gz"
  },
  "dlc_image_info": {
    "repository_name": "pytorch-inference",
    "tag": "2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker"
  }
}

cdk.context.json 파일 설정은 Amazon SageMaker에서 LLaVA-NeXT-Video 모델을 실시간 추론 엔드포인트에 호스팅하기 위해 필요한 구성 정보를 포함합니다. 이 파일은 CDK 애플리케이션이 실행될 때 필요한 컨텍스트(Context)를 제공합니다. 각 필드의 역할은 다음과 같습니다:

  • model_id: 배포할 모델의 식별자(ID). (예: llava-hf/LLaVA-NeXT-Video-7B-hf)
  • model_data_source: 모델 아티팩트가 저장된 S3 버킷과 객체 키.
    • s3_bucket_name: S3 버킷 이름. (예: sagemaker-us-east-1-123456789012)
    • s3_object_key_name: S3 객체 키 경로. (예: llava-next-video-7b-hf/model.tar.gz)
  • dlc_image_info: SageMaker에서 사용할 딥 러닝 컨테이너 이미지 정보.
    • repository_name: Docker 이미지 리포지토리 이름. (예: pytorch-inference)
    • tag: Docker 이미지 태그. (예: 3.0-gpu-py311-cu121-ubuntu20.04-sagemaker)

cdk.context.json 파일은 CDK 애플리케이션이 CloudFormation 템플릿을 생성하고 배포할 때 참조됩니다.

4. 배포

CDK 부트스트래핑:

CDK 부트스트래핑은 에서 사용할 AWS 환경을 준비하는 프로세스입니다. 부트스트래핑은 CDK에서 사용하는 특정 AWS 리소스를 사용자 AWS 환경에 프로비저닝합니다.

ℹ️ CDK를 처음 실행하는 경우라면, CDK스택을 배포하기 전에 먼저 AWS 환경을 부트스트랩 해야 합니다.


export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
export CDK_DEFAULT_REGION=$(aws configure get region)
cdk bootstrap

CloudFormation 템플릿 생성및 CDK 스택(Stack) 배포:


export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
export CDK_DEFAULT_REGION=$(aws configure get region)
cdk synth --all
cdk deploy --require-approval never --all

(선택 사항) CDK 스택 목록 확인:

배포될 CDK 스택의 전체 목록은 cdk list 명령어를 이용해서 확인할 수 있습니다.


cdk list

ℹ️ CDK 명령어에 대한 자세한 설명은 AWS CDK CLI Reference에서 확인할 수 있습니다.

ℹ️ AWS CDK는 스택(Stack)이라는 단위로 AWS 리소스와 속성을 정의합니다. 배포 시에는 스택(Stack) 단위로 프로비저닝 됩니다.

LLaVA-NeXT-Video 모델을 사용한 이미지, 비디오 분석 실행 예제

배포가 완료되면, Amazon SageMaker Studio에서 예제 Jupyter 노트북을 이용해서 LLaVA-NeXT-Video 모델을 호출하고, 그 결과를 확인할 수 있습니다.

다음은 LLaVA-NeXT-Video 모델 호출 예제 입니다.

1. 예제 데이터 및 추론 실행 결과

(1) 비디오 (karate_video_url)

(출처: https://huggingface.co/datasets/raushan-testing-hf/videos-test/resolve/main/karate.mp4)

USER: What do you see in this video? 프롬프트 실행 결과

ASSISTANT: The video shows a person dressed in a white karate gi performing various
           techniques, including kicks and hand strikes. The person is wearing
           a karate uniform and appears to be practicing in a training area with
           natural light coming through the windows. The video is taken from
           a stationary position, and there is a sense of focus and 
           discipline present in the way the individual performs the techniques.
           The environment looks like a dojo or training area specifically designed
           for martial arts.

(2) 이미지1 (image_snowman_url)

(출처: https://huggingface.co/microsoft/kosmos-2-patch14-224/blob/main/snowman.jpg)

USER: What do you see in this image? 프롬프트 실행 결과

ASSISTANT: The image features a snowman sitting in front of a small, open fire,
           made up of various items typically used for starting fires such as
           kindling and a firelighter like matches or a lighter, which suggests
           it's preparing to light a larger bonfire. The snowman is wearing a hat
           and a scarf, and has a happy expression, with its arms resting
           comfortably on its knees.

(3) 이미지 2 (image_stopsign_url)

(출처: http://farm3.staticflickr.com/2249/2511051084_5c8d0e8de1_z.jpg)

 USER: What color is the sign?  프롬프트 실행 결과

ASSISTANT: The sign is red with white letters.

2. 추론 코드 설명

다음은 SageMaker Endpoint를 사용하여 예제 이미지와 비디오 데이터에 대한 질문과 답변(Q&A)을 수행하는 Python 코드의 주요 부분입니다.

(1) SageMaker Endpoint 생성

SageMaker Endpoint에 배포된 LLaVA-NeXT-Video 모델을 사용하기 위해서 먼저 SageMaker의 Predictor 클래스를 사용하여 예측을 수행할 엔드포인트를 생성합니다. 이 엔드포인트는 JSON 형식의 입력 데이터를 받아서 처리한 후에, 출력 결과 역시 JSON으로 반환합니다.


from sagemaker import Predictor
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer


serializer = JSONSerializer()
deserializer = JSONDeserializer()

predictor = Predictor(
    endpoint_name=endpoint_name,
    serializer=serializer,
    deserializer=deserializer
)
  • Predictor: SageMaker에서 예측을 수행하는 클래스입니다.
  • JSONSerializer: 데이터를 JSON 형식으로 직렬화합니다.
  • JSONDeserializer: JSON 형식의 데이터를 역직렬화합니다.
  • endpoint_name: 예측을 수행할 SageMaker 엔드포인트의 이름입니다.

(2) 이미지, 비디오 데이터에 대한 Q&A 실행

다음으로, 이미지와 비디오 데이터를 입력으로 받아 질문에 대한 답변을 생성하는 코드입니다.


karate_video_url = 'https://huggingface.co/datasets/raushan-testing-hf/videos-test/resolve/main/karate.mp4'
prompt_video1 = 'USER: <video>\nWhat do you see in this video?\nASSISTANT:'

image_snowman_url = 'https://huggingface.co/microsoft/kosmos-2-patch14-224/resolve/main/snowman.jpg'
prompt_image1 = 'USER: <image>\nWhat do you see in this image?\nASSISTANT:'

image_stopsign_url = 'http://farm3.staticflickr.com/2249/2511051084_5c8d0e8de1_z.jpg'
prompt_image2 = 'USER: <image>\nWhat color is the sign?\nASSISTANT:'

generate_kwargs = {"max_new_tokens": 100, "do_sample": True, "top_p": 0.9}
mixed_data = {
    "inputs": [karate_video_url, image_snowman_url, image_stopsign_url],
    "parameters": {
        "prompts": [prompt_video1, prompt_image1, prompt_image2],
        "generate_kwargs": generate_kwargs
    }
}

response = predictor.predict(data=mixed_data)
print("\n".join(response))
  • 프롬프트 형식:
    • 비디오 QnA: USER: <video> {사용자 질문} \n ASSISTANT:
      • 예: USER: <video>\nWhat do you see in this video?\nASSISTANT:
    • 이미지 QnA: USER: <image> {사용자 질문} \n ASSISTANT:
      • 예: USER: <image>\nWhat color is the sign?\nASSISTANT:
    • mixed_data: 입력 데이터와 매개변수를 포함하는 SageMaker Endpoint의 입력 값
      • generate_kwargs: 답변을 생성할 때 모델에서 사용할 매개변수
        • max_new_tokens: 생성할 최대 토큰 수
        • do_sample: 샘플링 여부 (True, False)
        • top_p: 샘플링 시 사용할 top-p 값

(3) 출력 결과

코드 실행 후 출력된 결과는 다음과 같습니다:

USER: What do you see in this video?
ASSISTANT: The video shows a person dressed in a white karate gi performing various
           techniques, including kicks and hand strikes. The person is wearing
           a karate uniform and appears to be practicing in a training area with
           natural light coming through the windows. The video is taken from
           a stationary position, and there is a sense of focus and 
           discipline present in the way the individual performs the techniques.
           The environment looks like a dojo or training area specifically designed
           for martial arts.

USER: What do you see in this image?
ASSISTANT: The image features a snowman sitting in front of a small, open fire,
           made up of various items typically used for starting fires such as
           kindling and a firelighter like matches or a lighter, which suggests
           it's preparing to light a larger bonfire. The snowman is wearing a hat
           and a scarf, and has a happy expression, with its arms resting
           comfortably on its knees.

USER: What color is the sign?
ASSISTANT: The sign is red with white letters.

출력 결과를 보면, 예제 비디오와 이미지들에 대한 질문에 대해서 적절한 답변을 생성했음을 알 수 있습니다.

리소스 정리

마지막으로 SageMaker Endpoint가 더 이상 필요하지 않은 경우, 다음 CDK 명령어를 이용해서 모든 CloudFormation 스택을 삭제할 수 있습니다:


cdk destroy --force --all

맺음말

지금까지 LLaVA-NeXT-Video 모델을 Amazon SageMaker Endpoint에 AWS CDK를 이용해서 자동으로 배포하는 방법을 알아보았습니다.

SageMaker Endpoint에 ML 모델을 배포해서 사용하는 경우 다음과 같은 장점을 얻을 수 있습니다.

  • 쉽고 빠른 배포: 완전 관리형 서비스로 운영을 간소화할 수 있고, 다양한 ML 프레임워크와 통합되어 있어 모델 배포 프로세스를 단순화할 수 있습니다.
  • 운영 효율성: 자동 확장(Autoscaling), 로드 밸런싱, 모니터링과 같은 기능을 제공하여 운영 효율성을 높입니다. 이는 특히 실시간 비디오 분석 작업에서 중요한 역할을 합니다.
  • 고성능 추론: SageMaker는 낮은 지연 실시간 추론 및 고처리량을 제공하여, 대규모 비디오 데이터셋에서도 높은 성능을 유지할 수 있습니다.

이 블로그 포스팅에서 소개한 LLaVA-NeXT-Video 모델의 이미지와 비디오 실시간 분석 사례 외에도 LLaVA-NeXT-Video 모델은 다양한 비디오 분석 작업에서 뛰어난 성능을 발휘합니다. 다음은 몇 가지 구체적인 활용 사례입니다:

  • 실시간 비디오 캡셔닝: 스포츠 경기와 같은 실시간 이벤트에서 중요한 장면을 자동으로 캡션하여 사용자 경험을 향상시킵니다. Amazon SageMaker Endpoint의 실시간 추론 기능은 이러한 캡셔닝 작업을 더욱 신속하고 정확하게 수행할 수 있게 합니다.
  • 비디오 검색 인덱싱: 대규모 비디오 라이브러리에서 특정 이벤트나 객체를 검색하는 데 활용되어 다양한 비디오 콘텐츠를 효과적으로 관리할 수 있습니다. SageMaker Endpoint의 확장 가능한 인프라는 대규모 데이터 셋에서도 높은 성능을 유지할 수 있도록 지원합니다.
  • 결함 감지: 제조업에서 실시간으로 제품의 결함을 감지하고 보고하여 생산 효율성을 높이고 품질 관리를 강화합니다. SageMaker Endpoint의 자동 확장 기능(AutoScaling)은 다양한 생산 환경에서 일관된 성능을 보장합니다.
  • 실시간 객체 인식: 교통 감시 시스템에서 차량, 보행자, 신호등 등을 실시간으로 인식하고 분석하여 안전하고 효율적인 교통 관리에 기여합니다. SageMaker Endpoint의 고성능 추론 기능은 이러한 실시간 분석 작업을 더욱 효과적으로 수행할 수 있게 합니다.

이러한 다양한 활용 사례를 통해 LLaVA-NeXT-Video 모델의 비디오 이해 능력은 새로운 가능성을 열어주고 있습니다.

여러분들도 AWS CDK를 이용해서 LLaVA-NeXT-Video 모델을 SageMaker Endpoint에 쉽게 배포할 수 있으며, 이를 통해 다양한 비즈니스와 연구 분야에서 실시간 비디오 분석의 가능성을 더욱 확장할 수 있습니다.

지금 바로 Amazon SageMaker를 통해 LLaVA-NeXT-Video 모델을 배포하여, 실시간 비디오 분석의 강력한 성능을 경험해보세요!

참고 자료

Related Work

Sungmin Kim

Sungmin Kim

김성민님은 AWS의 솔루션즈 아키텍트 입니다. Startup 고객들과 협력하여 비즈니스 성과를 실현하는데 도움을 드리고 있습니다.