아바타 영상이 설득력 있게 느껴지려면, 시간이 지나도 인물이 일관되게 유지되어야 합니다. 얼굴이 조금만 흐트러지거나, 치아 모양이 바뀌거나, 립싱크가 어긋나거나, 클립 사이에서 동작이 초기화되면 사람들은 바로 눈치챕니다. 시청자는 특정 인물이, 그것도 가까운 거리에서, 오랫동안 말하는 모습을 지켜보기 때문에 이런 점은 다른 많은 영상 생성 작업보다 아바타에서 훨씬 더 중요합니다.
오늘날의 영상 생성 환경에서 길이는 여전히 가장 눈에 띄는 한계 중 하나입니다. 많은 모델과 제품이 생성 기능을 몇 초짜리 고정 길이 클립으로만 제공하며, 몇 분 이상을 만들어낼 수 있는 시스템은 거의 없습니다. 아바타 제품의 경우 이 한계가 고객의 실제 작업 흐름에 그대로 드러납니다. 고객들은 교육 영상, 세일즈 데모, 제품 소개, 교육 콘텐츠, 지원용 영상, 그리고 업무가 끝날 때까지 계속 말해야 하는 에이전트용으로 더 길고 일관된 장면/영상이 필요합니다. 동시에, 프롬프트·모션·스크립트를 빠르게 수정·반복할 수 있도록 고속 미리보기 기능도 원합니다.
HeyGen에서는 이를 세 가지 구체적인 요구 사항으로 정리했습니다:
- 긴 장면 일관성아바타는 짧은 한두 개의 클립이 아니라, 여러 조각으로 생성된 영상 전반에 걸쳐 정체성, 립싱크, 표정, 그리고 동작의 연속성을 유지해야 합니다.
- 고정된 시간 제한 없음생성 시간은 10초, 10분이 될 수도 있고, 제한 없는 실시간 세션이 될 수도 있습니다.
- 빠른 미리보기, 실시간 또는 실시간보다 더 빠른 생성시스템은 프레임을 신속하게 생성하기 시작해야 하며, 추론이 진행되는 동안에도 생성된 프레임을 스트리밍으로 내보낼 수 있어야 합니다.
이 글에서는 이러한 요구 사항을 충족하기 위해 우리가 구축한 추론 프레임워크를 자세히 살펴봅니다.
기반 모델 아키텍처
이 프레임워크는 HeyGen의 아바타 영상 생성 모델인 Avatar IV와 Avatar V 계열을 중심으로 구축되었습니다. 높은 수준에서 이 모델은 기준이 되는 이미지/영상, 구동 오디오, 그리고 선택적인 텍스트 또는 장면 조건을 입력으로 받아, 해당 아바타가 올바른 정체성, 표정, 동작을 갖추고 말하는 영상을 생성합니다.
핵심 생성 모델은 플로 매칭(flow matching)으로 학습된 디퓨전 트랜스포머(Diffusion Transformer, DiT)입니다. 이 모델은 사람을 작은 아이덴티티 임베딩으로 압축하는 대신, 풍부한 레퍼런스 토큰을 조건으로 사용하여 아바타에 중요한 디테일을 그대로 유지합니다. 예를 들어 얼굴 형태, 치아, 피부 질감, 입 움직임, 제스처 스타일, 말하는 리듬 등이 이에 해당합니다.
프로덕션 추론 경로는 세 가지 주요 단계로 구성됩니다:
- 오디오-투-비디오 생성기본 DiT가 기준 아이덴티티, 오디오 특징, 그리고 컨디셔닝 신호를 입력으로 받아 저해상도 비디오 잠복 표현을 생성합니다. 이 단계는 동작, 립싱크, 그리고 시간적 일관성에 중점을 둡니다.
- 아이덴티티 인지 초해상도두 번째 모델은 이러한 잠복 표현을 고해상도 출력으로 정교하게 개선하며, 특히 얼굴과 입처럼 사람들이 인공적인 흔적에 가장 민감한 영역에 더욱 집중합니다.
- 스트리밍 VAE 디코딩VAE 디코더는 고해상도 잠복 표현을 조각 단위로 RGB 프레임으로 변환하여, 전체 동영상이 완성되기 전에 프레임을 순차적으로 출력할 수 있도록 합니다.
긴 영상을 생성하기 위해 시스템은 데이터를 여러 청크로 나누어 처리합니다. 첫 번째 청크는 전적으로 정적인 기준(reference)에 의존하지만, 이후 청크들은 앞선 구간에서 나온 경계 데이터를 활용합니다. 이를 통해 아바타는 자세나 정체성을 처음부터 다시 설정하지 않고도 자연스럽게 말을 이어갈 수 있습니다.
스트리밍 프레임워크와 파이프라인 루프
청크 기반 실행을 지원하기 위해 추론 프레임워크는 모듈식 3계층 아키텍처를 사용하며, 이는 국소적인 시간 구간 단위로 동작하고 각 청크가 처리되는 즉시 리소스를 해제합니다.
- 모듈: 특정 모델과 해당 체크포인트를 감싸는 래퍼로, 예를 들어 A2V DiT, 초해상도 DiT, VAE 구성 요소, 텍스트/오디오 인코더 등이 이에 해당합니다.
- 스테이지: 하나 이상의 모듈을 조정하는 유형화된 실행 단위입니다(예: 컨텍스트 생성, 초해상도).
- 파이프라인: 스테이지들을 서로 연결하고 공유 상태를 관리하며 스트리밍 또는 배치 실행 모드를 조율하는 실행 그래프입니다.
초기화 단계에서는 각 요청마다 기준 아이덴티티를 잠복 표현(latent)으로 한 번 인코딩합니다. 그런 다음 파이프라인은 입력 오디오 스트림이 모두 소진될 때까지 나머지 단계들을 연속 루프로 실행합니다:

- 컨텍스트 생성: 들어오는 오디오 구간을 특징으로 변환하고, 텍스트 또는 장면 컨디셔닝과 결합하여 목표 노이즈 텐서를 준비합니다.
- 오디오-투-비디오: 다단계 확산 과정을 수행하여 저해상도 잠복 표현을 생성합니다. 이 단계에서는 현재 청크를 이전 청크의 경계 프레임에 조건부로 연결해 동작의 연속성을 유지합니다.
- 슈퍼 해상도: 단일 단계로 모션 잠복 표현을 전체 해상도로 업스케일하며, 얼굴의 공간적 디테일을 우선적으로 향상합니다.
- VAE 디코드 앤 퍼블리시: 고해상도 잠복 표현을 RGB 프레임으로 디코딩한 뒤, 즉시 저장하거나 실시간 재생할 수 있도록 이를 출력 인코더(H.264 / AAC)에 바로 기록합니다.
경계 연속성과 청크 일관성
비디오를 개별 구간으로 생성하면 경계에서 불연속성이 발생할 수 있습니다. 이 프레임워크는 두 가지 서로 다른 청크 분류를 활용하여 이러한 문제를 완화합니다.
- N 청크: 아바타의 기본 타임라인을 생성하는 구간입니다.
- I 청크 (보간): 연속된 N 청크 사이의 전환을 부드럽게 만들기 위해 설계된 구간입니다.
실행 순서는 다음과 같이 구성됩니다:
N0 -> N1 -> I0 -> N2 -> I1 -> N3 -> I2 -> ...
I 청크는 앞뒤의 N 청크가 모두 완료된 이후에만 생성됩니다. 이전 N 청크의 마지막 프레임과 현재 N 청크의 초기 프레임을 앵커 프레임으로 사용하여 전이 동작을 계산합니다. 생성이 완료되면, 중복되는 앵커 예측은 제거되고 부드럽게 보간된 전이만 남습니다. 이 메커니즘은 필요한 컨텍스트 윈도우의 범위를 제한하면서도 시간적 일관성을 유지합니다.
전체 기간 동안 일정한 메모리 사용
일반적인 비디오 파이프라인은 실행 중에 잠재 표현, 디코딩된 프레임, 그리고 어텐션 컨텍스트를 계속 누적하기 때문에, 비디오 길이에 비례하여 GPU 메모리 사용량이 선형적으로 증가합니다.
무제한에 가까운 생성이 가능하도록, 이 프레임워크는 엄격한 롤링 상태를 유지합니다. 시스템은 청크 전환에 필요한 최소한의 앵커 텐서와 정적인 기준 컨디셔닝만을 보존합니다. 오디오 특성, 노이즈 텐서, 내부 활성값, 원본 RGB 프레임을 포함한 모든 중간 자산은 각 청크가 디코딩되어 기록되는 즉시 메모리에서 제거됩니다.
그 결과, 짧은 클립을 생성하든 긴 시퀀스를 생성하든 최대 GPU 메모리 사용량 프로파일은 일정하게 유지되며, 리소스 사용량은 세션의 전체 길이가 아니라 정의된 청크 크기에 따라 선형적으로 증가합니다.
파이프라인 내 로딩/오프로딩 단계
각 요청은 8개의 GPU로 구성된 노드 전체에서 실행됩니다. 우리는 FSDP를 사용해 대형 모델의 파라미터를 여러 GPU에 샤딩합니다. 각 랭크는 가중치의 일부만 보유하고, 연산에 필요한 파라미터를 모았다가 사용이 끝나면 다시 해제합니다. 이렇게 함으로써 기본 DiT, 초해상도 DiT, 텍스트 인코더, 오디오 인코더, VAE와 같은 여러 대형 모델을 하나의 노드에 모두 적재할 수 있습니다.
트레이드오프가 있습니다. FSDP는 추론 과정에서 순전파 단계마다 파라미터를 모아야 하기 때문에 통신 오버헤드를 발생시킵니다. 우리는 이러한 오버헤드를 숨기고, 사용 중이 아닐 때는 함께 배치된 모델들이 GPU를 점유하지 않도록 하기 위해 여러 기법을 조합해 사용합니다:
- 순방향 프리패칭. 다음 블록의 파라미터에 대한 AllGather 연산을 미리 실행하여 현재 블록의 연산과 겹치게 함으로써, 중요 경로에서의 집합 지연 시간을 숨깁니다.
- CPU에서의 지연형 블록 단위 언샤딩. 모델을 고정(pinned)된 CPU 메모리에서 다시 가져올 때, 전체 가중치를 한 번에 모두 올려두지 않습니다. 각 트랜스포머 블록은 순전파 직전에 블록 단위로 언샤딩(호스트→디바이스 복사 + AllGather)되며, 이때 블록 n+1의 H2D 전송이 블록 n의 연산과 겹쳐서 수행됩니다.
- 스테이지 간 고정 CPU 오프로딩. 현재 실행 중이 아닌 모델의 파라미터는 고정(pinned) CPU 메모리에 보관되므로, 함께 배치된 여러 모델들(base DiT, super-resolution DiT, 텍스트 인코더, 오디오 인코더, VAE)이 동시에 GPU에 가중치를 올려둘 필요가 없습니다. 고정 메모리는 H2D 복사가 연산과 겹쳐 실행될 수 있을 만큼 충분히 빠르게 이루어지도록 해 줍니다.
- NUMA 인지 프로세스 배치. 각 프로세스는 할당된 GPU와 동일한 NUMA 노드에 고정되어, 소켓 간 인터커넥트를 거치지 않고도 CPU↔GPU 전송이 전체 PCIe/NVLink 대역폭으로 수행될 수 있습니다.
스테이지 간 10ms 미만 모델 전환
위에서 설명한 기법들의 실질적인 성과는, 한 단계의 모델에서 다음 단계의 모델로 GPU를 넘겨주는 작업이 사실상 비용 없이 이루어진다는 점입니다. 예를 들어 A2V DiT → Super-Resolution DiT, 또는 SR DiT → VAE 디코더로 넘어갈 때가 그렇습니다. 이는, 이전 단계의 모델은 비동기적으로 오프로딩되고, 다음 단계 모델의 첫 번째 블록은 정확히 필요한 시점에 샤딩 해제되기 때문에, 이미 실행 중인 연산 뒤에서 H2D 복사와 AllGather가 모두 숨겨지기 때문입니다. 전체적으로 볼 때, 각 전환마다 관측 가능한 오버헤드는 10ms 미만으로, 우리가 목표로 하는 프레임 레이트에서 단일 프레임 예산보다 훨씬 낮습니다. 구체적으로, 이것이 바로 스트리밍 파이프라인 루프(Context Gen → A2V → SR → VAE Decode-and-Publish)가 각 청크마다 여러 개의 대형 모델을 순환하면서도, 모델 교체 자체가 병목이 되지 않도록 해 주는 핵심입니다.
실시간 스트리밍 게시
모델이 실시간으로 스트리밍될 수 있을 만큼 충분히 빠르게 동작하도록 하기 위해 많은 추론 최적화를 진행했습니다. 자세한 내용은 https://www.heygen.com/research/avatar-v-inference 를 참고해 주세요.
파이프라인이 실시간으로 비디오를 청크 단위로 내보내기 시작하면, 스트리밍 전송은 별도의 후처리 단계가 아니라 추론 과정의 자연스러운 확장이 됩니다.
방송형 실시간 경로의 경우, 우리가 생성한 프레임을 Amazon Kinesis Video Streams(KVS)에 전송합니다. KVS는 보통 카메라, IoT 기기, 업로드된 미디어와 같은 맥락에서 이야기되지만, 우리 사례에서의 "카메라"는 바로 추론 파이프라인 자체입니다. 프레임은 모델에 의해 생성되자마자 즉시 인코딩되고, 라이브 스트림 형태로 KVS에 푸시됩니다.
출력 라이터는 스트리밍 VAE에서 디코딩된 RGB 프레임을 받아 GStreamer 파이프라인으로 전송합니다. 영상은 H.264로, 오디오는 AAC로 인코딩된 뒤 두 트랙 모두 KVS 프로듀서 싱크인 kvssink로 전달됩니다. 그 후 시청자는 세션이 아직 생성되는 중에도 이를 라이브 스트림 형태로 재생할 수 있습니다.
결과 및 배운 점
이 프레임워크를 통해 아바타 IV와 아바타 V 생성 방식이 고정된 장면 렌더링에서 개방형 스트리밍 생성으로 바뀌었습니다. 가장 중요한 결과는 단순합니다. 아바타 IV와 아바타 V에 대한 장면 길이 제한을 제거했다는 점입니다. 실시간 아바타 IV 생성을 위해, 우리는 첫 프레임까지의 시간을 5초 미만으로 줄였고, 720p 아바타 IV 영상에서 초당 27프레임 이상의 생성 속도를 달성하여 실시간 재생보다 빠른 성능을 구현했습니다.