HyperCLOVA X 8B Omni 서빙 딥다이브: 구조 설계부터 성능 최적화까지
Encoder·Decoder·LLM 분리와 llm-d, USP 최적화로 처리량을 2.1배 높였다.
HyperCLOVA X SEED 8B Omni는 텍스트뿐 아니라 이미지와 음성까지 다루는 옴니모달 모델이라, 서비스 환경에서는 단일 통합 구조보다 역할 분리가 더 중요했다.
서빙 구조는 Encoder, Decoder, LLM을 각각 독립 서버로 분리했다. 하나의 서버에 묶어두면 사용하지 않는 기능까지 GPU 자원을 차지하고, 컴포넌트끼리 자원을 두고 경쟁해 성능이 떨어지기 때문이다.
오케스트레이션은 중앙 Orchestrator 방식을 택했다. API Gateway 기반 Service Chaining보다 SPOF 위험은 있지만, 흐름이 한곳에 모여 디버깅과 운영이 쉬워 개발 속도를 확보할 수 있었고, 대신 Orchestrator의 책임은 최소화했다.
컴포넌트 간 인터페이스는 역할별로 나눴다.
- LLM 서버와 Orchestrator는 업계 표준인 OpenAI Chat Completion API를 그대로 사용했다.
- Encoder는 이미지·오디오를 토큰 ID나 임베딩 벡터로 변환했다.
- Decoder는 LLM이 생성한 토큰 ID를 받아 최종 이미지·오디오를 생성했다.
- Encoder 임베딩은 모델 내부 플러그인 대신 Data Plane을 통해 LLM 서버로 전달해 구조를 단순화했다.
중간 산출물 전달은 Object Storage(OBS) 를 Data Plane으로 써서 해결했다. Encoder 결과를 파일로 직렬화해 업로드한 뒤, 실제 데이터 대신 Object Key나 Presigned URL 같은 주소표만 넘겨 여러 서버가 같은 데이터를 재사용할 수 있게 했다.
분산 추론 최적화에는 llm-d를 도입했다. 핵심은 KV 캐시를 가진 서버로 요청을 보내 재사용률을 높이는 것이었지만, 기존에는 모델 서버별 진입점이 분산돼 있고 body 기반 라우팅도 없어 적용이 쉽지 않았다.
이를 위해 다음처럼 구조를 바꿨다.
- 모델 서버의 진입점을 단일 Gateway로 통합해 공통 라우팅을 적용했다.
- EnvoyFilter와 HttpRoute를 활용해 요청 body의 모델 정보를 헤더로 변환하고, 이를 기준으로 InferencePool을 선택했다.
- 서버 선택은 kv-cache-utilization-scorer(3.0), queue-scorer(2.0), max-score-picker(2.0) 조합으로 캐시 재사용과 부하 분산을 함께 고려했다.
그 결과 처리량은 2.1배 향상됐고, KV 캐시 활용도는 25~45%에서 90% 이상으로 올라갔다. 이 과정에서 나온 개선 사항은 오픈소스에도 직접 기여했다.
컴포넌트 연산 최적화도 이어졌다.
- Vision Encoder는 dtype 정정으로 FlashAttention2를 활성화한 뒤, 병목이던 PatchEmbed를 개선해 784번의 Conv3D 호출을 1회 단일 Conv3D로 바꿨다.
- 그 결과 Vision Encoder의 forward pass는 약 4배 개선됐다.
- Vision Decoder는 Diffusion 기반이라 긴 시퀀스와 반복 연산이 병목이었고, step 수를 50에서 25로 줄여도 품질 차이가 크지 않음을 확인해 연산량을 절반으로 낮췄다.
- 이어서 긴 고정 시퀀스에 적합한 USP(Ulysses Sequence Parallelism) 를 적용해, 어텐션 전후 두 번의 All-to-All 통신만으로 병렬화를 구성했다.
전체적으로 이 서빙 설계는 옴니모달 모델의 복잡한 입력·출력 경로를 단순한 구조로 분리하고, Object Storage 기반 데이터 전달, llm-d 기반 KV 캐시 재사용, Encoder/Decoder 연산 최적화를 결합해 실제 서비스에서의 처리량과 효율을 동시에 끌어올린 사례로 정리된다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.
