Kanana-O, 음성 AI 모델 프로덕션 배포를 위한 서빙 최적화 비법 공개!

by DD
4주 전
조회수 14

멀티모달 모델 Kanana-O를 실시간 음성 대화 서비스로 제공하기 위한 서빙 서버 개발 과정을 설명하며, 프로덕션 환경의 까다로운 요구사항을 제시함

Thinker, Talker, VoiceBox로 구성된 파이프라인에서 Zero-Copy, Cascaded Streaming Pipeline 등 핵심 최적화 기법을 적용하여 성능을 개선함

FastAPI + Uvicorn 기반 서버에서 async/await를 활용, 단일 워커(Single Worker) 환경에서도 높은 동시성(Concurrency)을 확보함

OpenAI API 호환성을 통해 기존 개발자들이 쉽게 Kanana-O를 활용할 수 있도록 지원하며, 실시간 대화와 고품질 TTS를 위한 유연한 전략을 제시함

서버 시작 시 Warm-upWatermarking을 통해 서비스 품질과 윤리적 측면을 고려하고, 모델 구조에 특화된 최적화를 강조함

Kanana-Omni Server 아키텍처: 멀티모달 파이프라인

Kanana-Omni Server는 Thinker, Talker, VoiceBox 세 가지 컴포넌트로 구성된 멀티모달 파이프라인을 갖추고 있다. 각 컴포넌트는 서로 다른 GPU에서 실행될 수 있으며, 비동기적으로 데이터를 주고받으며 실시간 오디오 스트리밍을 지원한다.

Zero-Copy 기술: Thinker와 Talker 간 임베딩 데이터 전달 시, 공유 메모리 풀과 CUDA IPC를 활용하여 데이터 복사 및 직렬화 오버헤드를 제거

Cascaded Streaming Pipeline: Thinker와 Talker를 비동기 태스크로 실행하고 비동기 큐로 연결하여, 사용자가 첫 음성 응답을 체감하는 시간을 단축

FastAPI + Uvicorn: 단일 워커 환경에서 async/await를 통해 여러 요청을 인터리빙 처리하고, CPU-bound 작업은 스레드 풀로, GPU-bound 작업은 세마포어로 제어하여 동시성을 확보

병목 현상 해결: 데이터 전달 최적화

Kanana-O의 핵심 과제 중 하나는 컴포넌트 간 데이터 전달의 병목 현상을 해결하는 것이었다. Thinker가 생성한 수천 차원의 임베딩 벡터를 Talker에게 전달하는 과정에서 발생하는 오버헤드를 줄이기 위해, 다음과 같은 기술을 적용했다.

사전 할당 공유 메모리 풀: 런타임 시 할당/해제 없이, Thinker가 데이터를 생성하면 풀에서 블록을 꺼내 쓰고 Talker는 메타데이터를 통해 접근

CUDA IPC(Inter-Process Communication): 같은 노드 내 GPU 간 텐서 전달 시, CPU를 거치지 않고 GPU 간 직접 전달하여 'Device→Host→Device' 변환 오버헤드 제거

이러한 최적화를 통해, 컴포넌트 간 데이터 전달이 파이프라인의 병목에서 사라졌으며, 실시간 음성 대화 서비스의 성능을 향상시켰다.

비동기 파이프라인 구축: Cascaded Streaming

Kanana-Omni Server는 Cascaded Streaming Pipeline을 통해 순차 실행으로 인한 지연 문제를 해결했다. Thinker가 텍스트를 생성하는 동안 Talker가 음성 토큰을 생성하고, VoiceBox가 오디오를 합성하는 방식으로 파이프라인 스테이지를 겹쳐서 실행한다.

비동기 태스크(Asynchronous Task): Thinker와 Talker를 별도의 비동기 태스크로 실행하여, 각 단계의 작업을 병렬 처리

비동기 큐(Asynchronous Queue): Thinker와 Talker 간 데이터 전달을 비동기 큐로 연결하여, 데이터 흐름을 원활하게 관리

체감 대기 시간 단축: 파이프라인 스테이지가 톱니바퀴처럼 겹쳐서 실행되므로, 사용자가 첫 음성까지의 체감 대기 시간을 크게 단축

FastAPI + Uvicorn: 단일 워커 환경에서의 동시성 확보

Kanana-Omni Server는 FastAPIUvicorn을 사용하여 구축되었으며, 단일 워커(Single Worker) 환경에서도 높은 동시성을 확보하기 위해 노력했다. 멀티 워커(Multi-Worker) 환경은 GPU 메모리 사용량 증가 및 모델 로딩 시간 증가로 인해 채택하지 않았다.

async/await: API 엔드포인트부터 최종 오디오 생성까지 모든 함수를 async/await로 구성하여, 이벤트 루프를 블로킹하는 지점 제거

스레드 풀(Thread Pool): CPU-bound 작업은 스레드 풀로 위임하여, 메인 이벤트 루프가 다른 요청을 계속 처리할 수 있도록 함

세마포어(Semaphore): VoiceBox의 동시 합성 수를 제한하여, GPU 메모리 초과 없이 안정적인 동시 처리 보장

OpenAI API 호환: 생태계 통합

Kanana-Omni Server는 OpenAI의 Chat Completions API 규격과 100% 호환되도록 구현하여, 기존 OpenAI SDK 코드를 재사용할 수 있도록 지원한다. 이는 개발자들이 Kanana-O를 쉽게 도입하고 활용할 수 있도록 돕는 중요한 요소이다.

API 호환성: OpenAI의 Chat Completions API 규격을 준수하여, 기존 OpenAI SDK 코드를 엔드포인트 URL 변경만으로 재사용 가능

Modalities 지원: modalities 필드를 통해 텍스트 전용 / 텍스트+오디오 모드를 요청 단위로 전환 가능

입력 검증: 다양한 입력 검증 규칙을 통해 잘못된 요청에 대해 구체적인 에러 메시지를 반환

서비스 품질 및 운영 안정성 확보

Kanana-Omni Server는 서비스 품질과 운영 안정성을 위해 다양한 노력을 기울였다. 특히, 실시간 대화와 고품질 TTS(Text-to-Speech)를 모두 지원하기 위한 유연한 전략을 제시하고, 콜드 스타트(Cold Start) 문제를 해결하기 위한 방법을 제시했다.

Latency-First vs Quality-First: 클라이언트가 요청 단위로 딜레이(Latency) 우선 또는 품질 우선 전략을 선택할 수 있도록 지원

Warm-up: 서버 시작 시 VoiceBox를 더미 토큰으로 미리 실행하여 CUDA 커널 컴파일 및 메모리 할당 패턴을 안정화

Watermarking: 생성된 음성에 워터마크를 자동 삽입하여, AI 생성 음성 식별을 지원

음성 AI 모델을 프로덕션에 올리기까지: Kanana-O 서빙 최적화 여정

댓글 0

첫 번째 댓글을 남겨보세요!