How OpenAI delivers low-latency voice AI at scale
개요
OpenAI는 수백만 명의 사용자를 대상으로 안정적인 저지연 음성 AI 서비스를 제공하기 위해 WebRTC 스택을 재설계했으며, 이를 통해 클라이언트 측의 표준 WebRTC 동작을 유지하면서 내부 패킷 라우팅 방식을 최적화했다.
주요 내용
* 저지연 음성 AI의 중요성: 자연스러운 대화 경험을 위해 네트워크 지연은 어색한 침묵, 잘리는 통신, 늦은 끼어들기 등으로 즉시 인지되며, 이는 ChatGPT 음성, Realtime API, 대화형 워크플로우 및 실시간 오디오 처리가 필요한 모델에 중요하다.
* OpenAI의 규모에 따른 요구사항: 9억 명 이상의 주간 활성 사용자에게 글로벌 도달 범위, 빠른 세션 시작을 위한 연결 설정, 낮고 안정적인 미디어 왕복 시간(jitter 및 패킷 손실 최소화)이 요구된다.
* WebRTC 스택 재설계의 동기: 기존의 '세션당 하나의 포트' 방식, 상태 저장 ICE/DTLS 세션의 안정적인 소유권 문제, 글로벌 라우팅 시 첫 홉 지연 시간 최소화라는 세 가지 제약 조건이 규모에 따라 충돌했다.
* WebRTC의 역할: WebRTC는 브라우저, 모바일 앱, 서버 간에 저지연 오디오, 비디오, 데이터를 전송하기 위한 개방형 표준으로, ICE, DTLS, SRTP, 코덱 협상 등 복잡한 상호 작용 미디어의 표준화를 제공하여 AI 제품 개발에 유리하다.
* OpenAI의 아키텍처 선택 (Relay + Transceiver):
* Transceiver: WebRTC 세션 상태(ICE, DTLS 핸드셰이크, SRTP 키 등)를 소유하고 미디어의 암호화/복호화를 수행하는 상태 저장 엔드포인트.
* Relay: 경량 UDP 전달 계층으로, 패킷 메타데이터를 기반으로 Transceiver로 패킷을 전달하며, 미디어 복호화나 ICE 상태 머신에 관여하지 않는다.
* Kubernetes 환경에서의 WebRTC 배포 문제:
* 세션당 하나의 포트: 대규모 UDP 포트 노출 및 관리의 어려움, 보안 문제, 오토스케일링 비효율성.
* 단일 서버당 하나의 포트: 포트 수를 줄이지만, 여러 인스턴스에 걸쳐 세션 소유권을 유지하기 위한 결정론적 라우팅 필요.
* Relay + Transceiver 아키텍처 구현:
* Relay의 기능: STUN 패킷 헤더(ufrag)를 파싱하여 라우팅 힌트를 디코딩하고 해당 세션을 소유한 Transceiver로 패킷을 전달.
* ICE ufrag 활용: 세션 설정 시 교환되는 ICE ufrag에 서버 측에서 라우팅 메타데이터를 포함시켜 Relay가 목적지 클러스터 및 Transceiver를 추론하도록 함.
* 글로벌 Relay 및 Geo-Steered Signaling: 지리적으로 분산된 Relay를 통해 사용자와 가까운 지점에서 네트워크에 진입하여 첫 홉 지연 시간을 단축하고, Geo-Steered Signaling으로 세션 설정 요청을 가까운 Transceiver 클러스터로 유도.
* Relay 구현의 효율성:
* Go 언어 사용, 커널 바이패스 미적용.
* SO_REUSEPORT 및 runtime.LockOSThread를 활용한 효율적인 패킷 분배 및 캐시 지역성 최적화.
* 작고 짧은 시간 동안만 유지되는 인메모리 세션 상태 관리.
* 결과 및 학습:
* 수천 개의 UDP 포트를 노출하지 않고 Kubernetes에서 WebRTC 미디어 실행 가능.
* 작고 고정된 UDP 표면으로 보안 및 로드 밸런싱 용이성 증대.
* 클라이언트에게 표준 WebRTC 동작 유지, SFU(Selective Forwarding Unit) 없는 아키텍처가 1:1 레이턴시 민감 워크로드에 적합함을 확인.
* 복잡성은 씬 라우팅 계층에 추가하고, 백엔드 서비스나 사용자 정의 클라이언트 동작에는 최소화하는 것이 유리함.
시사점
OpenAI의 Relay + Transceiver 아키텍처는 WebRTC의 복잡성을 핵심 인프라스트럭처의 얇은 라우팅 계층으로 집중시키고, 클라이언트의 표준 WebRTC 경험을 유지하면서 대규모 저지연 음성 AI 서비스 제공의 기술적 과제를 해결하는 실용적인 방안을 제시한다.
댓글
GitHub Discussions