Netflix

42 개의 포스트

netflixtechblog.com

태그로 필터

netflix5분 읽기큐레이션 요약

사일로에서 서비스 토폴로지로: 넷플릭스가 실시간 서비스 맵을 구축한 이유

넷플릭스는 수천 개의 마이크로서비스 간 실제 의존성을 실시간으로 보여주는 ‘Service Topology’를 구축했다. 기존의 지표·로그·트레이스는 시스템의 일부만 보여주므로, 장애 원인과 영향 범위를 파악하려면 엔지니어가 정보를 직접 조합해야 했다. Service Topology는 여러 데이터 소스로 네트워크와 애플리케이션 의존성 그래프를 만들고, 이를 통합해 빠르게 탐색할 수 있도록 하는 것이 핵심이다. ## 분산 시스템에서 의존성 파악이 어려운 이유 - 넷플릭스의 하나의 재생 요청도 인증, 추천, 인코딩 선택, 재생 최적화 등 수많은 서비스 호출을 발생시킨다. - 장애 상황에서 엔지니어가 즉시 확인해야 하는 질문은 다음과 같다. - 어떤 서비스가 서로 의존하는가? - 특정 서비스 장애나 점검의 영향 범위는 어디까지인가? - 문제가 상위 의존 서비스에서 시작됐는가, 현재 서비스가 다른 서비스로 전파하고 있는가? - 기존 관측 도구의 한계: - 메트릭은 성능 저하나 오류 같은 증상을 보여준다. - 로그는 개별 서비스의 동작을 보여준다. - 트레이스는 특정 요청의 흐름을 보여준다. - 그러나 시스템 전체의 지속적인 서비스 연결 구조를 한눈에 보여주지는 못한다. - 여러 도구의 정보를 엔지니어가 머릿속으로 조합해야 하므로, 장애 대응이 느리고 오류가 발생하기 쉽다. ## 실시간 서비스 맵이 필요한 배경 - 넷플릭스는 수천 개의 마이크로서비스와 수백 개의 엔지니어링 팀으로 운영된다. - 라이브 프로그램과 광고 지원 요금제 등 새로운 기능이 추가되면서 장애 조사와 모니터링의 신속성이 더욱 중요해졌다. - 특히 라이브 이벤트는 긴 장애 분석을 기다릴 수 없기 때문에 실시간에 가까운 의존성 정보가 필요하다. - 엔지니어 지원 요청을 분석한 결과, 다음과 같은 의존성 관련 질문이 반복적으로 제기됐다. - 상·하위 의존 서비스는 무엇인가? - 장애가 내 서비스 문제인가, 의존 서비스 문제인가? - 서비스를 중단하면 어떤 서비스가 영향을 받는가? - 메트릭에서 특정 서비스가 `Unknown`으로 표시되는 이유는 무엇인가? - 최근 호출 경로가 어떻게 바뀌었으며, 그것이 현재 문제와 관련 있는가? ## 기존 접근 방식에서 얻은 교훈 넷플릭스는 외부 그래프 데이터베이스와 상용 플랫폼을 검토하고, 다양한 저장 기술과 데이터 모델로 내부 프로토타입을 만들며 접근 방식을 발전시켰다. - **실시간성이 중요하다** - 하루 전 또는 몇 시간 전의 토폴로지는 자주 배포되는 환경에서는 이미 오래된 정보다. - 서비스 배포와 트래픽 변화에 따라 토폴로지가 거의 실시간으로 갱신되어야 한다. - **대규모 환경에서는 확장성이 핵심이다** - 소규모 환경에서 동작하는 저장소와 그래프 모델도 넷플릭스의 서비스 수와 트래픽 규모에서는 한계에 도달한다. - **기존 관측 생태계와의 통합이 필요하다** - 엔지니어가 새로운 도구와 작업 방식을 별도로 배워야 해서는 안 된다. - 기존 메트릭, 로그, 트레이스와 자연스럽게 연결되어야 한다. - **데이터 품질이 중요하다** - 누락되거나 잘못된 의존성 정보는 정보가 없는 것보다 위험하다. - 장애 상황에서 잘못된 원인이나 영향 범위를 판단하게 만들 수 있기 때문이다. - **단일 데이터 소스만으로는 부족하다** - 네트워크 연결 정보에는 애플리케이션 수준의 의미가 부족하다. - 애플리케이션 메트릭은 계측된 서비스만 포함할 수 있다. - 따라서 여러 관점의 데이터를 결합해야 한다. ## Service Topology의 요구사항 넷플릭스가 구축하려 한 것은 정적인 아키텍처 다이어그램이 아니라, 운영 상태를 계속 반영하는 ‘살아 있는 지도’였다. - 서비스 배포, 트래픽 변화, 신규 의존성 생성과 기존 의존성 제거를 실시간에 가깝게 반영한다. - 호출 그래프 탐색 결과를 1초 이내에 제공해야 한다. - 다음 두 계층을 모두 표현한다. - **네트워크 계층**: 실제로 어떤 서비스가 통신하는가 - **애플리케이션 계층**: 어떤 API와 엔드포인트가 호출되는가 - 단순한 연결 관계 외에도 다음 정보를 함께 표시한다. - 서비스 상태와 가용성 - 중요도 및 availability tier - 비즈니스 도메인 - 서비스 소유 팀 - 기타 운영 메타데이터 - 엔지니어가 탐색할 수 있는 UI뿐 아니라 자동화 시스템도 사용할 수 있는 프로그래밍 API를 제공한다. - 복원력 프레임워크 - 영향 범위 계산기 - 장애 대응 자동화 시스템 ## 세 가지 데이터 소스를 결합하는 구조 핵심 설계는 하나의 데이터 소스에 의존하지 않고, 서로 다른 관점에서 별도의 의존성 그래프를 구축하는 것이다. - 네트워크 계층, IPC 계층, 트레이싱 계층을 물리적으로 분리해 저장한다. - 각 계층은 독립적으로 발전하고 병렬로 조회할 수 있다. - 통합된 뷰가 필요할 때는 각 계층의 그래프를 동시에 탐색한 뒤 결과를 병합한다. - 이 구조를 통해 여러 계층을 함께 조회하더라도 1초 이내의 응답 시간을 목표로 한다. - 필요에 따라 통합된 그래프를 보거나, 특정 계층의 그래프만 독립적으로 분석할 수 있다. ## eBPF 기반 네트워크 흐름 첫 번째 데이터 소스는 커널 수준에서 eBPF로 수집한 네트워크 흐름 정보다. - 실제 네트워크 통신을 기반으로 어떤 서비스가 어떤 서비스에 연결되는지 기록한다. - 애플리케이션 계측 여부와 관계없이 실제 트래픽이 발생하는 모든 서비스를 포착할 수 있다. - 클러스터 간 통신과 애플리케이션 간 통신을 모두 파악할 수 있다. - 네트워크 트래픽이라는 실제 운영 데이터를 사용하므로 네트워크 계층의 기준점 역할을 한다. - 다만 네트워크 정보만으로는 어떤 API나 애플리케이션 기능이 호출됐는지 알기 어렵다. - 따라서 eBPF 데이터는 포괄적인 연결 관계를 제공하지만, 애플리케이션 의미를 해석하려면 IPC나 트레이싱 같은 추가 데이터가 필요하다. ## 운영 관점의 의미 - 서비스 토폴로지는 장애 원인 분석을 단순화하고, 상·하위 의존성 및 장애 전파 경로를 빠르게 확인하게 한다. - 서비스 중단이나 유지보수 전에 영향받을 서비스와 관련 팀을 파악할 수 있다. - UI와 API를 함께 제공함으로써 사람의 장애 대응과 자동화된 복원력·영향 분석을 모두 지원한다. - 정적인 아키텍처 문서보다 실제 트래픽과 현재 운영 상태를 반영하는 동적 지도가 분산 시스템에 더 유용하다. 실무적으로는 단일 관측 도구에 의존하기보다 네트워크 흐름, 애플리케이션 호출, 트레이싱 데이터를 결합해 의존성 정보를 구성하는 것이 좋다. 특히 대규모 마이크로서비스 환경에서는 실시간성, 데이터 정확성, 빠른 그래프 탐색, 기존 도구와의 통합을 초기 설계부터 핵심 요구사항으로 삼아야 한다.

원문 읽기(새 탭에서 열림)
netflix5분 읽기큐레이션 요약

Nebula ArchRules로 ArchUnit 확장하기

Netflix는 수만 개의 Java 저장소에서 공통 아키텍처 규칙과 기술 부채를 일관되게 점검하기 위해 ArchUnit을 여러 저장소에 배포·적용하는 Nebula ArchRules를 구축했다. ArchUnit은 AST가 아닌 JVM 바이트코드를 분석하므로 Java뿐 아니라 Kotlin·Scala에도 적용할 수 있고, 타입 안전한 Java API로 규칙을 작성·테스트할 수 있다. Nebula 플러그인은 이를 공유 가능한 Gradle 규칙 라이브러리로 확장해 조직 전체의 라이브러리 사용 규칙과 API 생명주기를 자동 검증한다. ## Netflix의 문제: 라이브러리 생명주기와 기술 부채 - Netflix는 수만 개의 Java polyrepo를 운영하므로 공통 빌드 로직과 품질 규칙을 여러 저장소에 배포해야 한다. - 하위 호환성을 깨는 라이브러리 변경 사고를 계기로, deprecated API를 언제 안전하게 제거할 수 있는지 파악할 필요가 생겼다. - API에는 다음과 같은 생명주기 애너테이션을 사용한다. - `@Deprecated`: 더 이상 사용하지 않도록 지정된 API - `@Public`: 하위 프로젝트가 사용하도록 공개된 API - `@Experimental`: 아직 안정성이 보장되지 않는 신규 API - 그 외 API: 기본적으로 내부 구현으로 간주 - 문제는 라이브러리 작성자가 어떤 downstream 프로젝트가 내부 API나 deprecated API를 잘못 사용하고 있는지 알기 어렵다는 점이다. - Spring Boot 주요 버전 업그레이드 같은 fleet-wide migration에서도 deprecated API 사용 현황을 파악하는 것이 중요하다. ## ArchUnit을 선택한 이유 - ArchUnit은 JUnit 테스트 안에서 아키텍처 규칙을 검증하는 오픈소스 라이브러리다. - ASM 기반으로 JVM 바이트코드를 분석하므로 특정 소스 언어의 문법에 덜 의존한다. - Java, Kotlin, Scala처럼 서로 다른 JVM 언어로 작성된 코드에도 같은 규칙을 적용할 수 있다. - 소스 코드의 syntactic sugar에 가려진 실제 실행 바이트코드까지 검사할 수 있다. - 규칙 작성 방식은 두 가지다. - 대부분의 규칙은 fluent builder API로 간결하게 작성한다. - 복잡한 분석에는 더 낮은 수준의 API와 클래스 관계 정보에 접근할 수 있다. - 분석 대상 전체 classpath를 읽고 클래스 간 의존성, 호출 관계, 소유자 등을 그래프로 유지한다. - 단순한 파일 단위 검사를 넘어 호출 사이트와 클래스 관계를 기준으로 규칙을 작성할 수 있다. ## AST 기반 도구와의 차이 - PMD 같은 AST 기반 도구는 소스 문법 구조를 직접 검사한다. - 언어별 문법 차이 때문에 Kotlin이나 Scala 지원 시 규칙을 별도로 작성해야 할 수 있다. - 예상하지 못한 문법적 표현으로 규칙을 우회할 가능성도 있다. - ArchUnit 규칙은 컴파일 결과인 바이트코드를 대상으로 하므로 코드가 어떤 JVM 언어로 작성됐는지보다 실제 동작 구조가 중요해진다. - PMD의 XPath 문자열 규칙과 달리 ArchUnit은 타입 안전한 Java 코드와 fluent API를 사용한다. - IDE 자동완성의 도움을 받을 수 있다. - 별도의 분석 프로세스를 구성하지 않고 규칙 객체와 클래스 목록을 직접 전달해 단위 테스트할 수 있다. ## 규칙 작성의 편의성 - ArchUnit에서는 다음과 같은 형태로 규칙을 표현할 수 있다. - 특정 클래스가 특정 타입에 의존하지 않아야 함 - 특정 생성자를 호출할 때 필수 인자를 전달해야 함 - 특정 패키지 간 의존성을 금지함 - 예를 들어 `DateTime` 객체를 시간대 정보 없이 생성하지 못하게 하는 규칙을 fluent API로 작성할 수 있다. - 규칙은 일반적인 Java 코드이므로 다음 작업이 쉽다. - 리팩터링 - IDE 기반 탐색 - 컴파일 시 오류 검출 - 단위 테스트 - 클래스 관계 그래프를 활용하면 단순한 이름 매칭보다 풍부한 맥락을 가진 규칙을 만들 수 있다. ## 공유 가능한 ArchRules 라이브러리 - 기본 ArchUnit은 하나의 저장소에서 JUnit 테스트로 사용하는 구조다. - Nebula ArchRules는 규칙을 별도 라이브러리로 패키징해 여러 Gradle 저장소에서 재사용할 수 있도록 한다. - `ArchRules Library Plugin`은 Gradle 프로젝트에 `archRules`라는 별도 source set을 추가한다. - 이 source set에는 `ArchRulesService`를 구현하는 클래스를 작성한다. - `ArchRulesService`는 `Map<String, ArchRule>`을 반환하는 단일 추상 메서드를 가진다. - map의 key는 규칙 이름이고 value는 실제 ArchUnit 규칙이다. - 규칙 코드는 본 애플리케이션 코드와 분리되어 별도의 JAR로 패키징된다. - 산출물에는 `arch-rules` classifier가 붙는다. - Gradle Module Metadata를 통해 `arch-rules` usage variant로 배포된다. - 따라서 downstream 프로젝트가 규칙을 사용하려면 Gradle Module Metadata 기반 의존성 해결이 필요하다. ## 독립형 규칙 라이브러리 - Standalone rule library는 본체 애플리케이션 코드 없이 `archRules`만 포함한다. - 다음과 같은 외부 코드 검사에 적합하다. - Java 표준 API 사용 규칙 - Guava 같은 오픈소스 라이브러리 사용 규칙 - 조직 공통 규칙 - `@Deprecated` API 사용 금지 - Netflix는 누구나 사용할 수 있는 OSS standalone 규칙 라이브러리 모음을 유지하며, 직접 규칙을 작성할 때 참고할 수 있는 예제로도 활용한다. ## 번들형 규칙 라이브러리 - Bundled rule library는 일반 라이브러리 코드와 해당 라이브러리 사용 규칙을 함께 배포한다. - `main` source set에는 라이브러리의 실제 기능을 담고, `archRules` source set에는 해당 라이브러리를 사용할 때 지켜야 할 규칙을 담는다. - 예를 들어 특정 라이브러리가 제공하는 공개 API의 올바른 사용법이나, 내부 API·deprecated API에 대한 접근 제한을 규칙으로 포함할 수 있다. - 라이브러리와 사용 규칙을 함께 배포하면 라이브러리 작성자가 권장 사용 방식을 downstream 빌드 과정에서 직접 검증할 수 있다. ## 실용적인 결론 ArchUnit은 단순한 단일 저장소용 아키텍처 테스트를 넘어, 바이트코드와 클래스 관계를 활용하는 범용 JVM 정적 분석 도구로 활용할 수 있다. 조직 차원에서는 Nebula ArchRules처럼 규칙을 별도 Gradle 라이브러리로 배포해 deprecated API 사용, 내부 API 접근, 라이브러리별 권장 패턴을 모든 저장소의 빌드 과정에서 자동 검증하는 방식이 효과적이다.

원문 읽기(새 탭에서 열림)
netflix4분 읽기큐레이션 요약

넷플릭스에서 머신러닝의 민주화: 모델 수명 주기 그래프 구축

Netflix는 ML 자산이 개인화, 스튜디오, 결제, 광고 등 여러 영역으로 확장되면서 모델과 데이터가 각기 다른 시스템에 고립되는 문제를 겪었다. 이를 해결하기 위해 다양한 ML 메타데이터를 통합하는 Metadata Service(MDS)와 Model Lifecycle Graph를 구축했다. MDS는 모델·피처·파이프라인·실험·데이터셋 등의 관계를 연결해 자산의 발견, 계보 추적, 영향 분석, 재사용을 가능하게 하는 기반이다. ## ML 생태계의 확장과 사일로 문제 - Netflix의 ML 활용 영역은 개인화 중심에서 다음과 같이 확대됐다. - 콘텐츠 추천과 사용자 참여 최적화 - 스튜디오의 제작 전후 작업 - 사기 탐지, 결제 라우팅, 정기 결제 최적화 - 광고 타기팅과 실시간 의사결정 - 각 도메인은 서로 다른 기술 스택, 비즈니스 지표, 조직 구조를 사용한다. - 그 결과 모델이 블랙박스처럼 고립되고, 다른 팀이 기존 모델과 데이터를 발견하거나 재사용하기 어려워졌다. - 예를 들어 스튜디오에서 만든 콘텐츠 임베딩은 장면 전환과 콘텐츠 구조를 분석하지만, 광고의 문맥 매칭이나 개인화 추천에도 활용될 수 있다. - 그러나 모델 레지스트리, 파이프라인 오케스트레이터, 실험 플랫폼이 분리되어 있어 다음 질문에 답하기 어렵다. - 어떤 피처와 데이터 소스가 존재하는가? - 특정 모델은 어떤 파이프라인과 데이터로 생성되는가? - 해당 모델을 사용하는 A/B 테스트는 무엇인가? - 피처를 변경하면 어떤 모델이 영향을 받는가? - 각 자산의 담당자는 누구인가? ## 통합 UI보다 어려운 메타데이터 연결 - 문제의 본질은 화면을 하나로 합치는 것이 아니라, ML 라이프사이클의 서로 다른 구성 요소를 연결하는 것이다. - Netflix에는 다음과 같은 시스템이 각각 메타데이터를 생성한다. - 파이프라인 오케스트레이션: 실행 정보, 단계 의존성, 데이터 변환 - 모델 레지스트리: 모델 버전, 아티팩트, 오래된 모델 여부, 배포 이력 - 실험 플랫폼: A/B 테스트와 설정 - 피처 스토어: 피처 정의와 사용처 - AI Dataset 플랫폼: 데이터셋 생성, 관리, 검색, 로딩 - Identity 플랫폼: 사용자, 팀, 조직 정보 - 시스템마다 데이터 형식, 식별자, 개념 모델이 다르기 때문에 이질적인 메타데이터를 하나의 엔터티 모델로 변환하고 관계 그래프로 만드는 작업이 핵심 기술 과제가 됐다. ## Metadata Service와 Model Lifecycle Graph - MDS는 Netflix 전반의 ML 관련 엔터티를 색인하고 서로 연결하는 서비스다. - 모델, 피처, 파이프라인, 실험, 데이터셋 등의 메타데이터를 실시간으로 수집한다. - 다음과 같은 교차 도메인 질의를 지원하는 것을 목표로 한다. - 특정 모델을 실행 중인 실험은 무엇인가? - 특정 피처를 공유하는 모델은 무엇인가? - 모델에 사용된 데이터와 생성 파이프라인은 무엇인가? - MDS의 역할은 다음과 같다. - 여러 시스템에서 이벤트 수집 - 메타데이터에 조직·소유자 등 추가 맥락 결합 - ML 자산 간 관계 추론 및 구체화 - 연결된 그래프 형태로 탐색 가능하게 제공 - 궁극적인 목표는 모든 ML 자산을 팀과 도메인에 관계없이 발견하고, 이해하고, 재사용할 수 있도록 만드는 것이다. ## URI 기반 핵심 추상화 MDS는 시스템 간 일관된 연결을 위해 AI Platform URI를 사용한다. - **Component** - 고유한 URI로 주소 지정할 수 있는 모든 객체다. - 형식은 다음과 같다. ```text aip://<componentType>/<platformId>/<resourceId> ``` - 예: ```text aip://model/registry/ranking-v5 aip://user/identity/alice aip://pipeline/orchestrator/weekly-training ``` - **Entity** - 이름, 설명, 생성일, 소유자 등 추가 속성을 가진 ML 생태계의 구성 요소다. - 모델, 피처, 파이프라인 등이 이에 해당한다. - **Entity Type** - 동일한 데이터 구조와 속성·관계 제약을 공유하는 엔터티 집합이다. - **Domain** - 관련 엔터티 타입을 묶고 해당 ML 자산 범주의 추상 인터페이스를 정의한다. - 예를 들어 Models 도메인은 Model과 Model Instance를, Pipelines 도메인은 Schedule·Request·Execution을 정의한다. - **Provider** - 도메인을 실제로 구현하는 특정 소스 시스템이다. - 하나의 도메인에 여러 Provider를 연결할 수 있어, 모델 레지스트리가 교체되더라도 도메인 인터페이스를 변경하지 않고 확장할 수 있다. - URI는 서비스 간 ML 자산 참조를 단일 문자열로 통일하고, MDS가 이를 풍부한 메타데이터와 연결된 관계로 해석할 수 있게 한다. ## 이벤트에서 엔터티와 그래프로 - MDS는 Kafka와 AWS SNS/SQS를 통해 소스 시스템의 이벤트를 실시간으로 수집한다. - 소스 시스템은 식별자와 이벤트 유형 중심의 얇은 이벤트를 발행한다. - 예시는 다음과 같다. ```json { "event_type": "model_instance_created", "instance_id": "ranking-model-v5-20XX0101" } ``` - 생산 시스템은 복잡한 그래프 로직을 알 필요 없이 간단한 이벤트만 발행하고, MDS가 이를 엔터티로 변환하고 다른 시스템의 정보와 결합한다. - 이후 모델, 파이프라인, 피처, A/B 테스트 등의 관계를 추론해 질의 가능한 Model Lifecycle Graph로 materialize한다. - 이를 통해 모델 생성 이벤트와 실험 설정을 연결하는 것처럼, 서로 다른 시스템에 존재하는 관계도 하나의 그래프에서 탐색할 수 있다. MDS와 Model Lifecycle Graph는 단순한 모델 카탈로그가 아니라, ML 자산의 생성부터 배포·실험·재사용까지를 연결하는 메타데이터 인프라다. 여러 팀이 공통 URI와 엔터티 모델을 사용하도록 만들면 모델의 검색성, 의존성 파악, 변경 영향 분석, 조직 간 재사용이 크게 향상된다.

원문 읽기(새 탭에서 열림)
netflix원문

모델 서빙의 라우팅 현황 (새 탭에서 열림)

넷플릭스는 대규모 개인화 경험을 제공하기 위해 수백 개의 모델과 초당 100만 건의 요청을 처리하는 중앙 집중식 머신러닝(ML) 모델 서빙 플랫폼을 운영하고 있습니다. 이 플랫폼은 'Switchboard'라는 라우팅 계층을 통해 클라이언트 마이크로서비스와 복잡한 ML 모델 인프라를 분리하여, 클라이언트의 수정 없이도 새로운 모델을 신속하게 실험하고 배포할 수 있는 환경을 구축했습니다. 이를 통해 넷플릭스는 모델 추론뿐만 아니라 데이터 전처리 및 특징 추출을 포함한 전체 워크플로우를 표준화된 API로 추상화하여 혁신의 속도를 높이고 있습니다. ### 넷플릭스의 워크플로우 중심 모델 정의 * 넷플릭스에서 모델은 단순한 추론 함수(`score(features)`)를 넘어, 입력 데이터 변환, 특징(feature) 계산, 추론, 후처리를 모두 포함하는 독립적인 '워크플로우'로 정의됩니다. * 클라이언트는 사용자 ID나 국가와 같은 최소한의 컨텍스트만 제공하며, 모델 서빙 플랫폼이 필요한 데이터를 다른 마이크로서비스에서 가져와 직접 특징을 계산합니다. * 이러한 구조 덕분에 클라이언트는 모델의 내부 로직이나 데이터 의존성을 알 필요가 없으며, 모델의 아키텍처가 변하더라도 클라이언트 코드를 수정할 필요가 없습니다. ### 중앙 집중형 라우팅 엔진, Switchboard * 넷플릭스는 표준 API 게이트웨이나 서비스 메시가 제공하지 못하는 실험 플랫폼과의 통합, gRPC 지원, 도메인 특화 라우팅을 구현하기 위해 자체 프록시 서비스인 'Switchboard'를 개발했습니다. * Switchboard는 클라이언트 요청을 적절한 모델 인스턴스와 클러스터 샤드로 전달하는 역할을 수행하며, 초당 100만 건 이상의 요청을 처리하면서도 높은 가용성을 유지합니다. * 모델 배포 시 섀도 모드(Shadow mode), 카나리 배포(Canary), 롤백 등을 클라이언트 모르게 수행할 수 있어 안전한 운영이 가능합니다. ### 인프라 복잡성을 감추는 모델 샤딩 분리 * 모델은 트래픽 패턴, SLA, CPU/메모리 요구사항에 따라 여러 연산 클러스터 샤드(VIP 주소)에 분산 배치됩니다. * 서빙 플랫폼은 이러한 물리적 배치 상태를 클라이언트로부터 은폐하여, 인프라의 변경이나 모델의 샤드 이동이 클라이언트 서비스에 영향을 주지 않도록 설계되었습니다. * 이를 통해 ML 연구자는 인프라 제약 없이 자유롭게 실험을 설계하고 모델을 배포할 수 있습니다. ### 'Objective' 기반의 추상화 계층 * 플랫폼은 'Objective'라는 열거형(Enum) 단위를 통해 모든 요청을 관리하며, 이는 비즈니스 목적(예: 콘텐츠 추천, 결제 사기 탐지)을 나타냅니다. * Objective는 요청이 전달될 특정 서빙 클러스터와 모델 유형/버전을 결정하는 기준이 됩니다. * 또한, 각 Objective는 고유한 API 규격을 정의하여 서로 다른 도메인의 클라이언트가 동일한 방식으로 플랫폼과 통신할 수 있도록 표준화합니다. 성공적인 대규모 ML 시스템을 구축하려면 모델의 생명주기를 클라이언트 애플리케이션으로부터 완전히 격리해야 합니다. 넷플릭스의 사례처럼 워크플로우 단위의 모델 정의와 'Objective' 중심의 라우팅 추상화를 도입함으로써, 인프라의 복잡성을 관리하면서도 머신러닝 혁신의 속도를 극대화할 수 있습니다.

netflix원문

넷플릭스의 카메라 파일 처리 규모 확장 (새 탭에서 열림)

넷플릭스는 전 세계에서 생성되는 방대한 양의 카메라 원본 푸티지를 효율적으로 처리하기 위해 '미디어 프로덕션 스위트(MPS)'를 구축하고, 이를 업계 표준 솔루션인 FilmLight API(FLAPI)와 통합했습니다. 자체 엔진을 처음부터 개발하는 대신 검증된 외부 기술을 클라우드 기반의 서버리스 환경에 내재화함으로써, 복잡한 메타데이터 관리와 고해상도 이미지 프로세싱의 일관성을 확보했습니다. 이를 통해 제작 현장의 수동 작업을 자동화하고 기술적 오류를 최소화하여 창작자들이 오로지 작품의 퀄리티에만 집중할 수 있는 확장성 있는 제작 생태계를 마련했습니다. ### 미디어 프로덕션 스위트(MPS)의 도입 배경 * **제작 복잡도 해소**: 글로벌 제작 규모가 커짐에 따라 파일 관리 업무(File Wrangling)가 창의적인 의사결정 시간을 잠식하고, 지역 및 업체별로 미디어 처리 방식이 일관되지 않는 문제가 발생했습니다. * **휴먼 에러 방지**: 수동으로 진행되는 미디어 관리 프로세스는 실수가 발생하기 쉽고 감사(Audit)가 어려워, 이를 자동화하고 표준화할 필요성이 커졌습니다. * **효율성 극대화**: 반복적인 워크플로우를 공통 플랫폼으로 통합하여 프로덕션부터 포스트 프로덕션까지의 미디어 이동을 간소화하고자 했습니다. ### 핵심 엔진으로서의 FilmLight API(FLAPI) 통합 * **신뢰성 있는 컬러 사이언스**: 업계에서 널리 사용되는 Baselight 및 Daylight의 엔진을 API 형태로 활용하여, 다양한 카메라 포맷에 대한 검증된 디베이어링(Debayering)과 컬러 처리를 보장받았습니다. * **최신 포맷 대응**: 매번 출시되는 새로운 카메라와 녹화 포맷에 대응하기 위해 자체 엔진을 유지보수하는 대신, 전문 파트너사인 FilmLight의 기술력을 활용해 유연성을 확보했습니다. * **인프라 호환성**: FLAPI를 도커(Docker) 이미지로 패키징하여 넷플릭스의 클라우드 인프라와 전 세계 프로덕션 컴퓨팅 센터에 동일하게 배포함으로써 작업의 일관성을 유지합니다. ### 메타데이터 파싱 및 워크플로우 검사 * **데이터 정규화**: 푸티지 입고 시 FLAPI를 통해 카메라 메타데이터를 추출하고, 이를 넷플릭스의 표준 스키마로 변환하여 하위 프로세스에서 검색 및 재사용이 가능하도록 만듭니다. * **자동화된 검증**: 타임코드 및 릴(Reel) 이름을 기반으로 푸티지를 매칭하고, 처리 과정에서 발생할 수 있는 오류를 추적하거나 파이프라인 전체의 유효성을 검사하는 데 활용합니다. ### VFX 플레이트 생성 및 결과물 자동화 * **정밀한 이미지 처리**: ASC FDL(Framing Decision Lists)을 활용한 크롭 및 디스퀴즈(De-squeeze), AMF(ACES Metadata Files)를 통한 일관된 컬러 파이프라인 적용으로 정확한 VFX 소스를 생성합니다. * **워크플로우 일관성**: 제작 현장의 데일리 작업부터 최종 완성 단계까지 동일한 컬러 변환이 적용되도록 보장하며, 이를 통해 VFX 업체 등 협업 파트너에게 정확한 OpenEXR 파일을 제공합니다. * **사전 검증**: 워크플로우 전문가가 워크스테이션에서 내린 결정사항을 클라우드 파이프라인에 그대로 적용하여 실제 촬영 시작 전 프로세스를 완벽히 검증할 수 있습니다. ### 클라우드 네이티브 미디어 팩토리 아키텍처 * **서버리스 및 컨테이너화**: 고성능 GPU 워크스테이션에 의존하는 전통적인 방식에서 벗어나, 리눅스 도커 이미지 기반의 서버리스 함수로 작업을 분산 처리합니다. * **CPU 기반 확장성**: 특정 고사양 하드웨어 대신 범용 CPU 인스턴스에서 작동하도록 최적화하여, 클라우드의 유연한 컴퓨팅 자원을 활용한 대규모 병렬 처리를 실현했습니다. * **상태 없는(Stateless) 운영**: 각 작업 단위가 독립적이고 상태를 유지하지 않도록 설계하여, 오류 발생 시 즉각적으로 재실행할 수 있는 높은 운영 신뢰성을 확보했습니다. 넷플릭스의 사례는 모든 기술을 내재화하기보다 업계 표준 솔루션을 클라우드 네이티브 환경에 전략적으로 통합함으로써 얻을 수 있는 확장성의 이점을 잘 보여줍니다. 대규모 미디어 처리가 필요한 기업이라면 단일 장비의 성능 향상보다는 작업을 원자화(Atomicity)하고 API 기반의 클라우드 병렬 처리 구조를 구축하는 것이 비용 효율성과 안정성 측면에서 유리합니다.

netflix원문

휴먼 인프라: 넷플릭스가 대규모 라이브를 위해 운영 레이어를 구축한 방법 (새 탭에서 열림)

넷플릭스는 2023년 첫 라이브 스트리밍 이후, 개발자가 직접 운영하던 임시 체계에서 벗어나 전 세계 수천만 명에게 고품질 생중계를 제공하기 위한 전문적인 '운영 계층(Operations Layer)'을 구축했습니다. 이를 위해 방송 운영 센터(BOC)라는 물리적 거점을 마련하고, 소프트웨어 엔지니어링과 전통적인 방송 기술을 결합한 다층적 운영 모델을 설계했습니다. 결과적으로 넷플릭스는 한 달에 단 하나의 쇼를 송출하던 수준에서 하루 9개 이상의 대규모 이벤트를 동시에 처리할 수 있는 글로벌 라이브 인프라를 완성했습니다. ### 방송 운영 센터(BOC)와 하이브리드 아키텍처 * **중앙 집중형 제어 시스템:** BOC는 경기장이나 공연장에서 오는 원본 피드를 수신하여 검사, 보정, 자막 삽입 및 광고 관리를 수행하는 핵심 '칵핏(Cockpit)' 역할을 합니다. * **허브 앤 스포크(Hub-and-Spoke) 모델:** 각 이벤트 현장의 특수성에 의존하지 않도록 BOC를 거점으로 하는 표준화된 경로를 구축하여 반복 가능하고 안정적인 송출 환경을 조성했습니다. * **기술 표준 채택:** 이중 인터넷 회선과 SMPTE 2022-7의 'Seamless Switching(무중단 전환)' 기술을 활용해 물리적 장애 발생 시에도 중단 없는 신호 전환이 가능하도록 설계했습니다. ### 현장 신호의 신뢰성 확보를 위한 엄격한 규격 * **3중 전송 경로:** 넷플릭스는 주요 피드 전송 시 전용 광섬유(Fiber), 위성(Satellite), 그리고 기업용 인터넷 기반의 SRT 시스템이라는 세 가지 독립적인 전송 경로를 필수로 요구합니다. * **하드웨어 및 전력 중복성:** 단일 장애점(SPOF)을 제거하기 위해 현장 중계차 내에서도 별도의 라우터 라인 카드와 전송 장비를 사용하며, 모든 장비는 이중화된 전원(UPS) 및 서지 보호 장치를 갖추어야 합니다. * **FACS/FAX 테스트:** 방송 직전 오디오/비디오 싱크, 레이턴시, 품질 테스트를 포함한 정밀 검사를 수행하여 자막 검증과 백업 스위처 입력 상태를 완벽하게 점검합니다. ### 인간 인프라: 운영 모델의 4단계 진화 * **1단계: 엔지니어 직접 운영:** 초기에는 코드를 작성한 소프트웨어 엔지니어가 직접 대시보드를 모니터링하며 슬랙으로 소통하는 '올핸즈(All-hands)' 방식으로 운영되었으나, 확장성 한계에 부딪혔습니다. * **2단계: 전문 엔지니어링 도입(SOE & BOE):** 스트리밍 파이프라인 설정을 담당하는 스트리밍 운영 엔지니어(SOE)와 물리적 방송 장비 및 시설을 관리하는 방송 운영 엔지니어(BOE)로 역할을 분리했습니다. * **3단계: 코파일럿(Co-pilot) 모델:** 비행기 조종사처럼 두 명의 운영자(BCO)가 한 팀이 되어 하나의 이벤트를 집중 관리하는 방식으로, 고도의 품질이 필요한 초기 라이브 쇼에 최적화되었습니다. * **4단계: 전송 운영 센터(TOC) 함대 모델:** 하루에 수십 개의 경기가 열리는 월드 베이스볼 클래식(WBC)과 같은 대규모 토너먼트를 지원하기 위해, 다수의 이벤트를 동시에 관리할 수 있는 고밀도 운영 모델로 전환했습니다. 실시간 방송은 일반적인 VOD 서비스와 달리 '일시 중지'나 '롤백'이 불가능합니다. 넷플릭스의 사례는 대규모 라이브 서비스를 성공시키기 위해서는 단순한 소프트웨어 기술력을 넘어, 물리적 인프라와 전문화된 운영 인력이라는 '인적 인프라'가 반드시 병행되어야 함을 시사합니다. 특히 장애 발생 시 즉각 대응할 수 있는 전문 역할군(SOE, BOE)의 분리와 엄격한 하드웨어 가이드라인 수립은 안정적인 서비스 운영을 위한 필수 요소입니다.

netflix원문

LLM-as-a-Judge를 활용한 넷플릭스 쇼 시놉시스 평가 (새 탭에서 열림)

넷플릭스는 방대한 콘텐츠 카탈로그에 맞춰 수십만 개의 시놉시스 품질을 효율적으로 관리하기 위해 'LLM-as-a-Judge' 시스템을 도입했습니다. 이 시스템은 창의적인 전문 작가들의 평가 기준을 학습하여 시놉시스의 품질을 85% 이상의 일치율로 평가하며, 실제 스트리밍 지표와도 높은 상관관계를 보입니다. 이를 통해 넷플릭스는 작품 공개 수주 전부터 부적절한 시놉시스를 선제적으로 식별하고 개선함으로써 사용자 경험을 최적화하고 있습니다. ### 시놉시스 품질의 두 가지 정의 * **창의적 품질(Creative Quality):** 전문 작가진이 정의한 내부 가이드라인과 루브릭에 따라 시놉시스의 톤, 명확성, 정밀도 등을 평가합니다. 초기에는 전문가 간 합의율이 낮았으나, 리커트 척도 대신 이진(Binary) 점수를 사용하고 일반적인 오류 체계를 구축하여 합의율을 80%까지 끌어올렸습니다. * **사용자 암묵적 피드백(Member Implicit Feedback):** 시놉시스를 본 사용자가 시청을 시작하는 비율인 '시청 전환율(Take Fraction)'과 시청 시작 후 곧 중단하는 '중도 이탈률(Abandonment Rate)'을 통해 품질을 측정합니다. 이 지표들은 장기적인 사용자 유지율을 예측하는 핵심 대리 지표로 활용됩니다. * **골든 데이터셋 구축:** 600개의 시놉시스에 대해 전문가 평가와 모델 기반 합의 프로세스를 거쳐 고품질의 기준 데이터를 마련했습니다. ### LLM 기반 평가 시스템 설계 * **기준별 전용 평가 모델:** 하나의 프롬프트로 모든 항목을 평가하면 성능이 저하되므로, 각 품질 기준(명확성, 톤 등)마다 독립적인 LLM 평가기를 할당했습니다. * **자동 프롬프트 최적화(APO):** LLM이 프롬프트 어구에 민감하게 반응하는 점을 고려하여, 약 300개의 샘플을 활용해 프롬프트를 자동으로 최적화하고 전문가가 이를 수동으로 미세 조정했습니다. * **추론 과정의 투명성:** 모든 평가기는 최종 점수를 내기 전에 반드시 근거(Explanation)를 먼저 출력하도록 설계하여 결과에 대한 신뢰도를 높였습니다. ### 추론 시간 최적화를 통한 성능 향상 * **계층적 추론(Tiered Rationales):** 추론 내용이 길어질수록 정확도는 높아지지만 인간의 가독성은 떨어지는 문제를 해결하기 위해 도입되었습니다. LLM이 자유롭게 길게 추론한 뒤, 최종 점수 출력 직전에 핵심 요약을 제공하도록 하여 정확도와 가독성을 동시에 잡았습니다. * **합의 점수 산출(Consensus Scoring):** 동일한 시놉시스에 대해 여러 번 결과값을 샘플링하고 이를 집계하여 최종 점수를 결정함으로써, 주관적인 평가 영역에서 발생할 수 있는 오류를 줄였습니다. * **성능 검증:** 톤(Tone) 평가 기준에서 계층적 추론 도입 시 정확도가 86.55%에서 87.85%로 향상되는 등 추론 시간(Inference-time) 확장이 유의미한 효과를 거두었습니다. 사용자의 선택을 돕는 텍스트 데이터의 품질 관리는 대규모 플랫폼의 필수 과제입니다. 넷플릭스의 사례처럼 단순한 결과 도출을 넘어 **'추론 과정의 확장'**과 **'전문가 데이터 기반의 정렬'**을 결합한다면, 창의적이고 주관적인 영역에서도 LLM을 강력한 품질 관리 도구로 활용할 수 있을 것입니다.

netflix원문

똑같은 질문에 두 번 답하지 마세요: 넷플릭스 규모의 Druid를 위한 인터벌 인식 캐싱 (새 탭에서 열림)

넷플릭스는 Apache Druid를 통해 초당 1,500만 건 이상의 이벤트를 처리하며 대규모 실시간 분석을 수행하고 있으나, 대시보드의 롤링 윈도우(Rolling Window) 쿼리가 생성하는 중복 부하 문제를 해결해야 했습니다. 이를 위해 쿼리에서 시간 범위를 분리하여 처리하는 '구간 인식 캐싱(Interval-Aware Caching)' 레이어를 구축하여 Druid의 계산 리소스를 효율화했습니다. 이 시스템은 과거의 안정된 데이터는 캐시에서 불러오고 오직 최신 데이터만 Druid에 요청함으로써, 대규모 트래픽 상황에서도 쿼리 성능을 안정적으로 유지합니다. ### 기존 캐싱 방식의 한계와 문제점 * **롤링 윈도우의 비효율성**: 실시간 모니터링 대시보드는 10~30초마다 "최근 3시간"과 같은 쿼리를 반복해서 보냅니다. 시간 범위가 계속 이동하기 때문에 Druid의 기존 전체 결과 캐시(Full-result cache)는 매번 미스(Miss)가 발생합니다. * **실시간 데이터 캐싱 제한**: Druid는 데이터의 정확성을 위해 실시간 인덱싱 중인 세그먼트의 결과는 캐싱하지 않습니다. 이로 인해 대시보드가 갱신될 때마다 동일한 실시간 세그먼트를 반복해서 스캔하는 낭비가 발생합니다. * **하드웨어 확장의 한계**: 수십 명의 엔지니어가 동일한 대시보드를 볼 때 발생하는 수천 개의 중복 쿼리를 처리하기 위해 단순히 하드웨어를 증설하는 것은 비용 효율성이 매우 낮습니다. ### 구간 인식 캐싱의 핵심 아이디어 * **데이터의 안정성 활용**: 3시간 전의 데이터는 이미 확정되어 변하지 않지만, 최근 1분 내의 데이터는 지연 도착 등으로 인해 변할 수 있습니다. 이 차이를 이용해 오래된 데이터는 캐시에서 즉시 반환하고, 최신 구간만 Druid에 쿼리합니다. * **쿼리 구조와 시간의 분리**: 쿼리문에서 시간 범위(Interval)를 제외한 나머지 구조(필터, 집계 등)를 SHA-256으로 해싱하여 캐시 키로 사용합니다. 이를 통해 서로 다른 시간 범위를 가진 동일한 목적의 쿼리들이 동일한 캐시 항목을 참조할 수 있게 합니다. * **버킷팅(Bucketing) 구조**: 데이터를 쿼리 단위(예: 1분)별로 잘게 쪼개어 'Map-of-Maps' 형태로 저장합니다. 쿼리가 들어오면 필요한 시간 범위에 해당하는 버킷들을 캐시에서 조회하고, 없는 부분만 골라냅니다. ### 지수적 TTL을 통한 효율적인 데이터 관리 * **신선도와 부하의 트레이드오프**: 데이터 파이프라인의 지연 시간을 고려해 최신 데이터에 약 5초의 캐시 유지 시간(TTL)을 부여합니다. 이는 대시보드 사용자에게는 거의 실시간으로 느껴지면서도 Druid의 부하를 대폭 줄여줍니다. * **데이터 연령에 따른 TTL 차등화**: 데이터가 생성된 지 얼마 안 된 버킷은 5~10초의 짧은 TTL을 가집니다. 데이터가 오래될수록 나중에 도착하는 이벤트가 적어지므로, TTL을 지수적으로 늘려 최대 1시간까지 캐시에 보관합니다. * **자동 보정**: 짧은 TTL 덕분에 최신 데이터 구간에서 발생하는 수정 사항은 빠르게 캐시에 반영되며, 오래된 구간은 긴 TTL을 통해 캐시 적중률을 극대화합니다. ### 시스템 구현 및 작동 워크플로우 * **투명한 프록시 구조**: Druid Router 단계에서 요청을 가로채는 외부 서비스 형태로 구현되었습니다. 클라이언트 앱을 수정할 필요 없이 캐싱 기능을 끄거나 켤 수 있습니다. * **쿼리 분해 및 병합**: 1. 들어온 쿼리를 파싱하여 시간 구간을 확인하고 캐시 키(해시)를 생성합니다. 2. 캐시 저장소(예: Redis/Memcached)에서 요청된 구간에 해당하는 연속된 버킷들을 확인합니다. 3. 캐시에 없는 '가장 최신의 불안정한 구간'으로 쿼리 범위를 축소하여 Druid에 요청합니다. 4. 캐시된 결과와 Druid에서 새로 가져온 결과를 병합하여 클라이언트에 반환합니다. 롤링 윈도우 기반의 대규모 대시보드를 운영하는 환경이라면, 모든 데이터를 매번 다시 계산하기보다 이처럼 시간 구간을 나누어 캐싱하는 전략이 Druid 클러스터의 비용 절감과 성능 향상에 매우 효과적입니다. 특히 데이터가 확정되는 속도에 따라 TTL을 다르게 가져가는 '지수적 TTL' 방식은 데이터 정확도와 효율성 사이의 균형을 잡는 유용한 기술적 패턴입니다.

netflix원문

비디오 검색을 위한 멀티모달 인텔리전스 구현 (새 탭에서 열림)

넷플릭스는 방대한 분량의 원본 영상 데이터에서 창작자가 원하는 특정 순간을 신속하게 찾아낼 수 있도록 여러 전문 AI 모델을 결합한 멀티모달(Multimodal) 검색 시스템을 구축했습니다. 이 시스템은 캐릭터, 환경, 대화 등 서로 다른 모델이 생성한 파편화된 신호들을 하나의 통합된 시간축으로 동기화하여 고차원의 문맥 이해와 실시간 검색을 동시에 실현합니다. 결과적으로 수십억 개의 데이터 포인트 속에서도 창작자의 의도에 부합하는 장면을 지연 시간 없이 정확하게 찾아내는 기술적 해결책을 제시합니다. **비디오 검색의 기술적 복잡성과 한계** * **타임라인 통합의 어려움:** 각 모델은 비디오를 서로 다른 간격으로 분석하여 텍스트 레이블이나 벡터 임베딩 등 상이한 형태의 메타데이터를 생성하므로, 이를 하나의 연대기적 지도로 정렬하는 데 막대한 계산 비용이 발생합니다. * **데이터 규모의 폭발:** 2,000시간 분량의 아카이브는 약 2억 1,600만 프레임에 달하며, 이를 여러 모델로 처리할 경우 수십억 개의 레이블과 벡터 데이터가 생성되어 전통적인 데이터베이스로는 처리가 불가능합니다. * **중복 제거와 하이브리드 스코어링:** 시각적으로 유사한 수천 개의 후보 중 최적의 클립을 제안하기 위해, 단순한 수학적 유사도를 넘어 상징적 텍스트 매칭과 의미론적 벡터 검색을 결합한 정교한 랭킹 엔진이 필요합니다. * **제로 프릭션(Zero-Friction) 검색:** 창작 흐름을 방해하지 않기 위해 수십억 개의 레코드를 탐색하면서도 초 단위 미만의 응답 속도를 유지해야 하는 물리적 제약이 존재합니다. **데이터 수집 및 융합 파이프라인 (Ingestion & Fusion)** * **트랜잭션 영속화 (Transactional Persistence):** 고가용성 파이프라인을 통해 수집된 모델의 원본 주석(Annotation)을 Apache Cassandra에 저장합니다. 이 단계에서는 데이터 무결성과 빠른 쓰기 처리량을 최우선으로 하여 모든 모델 출력을 안전하게 확보합니다. * **오프라인 데이터 융합 (Offline Data Fusion):** Apache Kafka를 통해 비동기적으로 실행되며, 파편화된 모델 데이터를 1초 단위의 '시간 버킷(Temporal Buckets)'으로 정규화합니다. 예를 들어 '조이'라는 캐릭터와 '주방'이라는 배경이 겹치는 구간을 하나의 통합 레코드로 병합하여 복합적인 쿼리가 가능하도록 만듭니다. * **실시간 검색 인덱싱:** 융합된 데이터를 Elasticsearch에 인덱싱합니다. 이때 자산 ID와 시간 버킷을 조합한 복합 키(Composite Key)를 사용하여 업서트(Upsert) 방식으로 데이터를 갱신함으로써 데이터 중복을 방지하고 단일 진실 공급원(Single Source of Truth)을 유지합니다. **효율적인 멀티모달 시스템을 위한 제언** 대규모 영상 자산을 관리하는 시스템에서는 원본 데이터를 실시간으로 검색하는 대신, 데이터를 수집-융합-인덱싱 단계로 분리(Decoupling)하여 처리하는 구조가 필수적입니다. 특히 서로 다른 AI 모델의 출력을 공통된 시간 단위(Time Bucketing)로 정규화하여 저장함으로써, 복잡한 다차원 검색 시 발생하는 계산 부하를 오프라인에서 미리 해결하고 사용자에게는 즉각적인 검색 경험을 제공할 수 있습니다.

netflix원문

대규모 환경에서의 더 스마트한 라이브 스트리밍: 모든 넷플릭스 라이브 이벤트에 VBR 도입 (새 탭에서 열림)

넷플릭스는 전 세계 라이브 스트리밍 서비스의 효율성과 품질을 최적화하기 위해 기존의 고정 비트레이트(CBR) 방식을 가변 비트레이트(VBR)로 전면 교체했습니다. VBR 도입을 통해 네트워크 트래픽을 평균 15% 절감하고 리버퍼링 현상을 5% 줄이는 성과를 거두었으나, 장면 복잡도에 따라 급변하는 비트레이트 특성상 서버 과부하를 예측하기 어려워지는 기술적 과제에 직면했습니다. 이를 해결하기 위해 넷플릭스는 실시간 트래픽 수치 대신 명목 비트레이트(Nominal Bitrate)를 기준으로 서버 용량을 예약 관리하는 전략을 도입하여 대규모 생중계 환경에서도 시스템 안정성을 확보했습니다. ## 라이브 스트리밍에 VBR을 도입한 이유 * **전송 효율 극대화**: CBR은 정적인 장면에서도 고정된 데이터를 소모하여 대역폭을 낭비하지만, VBR(QVBR)은 장면의 복잡도가 낮을 때 비트레이트를 대폭 낮추고 복잡한 장면에서만 비트를 집중 투입하여 효율을 높입니다. * **사용자 경험 개선**: 데이터 전송량이 평균적으로 감소함에 따라 시작 지연 시간(Start-up delay)이 단축되고, 시간당 리버퍼링 발생 횟수가 약 5% 감소하는 효과를 확인했습니다. * **네트워크 부하 경감**: 전체 이벤트 전송 바이트는 15%, 피크 타임 트래픽은 약 10% 감소하여 넷플릭스의 자체 CDN인 오픈 커넥트(Open Connect)의 운영 효율이 크게 향상되었습니다. ## 가변 비트레이트가 유발하는 시스템 불안정성 * **예측 불가능한 트래픽 패턴**: CBR 환경에서는 현재 트래픽을 통해 서버 수용량을 쉽게 예측할 수 있었으나, VBR은 화면 구성에 따라 비트레이트가 급락하거나 치솟기 때문에 단순 측정만으로는 서버의 실제 여유 자원을 판단하기 어렵습니다. * **서버 과점유(Over-admitting) 위험**: 잔잔한 장면이 이어져 비트레이트가 낮게 유지될 때, 트래픽 스티어링 시스템이 서버가 유휴 상태라고 판단하여 너무 많은 세션을 할당할 수 있습니다. * **동시 스파이크 발생**: 경기 중 꽃가루가 뿌려지거나 카메라가 빠르게 회전하는 등 화면이 복잡해지는 순간, 모든 세션의 비트레이트가 동시에 급증하면서 네트워크 인터페이스 카드(NIC)의 한계를 초과하고 패킷 손실 및 장애를 유발할 수 있습니다. ## 예약 기반 용량 관리를 통한 해결책 * **실제 트래픽 대신 명목 수치 사용**: 서버의 가용 용량을 결정할 때 현재 전송 중인 실제 비트레이트가 아닌, 스트림에 설정된 최대치인 '명목 비트레이트'를 기준으로 계산합니다. * **용량 예약(Capacity Reservation)**: 특정 스트림이 현재 낮은 대역폭을 사용하더라도, 언제든 복잡한 장면에서 높은 비트레이트로 튈 수 있음을 전제하고 미리 용량을 할당해 둡니다. * **안정적인 트래픽 제어**: 이러한 접근 방식을 통해 VBR의 효율성은 그대로 누리면서도, CBR 시절의 예측 가능성을 확보하여 급격한 장면 변화 시에도 서버가 안정적으로 트래픽을 처리할 수 있게 되었습니다. ## 실용적인 결론 대규모 라이브 시스템에서 VBR을 도입할 때는 단순히 인코딩 설정을 바꾸는 것에 그치지 않고, **모니터링 및 트래픽 스티어링 로직을 실제 부하가 아닌 논리적인 예약(Reservation) 기반으로 재설계**해야 합니다. 이는 자원 활용의 극단적인 효율성보다는 시스템의 가용성과 안정성을 우선시하는 전략으로, 대규모 트래픽 스파이크가 빈번한 라이브 환경에서 필수적인 접근입니다.

netflix원문

글로벌 스토리텔링의 (새 탭에서 열림)

넷플릭스는 전 세계 190개국 이상에서 50개 이상의 언어로 서비스를 제공하며 급격히 성장했으나, 이 과정에서 로컬라이제이션(현지화) 분석 워크플로우가 파편화되고 파이프라인이 중복되는 기술 부채를 겪게 되었습니다. 이를 해결하기 위해 넷플릭스는 비즈니스 로직을 중앙 집중화하고 데이터 파이프라인을 통합하는 현대화 전략을 추진하여 보고의 일관성을 확보하고 운영 효율성을 높였습니다. 결과적으로 이러한 아키텍처 개선은 단순한 지표 관리를 넘어, 사용자 경험을 심층적으로 이해하고 현지화 품질을 고도화하는 기반이 되고 있습니다. **데이터 감사와 백엔드 통합 파이프라인 구축** * 기존의 40개가 넘는 대시보드와 도구를 전수 조사하여 사용성과 코드 품질을 평가하고, 프론트엔드 시각화 수정보다는 백엔드 파이프라인 통합에 집중했습니다. * 운영 성과, 생산 역량, 재무 지표 등 서로 분산되어 있던 기존의 더빙 파트너 관련 대시보드들을 하나의 통합 데이터 레이어로 병합하여 관리 효율을 극대화했습니다. * 데이터 소스를 통합함으로써 "특정 자산을 누가 제작했는가"와 같은 복잡한 질문에 대해 단일화된 답변을 제공할 수 있는 환경을 조성했습니다. **'기술 외적 부채' 해결을 통한 인사이트 도출** * 도구가 복잡하여 이해관계자들이 해석에 어려움을 겪는 '기술 외적 부채(Not-So-Tech Debt)'를 해결하기 위해 데이터 스토리텔링 방식을 개선했습니다. * 개별적으로 보고되던 오디오(더빙)와 텍스트(자막) 지표를 '소비 언어(Consumption Language)'라는 개념으로 결합하여, 사용자가 원어로 감상하는지 혹은 현지화된 콘텐츠를 선호하는지 더 직관적으로 파악할 수 있게 했습니다. * 이를 통해 자막과 더빙 중 어떤 방식을 조합했을 때 사용자의 만족도가 높은지 등 구체적인 선호도 데이터를 분석할 수 있게 되었습니다. **중앙 집중형 비즈니스 로직(Write Once, Read Many) 설계** * 로컬라이제이션 지표의 핵심 로직을 '언어 자산 생산자(Language Asset Producer)' 테이블과 같은 공유 테이블로 중앙화하여 비즈니스 로직의 중복을 제거했습니다. * 한 번 정의된 로직을 여러 하위 도메인(더빙 품질, 번역 품질 등)에서 참조하는 구조를 통해, 상위 로직이 변경될 때 모든 시스템에 즉각적으로 반영되도록 설계했습니다. * 이러한 구조적 변화는 데이터의 일관성을 보장하고, 로직 수정 시 발생하는 대규모 유지보수 부담을 획기적으로 줄여주었습니다. **이벤트 레벨 분석을 통한 세밀한 사용자 경험 최적화** * 자산 단위의 지표를 넘어, 개별 자막 줄(line) 단위의 데이터를 캡처하는 '이벤트 레벨 분석'으로 데이터 모델을 확장하고 있습니다. * 자막의 읽기 속도(reading speed)와 같은 미세한 특성이 사용자의 몰입도와 리텐션에 어떤 영향을 미치는지 정교하게 분석합니다. * 분석된 데이터를 바탕으로 번역가들에게 제공하는 스타일 가이드를 정교화하여, 전 세계 모든 사용자가 언어 장벽 없이 최상의 시청 경험을 누릴 수 있도록 지원합니다. 현대적인 데이터 분석 환경을 구축하기 위해서는 단순히 도구를 늘리는 것이 아니라, 파편화된 로직을 중앙화하고 사용자 중심의 데이터 모델로 재설계하는 과정이 필수적입니다. 넷플릭스의 사례처럼 데이터 아키텍처를 '자산' 단위에서 '이벤트' 단위로 구체화하면, 비즈니스 운영 효율화뿐만 아니라 실제 제품의 품질과 고객 경험을 직접적으로 개선하는 강력한 인사이트를 얻을 수 있습니다.

netflix원문

JDK Vector API를 활용 (새 탭에서 열림)

넷플릭스는 추천 시스템의 핵심 로직인 '비디오 참신성 점수(serendipity scoring)' 계산 과정에서 발생하는 과도한 CPU 점유율(7.5%) 문제를 해결하기 위해 대대적인 최적화를 수행했습니다. 개별 벡터의 유사도를 반복 계산하던 기존 방식을 행렬 연산 기반의 배치 처리로 전환하고, 메모리 레이아웃 최적화와 JDK Vector API를 도입함으로써 연산 효율을 극대화하고 클러스터 유지 비용을 절감하는 성과를 거두었습니다. **기존 구현의 성능 병목 현상** * 후보 영화군(M)과 사용자의 시청 기록(N)을 비교할 때 $O(M \times N)$의 중첩 루프 구조로 코사인 유사도를 계산하여 순차적 작업 부하가 컸습니다. * 파편화된 메모리 접근 방식과 반복적인 임베딩 조회로 인해 캐시 지역성이 떨어졌으며, 이는 서비스 전체 CPU 프로파일링에서 주요 핫스팟으로 나타났습니다. * 특히 대량의 배치 요청이 들어올 경우 계산량이 기하급수적으로 늘어나 전체 서비스의 응답 속도에 악영향을 주었습니다. **행렬 연산으로의 전환 및 배치화** * 수많은 작은 도트 곱(dot product) 연산을 하나의 행렬 곱셈($M \times D$와 $D \times N$ 행렬의 곱)으로 재설계하여 수학적 최적화의 기반을 마련했습니다. * 모든 행을 단위 벡터로 정규화한 후 행렬 연산을 수행하여 한 번에 모든 유사도 점수를 산출하는 방식으로 알고리즘을 개선했습니다. * 단일 요청과 배치 요청을 모두 지원하도록 인터페이스를 확장하여 하위 호환성을 유지하면서도 처리 효율을 높였습니다. **메모리 레이아웃 최적화와 객체 재사용** * 다차원 배열(`double[][]`) 사용 시 발생하는 가비지 컬렉션(GC) 압박과 메모리 비연속성 문제를 해결하기 위해 1차원 평면 버퍼(`double[]`) 구조를 도입했습니다. * `ThreadLocal<BufferHolder>`를 활용해 각 스레드에서 연산용 버퍼를 재사용함으로써 매 요청마다 발생하는 메모리 할당 비용을 제거했습니다. * 데이터 레이아웃을 행 우선(row-major) 순서의 연속된 메모리로 배치하여 CPU 캐시 효율을 비약적으로 향상했습니다. **네이티브 라이브러리(BLAS)의 한계와 대안** * 고성능 선형 대수 라이브러리인 BLAS 도입을 검토했으나, 자바와 네이티브 코드 간의 JNI(Java Native Interface) 전환 오버헤드로 인해 실질적인 성능 이득이 크지 않았습니다. * 또한 자바의 행렬 레이아웃과 네이티브 라이브러리 요구 사양 간의 차이로 인해 추가적인 데이터 복사 비용이 발생하여 기대 성능에 미치지 못했습니다. * 이를 해결하기 위해 자바 환경 내에서 하드웨어의 SIMD 기능을 직접 활용할 수 있는 JDK Vector API가 최종적인 최적화 도구로 선택되었습니다. 알고리즘의 시간 복잡도를 개선하는 것만큼이나 메모리 배치와 CPU의 하드웨어 가속(SIMD)을 고려한 저수준 최적화가 중요합니다. 특히 대규모 트래픽을 처리하는 자바 기반 마이크로서비스라면 JDK Vector API를 통해 네이티브 라이브러리 호출 없이도 고성능 연산을 구현할 수 있습니다.

netflix원문

넷플릭스의 마운트 메 (새 탭에서 열림)

넷플릭스는 컨테이너 런타임을 현대화하는 과정에서 수백 개의 컨테이너가 동시에 부팅될 때 시스템이 멈추거나 헬스 체크가 실패하는 심각한 병목 현상에 직면했습니다. 조사 결과, 이는 컨테이너 보안을 위해 도입된 사용자 네임스페이스(User Namespace)의 `idmap` 마운트 작업이 리눅스 커널의 VFS(가상 파일 시스템) 전역 잠금 장치에서 경합을 일으키기 때문으로 밝혀졌습니다. 특히 이러한 현상은 구형 다중 소켓(NUMA) 하드웨어 아키텍처에서 더욱 두드러지게 나타났으며, 최신 단일 소켓 인스턴스로 전환함으로써 스케일링 성능을 크게 개선할 수 있었습니다. **컨테이너 보안 강화와 마운트 폭증의 관계** - 넷플릭스는 보안 강화를 위해 각 컨테이너에 고유한 사용자 범위를 할당하는 새로운 런타임(Kubelet + Containerd)으로 전환했습니다. - 파일 소유권을 실제로 변경하는 비용을 줄이기 위해 커널의 `idmap` 마운트 기능을 사용하는데, 이는 각 레이어마다 `open_tree`, `mount_setattr`, `move_mount` 등의 호출을 발생시킵니다. - 50개의 레이어를 가진 컨테이너 100개를 동시에 실행할 경우, 이론적으로 약 20,000번 이상의 마운트 관련 작업이 수행되며 이는 커널의 마운트 테이블 전역 락(Global Lock)에 엄청난 부하를 줍니다. **커널 및 하드웨어 수준의 병목 현상 진단** - 시스템 분석 결과, CPU는 커널의 `path_init()` 함수 내 시퀀스 락(Sequence Lock)을 기다리는 스핀 루프(Spin Loop)에서 대부분의 시간을 소비하며 'Pause' 명령어를 반복 실행했습니다. - TMA(Topdown Microarchitecture Analysis) 분석에 따르면 파이프라인 슬롯의 95.5%가 경합된 액세스로 인해 중단되었으며, 57%는 가짜 공유(False Sharing)로 인해 발생했습니다. - 여러 코어가 동일한 캐시 라인에 접근하려고 시도하면서 캐시 라인 바운싱(Cache Line Bouncing) 현상이 발생하여 시스템 성능이 급격히 저하되었습니다. **인스턴스 아키텍처에 따른 성능 차이** - 테스트 결과, 5세대 인텔 듀얼 소켓 인스턴스인 `r5.metal`은 100개 이상의 컨테이너가 동시에 실행될 때 성능이 급격히 저하되며 실패하는 모습을 보였습니다. - 반면, 단일 소켓 및 단일 NUMA 도메인을 사용하는 7세대 인스턴스(`m7i.metal-24xl`, `m7a.24xlarge`)는 높은 동시성 환경에서도 훨씬 낮은 지연 시간과 높은 성공률을 유지했습니다. - 이는 NUMA 아키텍처의 프로세서 간 상호 연결(Interconnect) 대기 시간이 전역 락 경합 상황에서 병목 현상을 수배로 증폭시키기 때문입니다. 대규모 컨테이너 환경을 운영한다면 컨테이너 이미지의 레이어 수를 최소화하여 마운트 발생 횟수를 줄여야 합니다. 또한, 컨테이너 생성 및 삭제가 빈번한 워크로드의 경우 다중 소켓 기반의 구형 인스턴스보다는 메모리 접근 대기 시간이 짧고 락 경합에 유리한 최신 단일 소켓 혹은 단일 NUMA 노드 아키텍처를 선택하는 것이 성능 안정성에 유리합니다.

netflix원문

MediaFM: 넷 (새 탭에서 열림)

넷플릭스는 방대한 콘텐츠 카탈로그를 정밀하게 이해하기 위해 비디오, 오디오, 텍스트를 결합한 자체 멀티모달 파운데이션 모델인 MediaFM을 개발했습니다. 이 모델은 쇼트(Shot) 단위의 정보를 긴 문맥 속에서 학습하여 내러티브 구조와 감정적 흐름을 파악하며, 광고 타겟팅, 클립 인기 예측, 장르 분류 등 다양한 서비스의 기반 기술로 활용됩니다. 결과적으로 MediaFM은 단순한 프레임 분석을 넘어 영상의 전체적인 맥락을 기계가 읽을 수 있게 변환함으로써 넷플릭스의 콘텐츠 운영 효율과 사용자 경험을 크게 향상시키고 있습니다. **트리모달 데이터의 결합과 전처리** * 모델의 기본 분석 단위는 쇼트 경계 감지 알고리즘으로 분할된 '쇼트(Shot)'이며, 각 쇼트에서 비디오, 오디오, 텍스트 세 가지 핵심 모달리티를 추출합니다. * 비디오는 내부 모델인 SeqCLIP, 오디오는 Meta의 wav2vec2, 자막 및 오디오 설명은 OpenAI의 text-embedding-3-large를 사용하여 개별 임베딩을 생성합니다. * 추출된 세 임베딩을 하나로 결합하여 2304차원의 통합 벡터를 만들고, 이를 최대 512개의 시퀀스로 구성하여 트랜스포머 인코더에 입력합니다. * 작품의 시놉시스와 태그 같은 타이틀 수준의 메타데이터를 [GLOBAL] 토큰으로 변환하여 삽입함으로써, 개별 쇼트가 전체 작품의 맥락을 반영할 수 있도록 설계했습니다. **트랜스포머 기반 아키텍처와 학습 방식** * MediaFM은 BERT와 유사한 구조의 트랜스포머 인코더를 사용하여 쇼트 간의 시간적 관계와 문맥적 정보를 학습합니다. * '마스크 쇼트 모델링(Masked Shot Modeling, MSM)' 기법을 학습 목표로 사용하며, 입력 시퀀스의 20%를 마스킹하고 주변 정보를 통해 원래의 결합 임베딩을 코사인 유사도 기반으로 예측하도록 훈련합니다. * 최적화 과정에서 하이퍼파라미터 튜닝을 위해 Muon 옵티마이저를 도입하여 기존 AdamW 방식보다 성능을 유의미하게 개선했습니다. * 이 과정을 통해 생성된 임베딩은 단순한 정보를 넘어 영상의 전후 흐름이 반영된 '문맥화된 표현(Contextualized representation)'이 됩니다. **주요 활용 사례 및 성능 평가** * 광고 적합성(Ad Relevancy): 추출된 임베딩을 통해 특정 광고 배치에 적합한 클립을 분류하고 후보군을 식별하여 광고 서빙 시스템의 효율을 높입니다. * 클립 인기 및 톤 분석: 클립의 클릭률(CTR)을 바탕으로 상대적 인기를 예측하거나, 영상의 분위기(공포, 유머 등 100여 개 카테고리)를 정밀하게 분석합니다. * 장르 분류 및 리트리벌: 11개의 주요 장르 분류와 더불어, 특정 작품을 홍보하기에 적합한 '가치 있는 클립'인지 여부를 판별하는 이진 분류 작업에 활용됩니다. * 성능 평가 결과, 특정 클립을 단독으로 분석하는 것보다 전체 에피소드라는 더 큰 문맥 안에서 임베딩을 추출할 때 모든 작업에서 월등한 성능을 보였습니다. MediaFM은 넷플릭스가 보유한 대규모 엔터테인먼트 특화 데이터를 학습하여 콘텐츠의 깊은 의미를 파악하는 강력한 도구입니다. 특히 신작 출시 시 데이터가 부족한 '콜드 스타트' 문제를 해결하고, 예고편이나 아트워크 같은 홍보 자산을 최적화하는 데 기여함으로써 미디어 산업에서 멀티모달 AI가 나아가야 할 실질적인 방향을 제시하고 있습니다.

netflix원문

넷플릭스의 LL (새 탭에서 열림)

넷플릭스는 일반적인 기초 모델을 자사 서비스의 카탈로그와 사용자 맥락에 맞게 최적화하기 위해, 인프라의 복잡성을 추상화한 '포스트 트레이닝(Post-Training) 프레임워크'를 구축했습니다. 이 프레임워크는 대규모 분산 GPU 클러스터 환경에서 데이터 파이프라인과 모델 훈련 워크플로우를 효율적으로 조율하여 연구자들이 하드웨어가 아닌 모델 혁신에만 집중할 수 있게 돕습니다. 결과적으로 엔지니어링 병목 현상을 해결함으로써 개인화 추천 및 검색 경험을 고도화하는 데 핵심적인 역할을 수행합니다. ### 데이터 처리 및 모델 설정의 기술적 난제 - **정교한 손실 마스킹(Loss Masking):** 지시어 이행(Instruction following)이나 연쇄 사고(CoT) 품질을 높이기 위해, 프롬프트가 아닌 응답(Assistant) 토큰에만 손실을 적용하여 모델이 부적절한 텍스트를 학습하지 않도록 제어합니다. - **시퀀스 패킹(Sequence Packing):** 가변적인 문장 길이로 인한 연산 낭비를 줄이기 위해 여러 샘플을 고정 길이 시퀀스로 묶고, 샘플 간 간섭을 방지하는 '도큐먼트 마스크'를 적용하여 GPU 효율을 극대화합니다. - **분산 로딩 및 메모리 최적화:** 단일 GPU 메모리를 초과하는 모델을 위해 FSDP(Fully Sharded Data Parallel)나 TP(Tensor Parallel) 샤딩을 사용하며, 대규모 어휘집 처리 시 발생하는 메모리 스파이크를 방지하기 위해 로짓 청킹(Logit chunking) 기법을 도입했습니다. ### 넷플릭스 포스트 트레이닝 프레임워크의 구조 - **기술 스택의 통합:** 넷플릭스 내부 ML 플랫폼인 'Mako' 위에서 PyTorch, Ray, vLLM 등 오픈소스 구성 요소를 결합하여 단일 노드부터 수백 개의 GPU까지 확장 가능한 환경을 제공합니다. - **표준화된 레시피:** SFT(지도 미세 조정), DPO(직접 선호도 최적화), RL(강화 학습), 지식 증류 등 주요 워크플로우를 설정 파일만으로 실행할 수 있는 재사용 가능한 레시피 형태로 지원합니다. - **유연한 아키텍처 확장성:** 단순 챗 모델을 넘어 도메인 특화 특수 토큰 사용이나 비표준 아키텍처 실험이 가능하도록 유연성과 확장성을 최우선으로 설계되었습니다. ### 시스템 고도화를 위한 4대 핵심 요소 - **데이터(Data):** 로컬 저장 공간을 초과하는 대규모 데이터를 클라우드에서 실시간 스트리밍하며, CPU 기반 패킹 작업을 GPU 연산과 비동기적으로 병렬 처리하여 유휴 시간을 제거합니다. - **모델(Model):** Qwen, Gemma 등 최신 아키텍처와 MoE(Mixture-of-Experts) 모델을 지원하며, LoRA 통합 및 고수준 샤딩 API를 통해 복잡한 분산 코딩 없이도 대형 모델을 다룰 수 있게 합니다. - **연산(Compute):** MFU(Model FLOPS Utilization) 모니터링을 통해 연산 효율을 실시간 추적하며, 장애 발생 시 훈련 상태를 정확히 복구할 수 있는 정교한 체크포인팅 시스템을 갖추었습니다. - **워크플로우(Workflow):** 단순 학습 루프를 넘어 온폴리시(On-policy) 강화 학습처럼 생성(Rollout)과 업데이트가 반복되는 복잡한 단계를 SPMD(Single Program, Multiple Data) 스타일로 관리합니다. 복잡한 분산 시스템의 세부 사항을 프레임워크 수준에서 표준화함으로써, 넷플릭스는 고도화된 AI 모델 실험의 진입 장벽을 낮추고 대규모 서비스에 최적화된 모델을 더 빠르게 배포할 수 있는 기반을 마련했습니다. 이러한 엔지니어링 접근 방식은 인프라의 복잡성에 구애받지 않고 최신 모델링 기법을 신속하게 도입하려는 기업들에게 유용한 사례가 됩니다.