AWS 기술 블로그

AWS CDK를 활용한 OpenAI Whisper 모델 Amazon SageMaker Endpoint 배포 자동화

OpenAI Whisper 모델은 MIT 라이선스를 가진 자동 음성 인식(Automatic Speech Recognition, ASR) 및 음성 번역을 위한 사전 훈련 모델입니다. OpenAI Whisper 모델은 CNN과 Transformer 아키텍처를 결합한 모델로, 68만 시간의 라벨링된 데이터로 훈련되었으며, 작은 크기에도 불구하고 높은 정확도를 보입니다. 특히 파인튜닝(fine-tuning) 없이도 다양한 데이터셋과 도메인에 잘 일반화되는 것이 큰 장점입니다. 또한 전사(transcribe), 번역, 언어 식별, 발화자 구분 등 다양한 작업에 활용될 수 있습니다.

OpenAI Whisper 모델을 사용하기 위해서 AWS에 다양한 방식으로 배포 가능합니다. 이 블로그 포스팅에서는 ML 모델 추론 서비스 구축을 위한 완전 관리형 서비스인 Amazon SageMaker EnpointAWS Cloud Development Kit (CDK)를 사용하여 OpenAI Whisper 모델을 배포하는 방법을 소개하고자 합니다. AWS CDK는 인프라를 코드화하여 관리할 수 있는 Infrastructure as Code (IaC) 도구로, 클라우드 리소스를 프로그래밍 방식으로 정의하고 프로비저닝할 수 있습니다. Amazon SageMaker Endpoint는 기계 학습 모델을 손쉽게 배포하고 추론 서비스를 제공하는 AWS 서비스입니다. AWS CDK와 Amazon SageMaker Endpoint를 결합하면 ML 모델 배포를 자동화하고 운영 효율성을 높일 수 있습니다.

AWS CDK의 장점

AWS CDK는 IaC 도구로서 다음과 같은 장점을 제공합니다.

  • 코드 재사용성: 프로그래밍 언어를 사용하여 인프라를 정의함으로써 가독성이 높아지고, 유지 관리기 쉬어집니다. AWS CDK를 사용하면 코드로 인프라를 정의하므로, 이를 재사용하고 버전 관리할 수 있습니다.
  • 유연성: 코드형 인프라 정의를 통해 인프라 변경 사항을 체계적으로 관리할 수 있습니다. 다양한 프로그래밍 언어를 지원하여 개발자에게 익숙한 언어로 인프라를 정의할 수 있습니다.
  • 자동화: 테스트 자동화, 코드 리뷰, 버전 관리 등의 소프트웨어 개발 실천 방법을 인프라 관리에 적용할 수 있습니다. AWS CDK는 CloudFormation을 생성하여 AWS 리소스를 자동으로 배포합니다.

Amazon SageMaker Endpoint의 장점

Amazon SageMaker Enpoint는 기계 학습 모델을 배포하고 추론 서비스를 제공하는 데 있어 다음과 같은 장점을 제공합니다.

  • 쉽고 빠른 배포: 완전 관리형 서비스로 운영을 간소화할 수 있고, 다양한 ML 프레임워크와 통합되어 있어 모델 배포 프로세스를 단순화 시킬 수 있습니다.
  • 운영 효율성: 자동 확장(Autoscaling), 로드 밸런싱, 모니터링과 같은 기능을 제공하여 운영 효율성을 높입니다.

AWS CDK를 이용한 SageMaker Endpoint 구성의 장점 – ML 배포 자동화와 운영 효율성 증대

AWS SageMaker SDK를 이용한 모델 배포는 간단하고 빠르게 모델을 배포할 수 있는 장점이 있지만, 복잡한 인프라 설정 관리에는 한계가 있습니다. 반면에, AWS CDK를 이용해 SageMaker Endpoint를 구성하면 이러한 단점을 극복할 수 있습니다. AWS CDK를 사용하면 인프라를 코드로 관리할 수 있어 일관성 있는 배포와 재사용 가능한 구성 요소를 제공하며, 복잡한 인프라 설정도 가능합니다.

정리하면, AWS CDK와 Amazon SageMaker Endpoint의 함께 사용할 경우, 다음과 같은 이점을 얻을 수 있습니다.

  • 인프라 관리의 일관성

AWS CDK는 인프라를 코드로 관리하는 IaC 도구로, CloudFormation을 통해 일관된 인프라 배포를 보장합니다. 이는 복잡한 인프라 설정을 코드로 정의할 수 있어, 대규모 프로젝트나 다양한 환경에서 유리합니다.

  • 재사용 가능한 구성 요소

AWS CDK는 재사용 가능한 구성 요소(Construct)를 제공하여 코드의 재사용성을 높이고, 유지보수를 용이하게 합니다. 이를 통해 동일한 설정을 여러 환경에서 반복적으로 사용할 수 있습니다.

  • 복잡한 인프라 설정 가능

AWS CDK를 사용하면 복잡한 네트워크 설정, 권한 관리 등을 코드로 정의할 수 있어, 대규모 프로젝트나 다양한 환경에서 유리합니다. 예를 들어, SageMaker Studio와 같은 복잡한 구성 요소를 자동으로 프로비저닝할 수 있습니다.

  • 자동화 및 확장성

AWS CDK를 사용하면 SageMaker Endpoint를 자동으로 프로비저닝하고 관리할 수 있어, 수동 설정의 번거로움을 줄일 수 있습니다. 또한, CDK는 Python, JavaScript/TypeScript, Golang 등과 같은 프로그래밍 언어를 사용하여 다양한 파라미터를 쉽게 설정할 수 있어 확장성이 높습니다.

이제 OpenAI Whisper 모델을 배포 하기 위한 CDK 프로젝트의 디렉토리 구조와 주요 코드에 대해서 살펴보고자 합니다.
전체 코드는 GitHub 리포지토리에서 확인할 수 있습니다.

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

다음은 OpenAI Whisper 모델을 SageMaker 실시간 추론 엔드포인트 (Real-time Inference Endpoint)에 배포하기 위한 AWS CDK 프로젝트의 디렉토리 구조 입니다.

./
├── README.md
├── app.py
├── cdk.context.json
├── cdk.json
├── cdk_stacks
│   ├── __init__.py
│   ├── sm_asr_realtime_endpoint.py
│   └── sm_realtime_endpoint_autoscaling.py
├── requirements.txt
└── source.bat

디렉토리 구조 설명

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

ℹ️ SageMaker 비동기 추론 엔드포인트 (Asynchronous Inference Endpoint) 배포용 AWS CDK 프로젝트의 디렉터리 역시 위와 동일한 구조입니다.

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

OpenAI Whisper 모델을 Amazon SageMaker Endpoint에 배포하는 방법은 여러 가지가 있습니다. 여기서는 Amazon SageMaker JumpStart, Hugging Face, 그리고 PyTorch Custom 컨테이너(Container)를 사용하는 3가지 방법으로 실시간 동기 방식으로 추론 서버를 구성하는 방법을 먼저 소개하고, 다음으로 비동기 추론 서버 구성 방법에 대해서 알아보겠습니다.

실시간 추론 (Real-time Inference)

SageMaker 실시간 추론은 실시간, 대화형, 짧은 지연 시간이 요구되는 추론 워크로드에 적합한 방식입니다.

1. Amazon SageMaker JumpStart 모델을 이용한 배포 방법

Amazon SageMaker JumpStart은 사전 훈련된 모델, 사전 훈련된 파운데이션 모델, 일반적인 사용 사례를 해결하기 위한 사전 구축된 솔루션으로 기본 제공 알고리즘을 제공하는 ML 모델 허브(Hub) 입니다. SageMaker JumpStart를 이용해서 사전 학습된 모델(Pre-built model)을 쉽게 배포할 수 있습니다.

다음은 SageMaker JumpStart에 있는 OpenAI Whipsper 모델을 GPU 인스턴스(ml.g5.2xlarge)에 배포하는 CDK 스택의 주요 코드 입니다.

model_id, model_version = 'huggingface-asr-whisper-medium', '3.0.0'
model_name = f"{model_id.upper().replace('-', '_')}_{model_version.replace('.', '_')}"
# model_name = 'HUGGINGFACE_ASR_WHISPER_MEDIUM_3_0_0'

sagemaker_endpoint = JumpStartSageMakerEndpoint(
    self,
    'JumpStartSageMakerEndpoint',
    model=JumpStartModel.of(model_name),
    instance_type=SageMakerInstanceType.ML_G5_2_XLARGE,
    endpoint_name=sagemaker_endpoint_name,
    accept_eula=True
)

코드 설명

  • model_name: SageMaker JumpStart에서 제공하는 OpenAI Whisper 모델의 이름입니다.
  • JumpStartSageMakerEndpoint: SageMaker JumpStart 모델을 배포하기 위한 CDK 구성 요소(Construct)입니다.
  • self: 현재 CDK 스택(Stack) 클래스의 인스턴스를 참조합니다.
  • 'JumpStartSageMakerEndpoint': 리소스의 논리적 이름입니다.
  • model: JumpStartModel.of(model_name)을 이용해서 선택한 모델을 지정합니다.
  • instance_type: 모델을 배포할 EC2 인스턴스 유형입니다. ML_G5_2_XLARGE 인스턴스 유형은 GPU 가속을 지원하는 ml.g5.2xlarge 인스턴스입니다.
  • endpoint_name: 생성될 SageMaker Endpoint의 이름입니다.
  • accept_eula: True로 설정하여 최종 사용자 라이선스 계약(EULA)을 자동으로 수락합니다.

2. Hugging Face 모델을 이용한 배포 방법

Hugging Face는 자연어 처리(NLP) 작업에 특화된 다양한 사전 훈련된 모델을 제공합니다. Amazon SageMaker에서는 Hugging Face 모델을 사용하여 학습, 미세 조정(fine-tuning) 및 추론을 실행할 수 있도록 지원합니다.

다음은 Hugging Face에서 제공하는 OpenAI Whisper 모델을 GPU 인스턴스(ml.g5.2xlarge)에 배포하는 CDK 스택의 주요 코드 입니다. Hugging Face 모델을 직접 배포하려면 다음과 같이 Hugging Face 모델 ID (HF_MODEL_ID)와 자동 음성 인식(ASR) 태스크(automatic-speech-recognition)를 위한 환경 변수(HF_TASK)를 설정해야 합니다.

model_id = 'openai/whisper-medium'

sagemaker_endpoint = HuggingFaceSageMakerEndpoint(
    self,
    'HFSageMakerEndpoint',
    model_id=model_id,
    instance_type=SageMakerInstanceType.ML_G5_2_XLARGE,
    container=DeepLearningContainerImage.HUGGINGFACE_PYTORCH_INFERENCE_2_0_0_TRANSFORMERS4_28_1_GPU_PY310_CU118_UBUNTU20_04,
    endpoint_name=sagemaker_endpoint_name,
    environment={
        'HF_MODEL_ID': model_id,
        'HF_TASK': 'automatic-speech-recognition'
    }
)

코드 설명

  • HuggingFaceSageMakerEndpoint: SageMaker에서 HuggingFace 모델을 배포하기 위한 AWS CDK 구성 요소 (Construct)입니다.
  • self: 현재 CDK 스택(Stack) 클래스의 인스턴스를 참조합니다.
  • 'HFSageMakerEndpoint': 리소스의 논리적 이름입니다.
  • model_id: HuggingFace 모델의 ID입니다.
  • instance_type: 모델을 배포할 EC2 인스턴스 유형입니다. ML_G5_2_XLARGE 인스턴스 유형은 GPU 가속을 지원하는 ml.g5.2xlarge 인스턴스입니다.
  • container: 모델을 실행할 컨테이너 이미지 (Docker Image)입니다. 여기서는 PyTorch 2.0.0Transformers 4.28.1이 설치된 GPU를 지원하는 HuggingFace PyTorch Inference 컨테이너를 사용합니다.
  • endpoint_name: 생성될 SageMaker Endpoint의 이름입니다.
  • environment: 모델 실행 시 사용할 환경 변수입니다. 여기서는 HF_TASK'automatic-speech-recognition'으로 설정하여 음성 인식 작업(ASR)을 수행하도록 지정합니다.

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

SageMaker Endpoint에 사전 학습된 모델 뿐만 아니라, 사전 학습된 모델을 미세 조정(fine-tuning)한 custom 모델을 배포할 수 있습니다.
또한, 사용자가 정의한 추론 스크립트 모델과 함께 SageMaker Endpoint에 배포할 수 있습니다.
Custom 모델이나 사용자 정의 추론 스크립트를 SageMaker Endpoint에 배포하기 위해서 모델과 추론 스크립트와 같은 모델 아티팩트를 tar.gz 파일 형식으로 생성해서 S3에 저장합니다. 그리고, 모델 아티팩트가 저장된 S3 위치 정보를 이용해서 SageMaker Endpoint를 생성합니다.

다음은 OpenAI Whisper 모델과 추론 스크립트를 S3에 업로드한 후에 HuggingFace PyTorch Inference 컨테이너를 이용해서 SageMaker Endpoint에 배포하는 CDK 스택의 주요 코드 입니다.

model_id = 'openai/whisper-medium'
model_data_url = f's3://{bucket}/{model_artifacts}'

sagemaker_endpoint = CustomSageMakerEndpoint(
    self,
    'PyTorchSageMakerEndpoint',
    model_id=model_id,
    instance_type=SageMakerInstanceType.ML_G5_2_XLARGE,
    container=DeepLearningContainerImage.HUGGINGFACE_PYTORCH_INFERENCE_2_0_0_TRANSFORMERS4_28_1_GPU_PY310_CU118_UBUNTU20_04,
    endpoint_name=sagemaker_endpoint_name,
    environment={
        'chunk_length_s': '30',
    },
    model_data_url=model_data_url
)

코드 설명

  • CustomSageMakerEndpoint: 사용자 정의 모델을 배포하기 위한 AWS CDK 구성 요소(Construct)입니다.
  • self: 현재 CDK 스택(Stack) 클래스의 인스턴스를 참조합니다.
  • 'PyTorchSageMakerEndpoint': 리소스의 논리적 이름입니다.
  • model_id: 사용자 정의 모델의 ID입니다.
  • instance_type: 모델을 배포할 EC2 인스턴스 유형입니다. ML_G5_2_XLARGE 인스턴스 유형은 GPU 가속을 지원하는 ml.g5.2xlarge 인스턴스입니다.
  • container: 모델을 실행할 컨테이너 이미지입니다. 여기서는 HuggingFace PyTorch Inference 컨테이너 (HUGGINGFACE_PYTORCH_INFERENCE_2_0_0_TRANSFORMERS4_28_1_GPU_PY310_CU118_UBUNTU20_04)를 사용합니다.
  • endpoint_name: 생성될 SageMaker Endpoint의 이름입니다.
  • environment: 모델 실행 시 사용할 환경 변수입니다. 여기서는 chunk_length_s를 설정하여 모델의 동작을 제어합니다. chunk_length_s를 ’30’으로 설정하여 오디오 처리 시 청크 길이를 30초로 지정합니다. 환경 변수는 사용자 정의 모델의 요구사항에 맞게 설정합니다.
  • model_data_url: Amazon S3에 저장된 모델 아티팩트(Model Artifacts)의 URL입니다.

비동기 추론(Asynchronous Inference)

대규모 음성 인식 작업을 실시간으로 처리하기 어려운 경우가 있습니다. 이런 상황에서 Amazon SageMaker의 비동기 추론 기능은 매우 유용한 대안이 될 수 있습니다.

비동기 추론이 필요한 경우

비동기 추론은 다음과 같은 상황에서 특히 유용합니다:

  1. 대용량 오디오 파일 처리 (최대 1GiB 입력 처리 가능)
  2. 긴 처리 시간이 필요한 경우 (추론 속도가 1분 이상 소요)

비동기 추론 배포

async_inference_error_sns_topic = aws_sns.Topic(self, 'AsyncInferErrorSNSTopic')
async_inference_success_sns_topic = aws_sns.Topic(self, 'AsyncInferSuccessSNSTopic')

s3_failure_path = f"s3://{bucket}/{endpoint_name}/error"
s3_output_path = f"s3://{bucket}/{endpoint_name}/output"

sagemaker_endpoint = JumpStartSageMakerEndpoint(
    self,
    'JumpStartSageMakerEndpoint',
    model=JumpStartModel.of(model_name),
    instance_type=SageMakerInstanceType.ML_G5_2_XLARGE,
    endpoint_name=sagemaker_endpoint_name,
    accept_eula=True
)

async_inference_config = {
    'OutputConfig': {
        'NotificationConfig': {
            'ErrorTopic': async_inference_error_sns_topic.topic_arn,
            'SuccessTopic': async_inference_success_sns_topic.topic_arn
        },
        'S3FailurePath': s3_failure_path,
        'S3OutputPath': s3_output_path
    },
    'ClientConfig': {
        'MaxConcurrentInvocationsPerInstance': 4
    }
}

sagemaker_endpoint.cfn_endpoint_config.add_override(
    'Properties.AsyncInferenceConfig', async_inference_config
)

코드 설명

Amazon SNS 토픽 설정

async_inference_error_sns_topic = aws_sns.Topic(self, 'AsyncInferErrorSNSTopic')
async_inference_success_sns_topic = aws_sns.Topic(self, 'AsyncInferSuccessSNSTopic')

이 부분은 두 개의 Amazon SNS(Simple Notification Service) 토픽을 생성합니다:

  • 오류 알림 토픽: 추론 과정에서 오류가 발생했을 때 알림을 보냅니다. (AsyncInferErrorSNSTopic)
  • 성공 알림 토픽: 추론이 성공적으로 완료되었을 때 알림을 보냅니다. (AsyncInferSuccessSNSTopic)

이를 통해 추론 작업의 상태를 실시간으로 모니터링할 수 있습니다.

Amazon S3 경로 설정

s3_failure_path = f"s3://{bucket}/{endpoint_name}/error"
s3_output_path = f"s3://{bucket}/{endpoint_name}/output"

이 부분은 Amazon S3 버킷 내 경로를 지정합니다:

  • 실패 경로: 추론 실패 시 관련 데이터가 저장될 위치입니다.
  • 출력 경로: 성공적인 추론 결과가 저장될 위치입니다.

Amazon SageMaker Endpoint 설정

sagemaker_endpoint = JumpStartSageMakerEndpoint(
    self,
    'JumpStartSageMakerEndpoint',
    model=JumpStartModel.of(model_name),
    instance_type=SageMakerInstanceType.ML_G5_2_XLARGE,
    endpoint_name=sagemaker_endpoint_name,
    accept_eula=True
)

이 코드는 SageMaker JumpStart를 사용하여 Whisper 모델을 SageMaker Endpoint로 배포합니다. GPU 가속을 지원하는 ml.g5.2xlarge 인스턴스(ML_G5_2_XLARGE)를 사용하여 성능을 최적화합니다.

비동기 추론 설정

async_inference_config = {
    'OutputConfig': {
        'NotificationConfig': {
            'ErrorTopic': async_inference_error_sns_topic.topic_arn,
            'SuccessTopic': async_inference_success_sns_topic.topic_arn
        },
        'S3FailurePath': s3_failure_path,
        'S3OutputPath': s3_output_path
    },
    'ClientConfig': {
        'MaxConcurrentInvocationsPerInstance': 4
    }
}

sagemaker_endpoint.cfn_endpoint_config.add_override(
    'Properties.AsyncInferenceConfig', async_inference_config
)

이 부분에서 SageMaker 비동기 추론 엔드포인트 (Asynchronous Endpoint)에 필요한 설정을 아래와 같이 구성합니다.

  • 알림 설정: Amazon SNS 토픽을 사용하여 오류와 성공 알림을 설정합니다.
  • Amazon S3 경로: 실패 및 출력 데이터의 저장 위치를 지정합니다.
  • 동시 처리 수: 인스턴스당 최대 4개의 동시 추론 요청을 처리하도록 설정합니다.

지금까지 설명드린 내용을 바탕으로 OpenAI Whisper 모델을 CDK 명령어를 이용해서 SageMaker Endpoint에 배포하고, 테스트하는 과정을 살펴 보겠습니다.

OpenAI Whisper 모델 배포 하기

OpenAI Whisper 모델을 배포하기 위해서는 먼저 모델 아티팩트(Model Artifacts)를 준비해야 합니다. 모델 아티팩트 준비 단계에서는 Hugging Face에서 OpenAI Whisper 모델을 다운로드하고 S3에 업로드하는 과정을 포함합니다.

Step 1) 모델 아티팩트 (Model Artifacts) 준비

1. 필요한 패키지 설치:

pip install -U huggingface-hub==0.23.5

2. Hugging Face에서 Open AI Whisper 모델 다운로드 및 아티팩트 저장:

다음 Python 코드를 실행해서 Hugging Face에서 모델을 다운로드 합니다.

from huggingface_hub import snapshot_download
from pathlib import Path

model_dir = Path('model')
model_dir.mkdir(exist_ok=True)

model_id = "openai/whisper-medium"
snapshot_download(model_id, local_dir=model_dir)

3. 모델 아티팩트를 model.tar.gz로 압축:

cp -rp src/code model
tar --exclude ".huggingface" -czf model.tar.gz --use-compress-program=pigz -C model/ .

ℹ️ 사용자 정의 추론 스크립트가 저장된 src/code 디렉터리 위치는 GitHub 리포지토리에서 확인할 수 있습니다.

ℹ️ PyTorch 모델 아티팩트를 저장하기 위한 디렉토리는 다음과 같은 구조를 가져야 합니다.

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

OpenAI Whisper 모델 아티팩트 파일 (model.tar.gz) 을 압축 해제하면, 아래와 같습니다.

model/
├── README.md
├── added_tokens.json
├── config.json
├── flax_model.msgpack
├── generation_config.json
├── merges.txt
├── model.safetensors
├── normalizer.json
├── preprocessor_config.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tf_model.h5
├── tokenizer.json
├── tokenizer_config.json
├── vocab.json
└── code
    ├── inference.py
    └── requirements.txt

4. model.tar.gz를 S3에 업로드:

export MODEL_URI="s3://{버킷_이름}/{오브젝트_키_이름}/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)

Step 2) CDK 스택 배포 준비

1. Github 리포지토리에서 솔루션 코드를 다운로드:

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/whisper-model-hosting-on-sagemaker-endpoint/sagemaker-realtime-inference/pytorch
cd machine-learning/sagemaker/whisper-model-hosting-on-sagemaker-endpoint/sagemaker-realtime-inference/pytorch

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

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

Step 3) CDK 명령어를 이용한 배포

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

{
  "model_id": "openai/whisper-medium",
  "model_data_source": {
    "s3_bucket_name": "<버킷_이름>",
    "s3_object_key_name": "<오브젝트_키_이름>"
  }
}

이제 CDK 명령어를 사용하여 CloudFormation 템플릿을 생성하고 배포합니다.

cdk synth --all
cdk deploy --require-approval never --all

ℹ️ 배포될 CDK 스택의 전체 목록은 cdk list 명령어를 이용해서 확인할 수 있습니다. 예를 들어, SageMaker JumpStart을 이용해서 실시간 추론 엔드포인트에 OpenAI Whisper 모델을 배포하는 CDK 전체 목록을 다음과 같이 확인할 수 있습니다.

(.venv) $ cdk list
ASRRealtimeEndpointStack
ASRRealtimeEndpointAutoScalingStack

테스트

모든 CDK 스택의 배포가 완료되면, 아래 테스트 코드를 이용해서 SageMaker Endpoint에 배포된 OpenAI Whisper 모델을 확인할 수 있습니다.

1. 실시간 추론 (Real-time Inference) 테스트 코드

import boto3
from sagemaker import Predictor
from sagemaker.serializers import DataSerializer
from sagemaker.deserializers import JSONDeserializer


def get_cfn_outputs(stackname: str, region_name: str):
    cfn = boto3.client('cloudformation', region_name=region_name)
    outputs = {}
    for output in cfn.describe_stacks(StackName=stackname)['Stacks'][0]['Outputs']:
        outputs[output['OutputKey']] = output['OutputValue']
    return outputs


CFN_STACK_NAME = "ASRRealtimeEndpointStack" #TODO: Replace it with your stack name
cfn_stack_outputs = get_cfn_outputs(CFN_STACK_NAME, aws_region)
endpoint_name = cfn_stack_outputs['EndpointName']

audio_serializer = DataSerializer(content_type="audio/x-audio")
deserializer = JSONDeserializer()

predictor = Predictor(
    endpoint_name=endpoint_name,
    serializer=audio_serializer,
    deserializer=deserializer
)

initial_args = {'ContentType': 'audio/wav'}
response = predictor.predict(
    initial_args=initial_args,
    data=audio_path
)

주요 포인트

  • CloudFormation 스택 출력 가져오기: get_cfn_outputs 함수는 지정된 CloudFormation 스택에서 엔드포인트 이름을 가져옵니다.
  • Serializer와 Deserializer 설정: DataSerializer는 오디오 데이터를 적절한 형식으로 변환하고, JSONDeserializer는 예측 결과를 JSON 형식으로 변환합니다.
  • Predictor 인스턴스 생성: Predictor 객체를 생성하여 SageMaker Endpoint와 연결합니다.
  • 실시간 추론 요청: predict 메서드를 사용하여 오디오 파일을 입력으로 실시간 추론을 수행합니다.

2. 비동기 추론 (Asynchronous Inference) 테스트 코드

from sagemaker import Predictor
from sagemaker.predictor_async import AsyncPredictor
from sagemaker.serializers import DataSerializer
from sagemaker.deserializers import JSONDeserializer
from sagemaker.async_inference.waiter_config import WaiterConfig


CFN_STACK_NAME = "ASRAsyncEndpointStack" #TODO: Replace it with your stack name
cfn_stack_outputs = get_cfn_outputs(CFN_STACK_NAME, aws_region)
endpoint_name = cfn_stack_outputs['EndpointName']

audio_serializer = DataSerializer(content_type="audio/x-audio")
deserializer = JSONDeserializer()

predictor = Predictor(
    endpoint_name=endpoint_name,
    serializer=audio_serializer,
    deserializer=deserializer
)

async_predictor = AsyncPredictor(predictor=predictor)

initial_args = {'ContentType': 'audio/wav'}
response = async_predictor.predict_async(
    initial_args=initial_args,
    input_path=input_path
)

response.get_result(waiter_config=WaiterConfig(max_attempts=60, delay=15))

주요 포인트

  • CloudFormation 스택 출력 가져오기: 실시간 추론과 동일하게 CloudFormation 스택에서 엔드포인트 이름을 가져옵니다.
  • Serializer와 Deserializer 설정: 실시간 추론과 동일하게 설정합니다.
  • Predictor 인스턴스 생성: 실시간 추론과 동일하게 Predictor 객체를 생성합니다.
  • AsyncPredictor 인스턴스 생성: AsyncPredictor 객체를 생성하여 비동기 추론을 설정합니다.
  • 비동기 추론 요청: predict_async 메서드를 사용하여 오디오 파일을 입력으로 비동기 추론을 수행합니다.
  • 결과 대기: get_result 메서드를 사용하여 추론 결과를 기다립니다. WaiterConfig를 통해 최대 시도 횟수와 대기 시간을 설정할 수 있습니다.

지금까지 Amazon SageMaker를 사용하여 OpenAI Whisper 모델의 실시간 및 비동기 추론을 설정하는 방법을 살펴보았습니다. 실시간 추론은 즉각적인 응답이 필요한 경우에 유용하며, 비동기 추론은 대규모 데이터나 긴 처리 시간이 필요한 작업에 적합합니다. Amazon SageMaker의 다양한 기능을 활용하여 여러분들의 요구 사항 맞게 효율적인 추론 작업을 수행할 수 있습니다.

리소스 정리

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

cdk destroy --force --all

결론

지금까지 AWS CDK와 Amazon SageMaker Endpoint를 통합하여 ML 모델 배포를 자동화하고 운영 효율성을 높이는 방법에 대해 알아보았습니다. CDK를 사용하면 인프라를 코드로 정의하고 관리할 수 있으며, SageMaker Endpoint는 ML 모델을 쉽게 배포하고 추론 서비스를 제공합니다. 이 두 가지를 결합하면 ML 워크로드의 배포와 운영을 효율적으로 관리할 수 있습니다.
이러한 방식으로 OpenAI Whisper 모델을 SageMaker Endpoint에 배포해서 음성 인식(Automatic Speech Recognition), 전사(Transcribe), 번역(Translate) 등의 작업을 효율적으로 수행할 수 있는 확장 가능한 인프라를 AWS에서 구축할 수 있습니다. Whisper 모델의 강력한 성능과 AWS의 확장성 있는 인프라를 결합 함으로써, 여러분들은 고품질의 음성 인식 서비스를 구축하고 운영할 수 있게 됩니다.

참고 자료

Sungmin Kim

Sungmin Kim

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