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가지 주요 구성 요소가 포함되어 있습니다.
- 컨테이너 이미지는 Amazon Elastic Container Registry (Amazon ECR)에 저장됩니다. 각 컨테이너에는 Python 래퍼가 있는 FFmpeg 라이브러리가 포함되어 있습니다. 컨테이너 이미지는 CPU/GPU 아키텍처별로 특화되어 있습니다: ARM64, x86-64, NVIDIA.
- AWS Batch는 CPU 아키텍처별로 큐 및 컴퓨팅 환경으로 구성됩니다. AWS Batch는 비용을 최적화하기 위해 스팟 인스턴스 컴퓨팅 환경만을 사용하여 작업 큐를 스케줄링합니다.
- 고객은 AWS SDK를 통해 ‘SubmitJob’ 작업을 통해 작업을 제출하거나 Amazon API Gateway REST API를 사용하여 모든 HTTP 라이브러리로 작업을 쉽게 제출할 수 있습니다.
- 수집 및 제작된 모든 미디어 자산은 Amazon Simple Storage Service (Amazon S3)에 저장됩니다.
- 관측성은 Amazon CloudWatch와 AWS X-Ray에 의해 관리됩니다. 모든 X-Ray 추적은 특정 FFmpeg 명령에 대해 어떤 컴퓨팅 아키텍처가 더 나은지 벤치마킹하기 위해 Amazon S3로 보냅니다.
사전 준비 사항
솔루션을 구성하기 위해서는 다음의 사전 준비 사항이 필요합니다.
- AWS Identity and Access Management (AWS IAM) 역할과 정책을 생성할 수 있는 권한을 가진 AWS 계정. (보다 자세한 정보는 엑세스 관리 개요: 권한 및 정책을 참고하시기 바랍니다)
- 최신 버전의 AWS Cloud Development Kit (AWS CDK) 와 부트스트래핑 작업 완료
- 최신 버전의 Task
- 최신 버전의 Docker
- 최신 버전의 Python 3
AWS CDK를 활용한 솔루션 배포
“AWS Batch with FFmpeg“ 솔루션을 배포하기 위해서 다음의 절차를 따라합니다.
- https://github.com/aws-samples/aws-batch-with-ffmpeg GitHub 저장소를 클론합니다.
- 다음의 명령어를 실행합니다.
# 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 URLoutput_file_options
: 공식 문서에 설명된 FFmpeg 출력 파일 옵션output_url
: 로컬 저장소에서 S3 저장소로 동기화가된 S3 URLcompute
: 미디어 자원을 처리하는 데 사용할 인스턴스 제품군 설정: Intel, ARM, AMD, NVIDIAname
: 작업의 진행상황을 관측하기 위한 메타데이터
이 예제에서는 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에서 제공하는 메트릭을 통해 모든 인스턴스를 벤치마킹하여 사용 사례에 가장 적합한 인스턴스를 찾을 수 있습니다.
정리하기
불필요한 요금이 발생하지 않도록 하려면 이 솔루션을 테스트하기 위해 만든 자원을 정리하시길 바랍니다.
- Amazon S3 버킷의 모든 개체를 삭제합니다.
- 터미널에서 Git 저장소로 이동한 다음, 명령을 실행합니다:
task cdk:destroy
마무리
이 블로그에서는 AWS Batch로 관리되는 FFmpeg 워크플로우를 다루었습니다. 이 솔루션에서는 Amazon EC2 인스턴스 제품군의 비디오 인코딩 성능을 벤치마킹할 수 있는 옵션이 포함되어 있습니다. 이 솔루션은 EC2 스팟 인스턴스를 사용하는 확장 가능하고 비용 효율적인 AWS Batch 서비스에 의해 관리됩니다.
이 솔루션은 오픈 소스이며 http://github.com/aws-samples/aws-batch-with-ffmpeg/ 에서 확인하실 수 있습니다. GitHub 이슈를 통해 여러분의 피드백을 전달하실 수 있습니다.