AWS 기술 블로그

AWS Batch를 활용하여 미디어 처리를 위한 관리형 FFmpeg 워크플로우 구성하기

이 글은 AWS Open Source Blog에 게시된 Create a Managed FFmpeg Workflow for Your Media Jobs Using AWS Batch by Guillaume Marchand and Daisy Riley을 한국어 번역 및 편집하였습니다.

FFmpeg은 비디오 처리를 위해 널리 사용되는 업계 표준 오픈 소스 유틸리티입니다. FFmpeg는 모든 비디오 압축 형식에 대한 인코딩 및 디코딩, 오디오 인코딩 및 디코딩, 전송 스트림에서 오디오 및 비디오 캡슐화 및 추출 등 다양한 기능을 갖추고 있습니다.

AWS 고객이 AWS에서 FFmpeg을 사용하려면 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스를 통해 직접 FFmpeg을 유지 관리하고 미디어 데이터를 수집 및 조작할 수 있는 워크플로우 매니저를 개발해야 합니다. 하지만, 이것은 고통스러운 과정입니다.

이 블로그에서는 FFmpeg과 AWS 서비스를 통합하여 보다 쉽게 관리할 수 있는 FFmpeg 시스템을 구축하는 방법을 보여드리려고 합니다. AWS Batch 를 통해 컨테이너로 만들어진 FFmpeg을 배포하고 관리하는 오픈 소스 솔루션을 만들었습니다. 최종적으로 여러분은 REST API를 통해 FFmpeg 실행 명령을 배치 작업으로 실행할 수 있습니다. 이 솔루션은 AWS 위에서 오픈 소스 FFmpeg을 활용할 때 유지 관리하는 비용을 줄여주고, 사용법에 대한 학습 곡선을 낮춰 사용 편의성을 개선합니다.

솔루션 개요

개발자, 과학자, 엔지니어는 AWS Batch를 통해 AWS에서 수십만 개의 배치 컴퓨팅 작업을 쉽고 효율적으로 실행할 수 있습니다. AWS Batch는 추가 요금이 없으며, AWS 컴퓨팅 자원에 대한 비용만 지불하면 됩니다. AWS Batch는 제출된 배치 작업의 규모와 특정 자원 요구 사항에 따라 최적의 컴퓨팅 자원(예: CPU 또는 메모리 최적화 인스턴스)의 수량과 유형을 동적으로 프로비저닝합니다. AWS Batch를 사용하면 작업을 실행하는 데 사용하는 배치 컴퓨팅 소프트웨어나 서버 클러스터를 설치 및 관리할 필요가 없으므로 결과 분석과 문제 해결에 집중할 수 있습니다. AWS Batch는 Amazon EC2 및 스팟 인스턴스 (Spot Instance)와 같은 전체 범위의 AWS 컴퓨팅 서비스 및 기능에 걸쳐 배치 컴퓨팅 워크로드를 계획, 예약 및 실행합니다.

2023년 2월 현재, AWS는 15개의 범용 EC2 인스턴스 제품군, 11개의 컴퓨팅 최적화 인스턴스 제품군, 14개의 가속 컴퓨팅 인스턴스를 제공합니다. 각 인스턴스 제품군 사양과 FFmpeg 하드웨어 가속 API의 상관관계를 통해 FFmpeg의 성능을 최적화할 수 있는 인스턴스를 소개합니다.

  • NVIDIA GPU 기반 Amazon EC2 인스턴스 : P3 인스턴스 제품군에는 NVIDIA Tesla V100 GPU가 장착되어 있습니다. G4dn 인스턴스 제품군은 NVIDIA T4 GPU 및 Intel 캐스케이드 레이크 CPU로 구동됩니다. 이러한 GPU는 비디오 코딩 워크로드에 매우 적합하며 향상된 하드웨어 기반 인코딩/디코딩(NVENC/NVDEC)을 제공합니다.
  • Xilinx 미디어 가속기 카드 : VT1 인스턴스는 최대 8개의 Xilinx® 알베오™ U30 미디어 가속기 카드로 구동되며 최대 96개의 vCPU, 192GB의 메모리, 25Gbps의 향상된 네트워킹, 19Gbps의 EBS 대역폭을 지원합니다. Xilinx 비디오 SDK에는 Xilinx 디바이스의 하드웨어 가속 트랜스코드 파이프라인과 통신할 수 있는 향상된 버전의 FFmpeg이 포함되어 있습니다. VT1 인스턴스는 Amazon EC2 GPU 기반 인스턴스보다 스트림당 비용이 최대 30% 저렴하고, Amazon EC2 CPU 기반 인스턴스보다 스트림당 비용이 최대 60% 저렴합니다.
  • Intel 기반 EC2 인스턴스 : M6i/C6i 인스턴스는 3세대 인텔 제온 스케일러블 프로세서(코드명 아이스 레이크)로 구동되며, 올코어 터보 주파수는 3.5GHz입니다.
  • AWS Graviton 기반 인스턴스 : 이 블로그 게시물 ‘AWS Graviton에서 FFmpeg로 최적화된 비디오 인코딩하기‘에 설명된 대로, 최신 AWS Graviton 프로세서 제품군인 C7g 인스턴스에서 비디오를 인코딩하는 데 드는 비용은 C6i에 비해 H.264의 경우 29%, H.265의 경우 18% 더 적게 측정되었습니다.
  • AMD 기반 EC2 인스턴스: M6a 인스턴스는 3세대 AMD EPYC 프로세서(코드명 밀라노)로 구동됩니다.
  • Fargate를 통한 서버리스 컴퓨팅: Fargate를 사용하면 배치 작업을 위한 완전한 서버리스 아키텍처를 구축할 수 있습니다. Fargate를 사용하면 모든 작업이 요청하는 정확한 양의 CPU 및 메모리를 사용할 수 있습니다.

컨테이너 이미지에 FFmpeg이 포함된 AWS Batch를 사용하여 관리형 비디오 인코딩 파이프라인을 만들어 보겠습니다. 예를 들어 간단한 트랜스먹싱 (transmuxing) 작업, 오디오 무음 트랙 추가, 오디오/비디오 트랙 추출, 비디오 컨테이너 파일 변경, 비디오 파일 연결, 썸네일 생성, 타임랩스 생성 등의 작업을 수행할 수 있습니다. 이 파이프라인은 Intel (C5), Graviton (C6g), NVIDIA (G4dn), AMD (C5a, M5a) 및 Fargate 인스턴스 제품군을 기본으로 사용합니다.

아키텍처에는 5가지 주요 구성 요소가 포함되어 있습니다.

  1. 컨테이너 이미지는 Amazon Elastic Container Registry (Amazon ECR)에 저장됩니다. 각 컨테이너에는 Python 래퍼가 있는 FFmpeg 라이브러리가 포함되어 있습니다. 컨테이너 이미지는 CPU/GPU 아키텍처별로 특화되어 있습니다: ARM64, x86-64, NVIDIA.
  2. AWS Batch는 CPU 아키텍처별로 큐 및 컴퓨팅 환경으로 구성됩니다. AWS Batch는 비용을 최적화하기 위해 스팟 인스턴스 컴퓨팅 환경만을 사용하여 작업 큐를 스케줄링합니다.
  3. 고객은 AWS SDK를 통해 ‘SubmitJob’ 작업을 통해 작업을 제출하거나 Amazon API Gateway REST API를 사용하여 모든 HTTP 라이브러리로 작업을 쉽게 제출할 수 있습니다.
  4. 수집 및 제작된 모든 미디어 자산은 Amazon Simple Storage Service (Amazon S3)에 저장됩니다.
  5. 관측성은 Amazon CloudWatchAWS X-Ray에 의해 관리됩니다. 모든 X-Ray 추적은 특정 FFmpeg 명령에 대해 어떤 컴퓨팅 아키텍처가 더 나은지 벤치마킹하기 위해 Amazon S3로 보냅니다.

사전 준비 사항

솔루션을 구성하기 위해서는 다음의 사전 준비 사항이 필요합니다.

AWS CDK를 활용한 솔루션 배포

“AWS Batch with FFmpeg“ 솔루션을 배포하기 위해서 다음의 절차를 따라합니다.

  1. https://github.com/aws-samples/aws-batch-with-ffmpeg GitHub 저장소를 클론합니다.
  2. 다음의 명령어를 실행합니다.
# Create a local Python virtual environment and install requirements
task venv

# Activate the Python virtual environment
source .venv/bin/activate

# Deploy the CDK stack
task cdk:deploy

# Collect AWS CloudFormation outputs from the stack
task env

# Build and push docker images for AMD64 processor architecture
task app:docker-amd64

# Build and push docker images for ARM64 processor architecture
task app:docker-arm64

# Build and push docker images for NVIDIA processor architecture
task app:docker-nvidia

AWS CDK의 결과값으로 비디오 자료를 올리거나 내려받기 위한 Amazon S3 버킷과 비디오 처리 작업을 실행시킬 수 있는 Amazon API Gateway REST 엔드포인트가 나옵니다.

솔루션 사용

“AWS Batch with FFmpeg” 솔루션이 설치되면 AWS SDK, AWS Command Line Interface (AWS CLI) 또는 API를 사용하여 FFmpeg 명령을 실행할 수 있습니다. 이 솔루션은 공식 문서에 설명된 FFmpeg 명령의 일반적인 구문을 따릅니다:

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

솔루션의 매개 변수는 다음과 같습니다:

  • global_options: 공식 문서에 설명된 FFmpeg 글로벌 옵션
  • input_file_options: 공식 문서에 설명된 FFmpeg 입력 파일 옵션
  • input_url: 솔루션에 의해 로컬 저장소와 동기화되고 로컬 경로로 변환된 S3 URL
  • output_file_options: 공식 문서에 설명된 FFmpeg 출력 파일 옵션
  • output_url: 로컬 저장소에서 S3 저장소로 동기화가된 S3 URL
  • compute: 미디어 자원을 처리하는 데 사용할 인스턴스 제품군 설정: Intel, ARM, AMD, NVIDIA
  • name: 작업의 진행상황을 관측하기 위한 메타데이터

이 예제에서는 Python용 AWS SDK (Boto3)를 사용하며 동영상의 특정 부분을 잘라낼 것입니다. 이를 위한 전제 조건으로 솔루션에서 생성한 Amazon S3 버킷에 동영상을 업로드했습니다. 이제 아래 매개 변수를 완성합니다:

import boto3
import requests
from urllib.parse import urlparse
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth

# AWS CloudFormation output of the Amazon S3 bucket created by the solution : s3://batch-ffmpeg-stack-bucketxxxx/
s3_bucket_url = "<S3_BUCKET>"
# Amazon S3 key of the media Asset uploaded on S3 bucket, to compute by FFmpeg command : test/myvideo.mp4
s3_key_input = "<MEDIA_ASSET>"
# Amazon S3 key of the result of FFmpeg Command : test/output.mp4
s3_key_output = "<MEDIA_ASSET>"
# EC2 instance family : `intel`, `arm`, `amd`, `nvidia`, `fargate`
compute = "intel"
job_name = "clip-video"

command={
    "name": job_name,
     #"global_options": "",
    "input_url" : s3_bucket_url + s3_key_input,
    #"input_file_options" : "",
    "output_url" : s3_bucket_url + s3_key_output,
    "output_file_options": "-ss 00:00:10 -t 00:00:15 -c:v copy -c:a copy"
}

그리고, Python용 AWS SDK (Boto3)를 사용하며 FFmpeg 작업을 수행하도록 제출합니다:

batch = boto3.client("batch")
result = batch.submit_job(
    jobName=job_name,
    jobQueue="batch-ffmpeg-job-queue-" + compute,
    jobDefinition="batch-ffmpeg-job-definition-" + compute,
    parameters=command,
)

HTTP POST 메서드를 통해 REST API로 동일한 FFmpeg 작업을 제출할 수도 있습니다. 이 때 Amazon API 게이트웨이 API에 대한 접근은 IAM 권한으로 제어합니다:

# AWS Signature Version 4 Signing process with Python Requests
def apig_iam_auth(rest_api_url):
    domain = urlparse(rest_api_url).netloc
    auth = BotoAWSRequestsAuth(
        aws_host=domain, aws_region="<AWS_REGION>", aws_service="execute-api"
    )
    return auth

# AWS CloudFormation output of the Amazon API Gateway REST API created by the solution : https://xxxx.execute-api.xx-west-1.amazonaws.com/prod/
api_endpoint = "<API_ENDPOINT>"
auth = apig_iam_auth(api_endpoint)
url= api_endpoint + compute + '/ffmpeg'
response = requests.post(url=url, json=command, auth=auth, timeout=2)

기본적으로 AWS Batch는 사용 가능한 EC2 인스턴스 유형을 선택합니다. 이를 재정의하려면 SDK로 작업을 제출할 때 nodeOverride 속성을 추가하면 됩니다:

instance_type = 'c5.large'
result = batch.submit_job(
    jobName=job_name,
    jobQueue="batch-ffmpeg-job-queue-" + compute,
    jobDefinition="batch-ffmpeg-job-definition-" + compute,
    parameters=command,
    nodeOverrides={
        "nodePropertyOverrides": [
            {
                "targetNodes": "0,n",
                "containerOverrides": {
                    "instanceType": instance_type,
                },
            },
        ]
    },
)

그리고 REST API일 경우는 다음과 같습니다:

command['instance_type'] = instance_type
url= api_endpoint + compute + '/ffmpeg'
response = requests.post(url=url, json=command, auth=auth, timeout=2)

지표

또한 AWS 고객은 이 솔루션을 사용하여 Amazon EC2 인스턴스 제품군의 비디오 인코딩 성능을 벤치마킹하고자 합니다. 이 솔루션은 AWS X-Ray로 성능 및 비디오 품질 메트릭을 분석합니다.

AWS X-Ray는 개발자가 애플리케이션을 분석하고 디버깅하는 데 도움이 됩니다. X-Ray를 사용하면 애플리케이션과 기본 서비스의 성능을 파악하여 성능 문제의 원인을 파악하고 문제를 해결할 수 있습니다.

3개의 X-Ray 세그먼트를 정의했습니다: Amazon S3 다운로드, FFmpeg 실행, Amazon S3 업로드입니다.

AWS 콘솔 (AWS Systmes Manager > Parameter Store)에서 AWS Systems Manager Parameter /batch-ffmpeg/ffqm을 TRUE로 전환하면 비디오 품질 메트릭인 PSNR, SSIM, VMAF가 FFmpeg에 의해 계산되어 AWS X-RAY 메타데이터로 보내지고 Amazon S3 버킷에 키 접두사 /metrics/ffqm에 JSON 파일로 저장됩니다.

모든 JSON 파일은 Amazon Glue Crawler에 의해 크롤링됩니다. 이 크롤러는 Amazon Athena 테이블을 제공하여 SQL 요청을 통해 미디어 처리 작업의 성능을 분석할 수 있도록 해줍니다.

예를 들어, Athena 테이블이 데이터 세트를 Amazon QuickSight에 연결하여 막대형 차트를 시각화할 수 있습니다. 여기 차트에서 볼 수 있듯이, 여러 인스턴스 유형에서 실행된 비디오 압축 작업의 이름을 기준으로, 가장 효율적인 인스턴스 유형은 c5a.2xlarge 였습니다.

솔루션의 확장

필요하다면 사용자 원하는 대로 솔루션을 바꾸거나 확장할 수 있습니다. 예를 들어, 라이브러리를 추가하거나 FFmpeg 버전을 업그레이드하여 FFmpeg Docker 이미지를 사용자 지정할 수 있습니다. 모든 도커 파일은 application/docker-images/에 있습니다. 솔루션에서 사용하는 Amazon EC2 인스턴스 목록을 편집하여 성능을 최적화할 수 있는 새로운 인스턴스 유형으로 변경하고자 한다면, CDK 파일 cdk/batch_job_ffmpeg_stack.py에 있는 CDK 스택을 업데이트 하면됩니다.

비용

AWS Batch에는 추가 비용이 없습니다. 데이터를 저장하고 솔루션을 실행하기 위해 생성된 AWS 자원에 대해서만 비용을 지불하면 됩니다. 비용을 최적화하기 위해 스팟 인스턴스를 사용할 수 있습니다. 그리고 AWS X-Ray에서 제공하는 메트릭을 통해 모든 인스턴스를 벤치마킹하여 사용 사례에 가장 적합한 인스턴스를 찾을 수 있습니다.

정리하기

불필요한 요금이 발생하지 않도록 하려면 이 솔루션을 테스트하기 위해 만든 자원을 정리하시길 바랍니다.

  1. Amazon S3 버킷의 모든 개체를 삭제합니다.
  2. 터미널에서 Git 저장소로 이동한 다음, 명령을 실행합니다: task cdk:destroy

마무리

이 블로그에서는 AWS Batch로 관리되는 FFmpeg 워크플로우를 다루었습니다. 이 솔루션에서는 Amazon EC2 인스턴스 제품군의 비디오 인코딩 성능을 벤치마킹할 수 있는 옵션이 포함되어 있습니다. 이 솔루션은 EC2 스팟 인스턴스를 사용하는 확장 가능하고 비용 효율적인 AWS Batch 서비스에 의해 관리됩니다.

이 솔루션은 오픈 소스이며 http://github.com/aws-samples/aws-batch-with-ffmpeg/ 에서 확인하실 수 있습니다. GitHub 이슈를 통해 여러분의 피드백을 전달하실 수 있습니다.

Young-ook Kim

Young-ook Kim

김영욱 솔루션스 아키텍트는 다 년간의 클라우드 기반 대규모 글로벌 서비스의 설계, 개발 운영 경험을 바탕으로 다양한 산업군의 고객들이 효율적이고 안정적인 서비스를 운영할 수 있도록 기술 지원을 하고 있습니다. DevOps, 재해복구, 가버넌스, 비용 분석 등의 영역에서 AWS 클라우드를 잘 구성하고 운영할 수 있도록 다양한 모범 사례 공유, 기술 자문 등의 업무를 수행하고 있습니다.