amap-cvlab/ABot-World · 제작 AMAP CV LAB(알리바바 고德/Amap 계열) · 모델 ABot-World-0.5B-LF(약 0.5B 파라미터) · 언어 Python 3.12 · 라이선스 Apache 2.0 · shallow clone 소스 직접 분석)
기존의 AI 영상 생성(예: Sora, Wan)은 "프롬프트 넣고 → 몇 분 기다리면 → 완성된 클립이 나오는" 방식이다. 한 번 만들어지면 끝이고, 중간에 내가 개입할 수 없다. ABot-World는 이 틀을 깬다. 참조 이미지 한 장을 세계의 출발점으로 삼고, 내가 WASD(이동)·IJKL(시점) 키를 누르면 그 입력에 반응해 다음 몇 프레임을 즉석에서 생성한다. 걷고, 돌아보고, 새 방으로 들어가는 것을 실시간으로 조종하는 것이다.
일반 영상 생성이 극장 상영(정해진 필름을 재생)이라면, ABot-World는 실시간 게임 플레이다. 다만 게임처럼 3D 모델·텍스처·물리엔진을 사람이 만든 게 아니라, 신경망이 매 순간 화면을 상상해서 그린다. 내가 앞으로 가면 없던 복도가 생겨나고, 뒤돌아보면 방금 지나온 방이 (대략) 그대로 있다. 세계가 미리 존재하는 게 아니라 내 움직임에 맞춰 즉석에서 태어난다.
핵심 스펙은 README의 "Key Highlights"에 정리돼 있다. 네 가지가 이 프로젝트의 정체성이다.
| 특징 | 내용 |
|---|---|
| 액션 조종 | 수동 재생이 아니라 사용자 키 입력에 실시간 반응하는 연속 탐험(Action-Driven World Control) |
| 실시간 데스크탑 | 단일 RTX 5090에서 720p·16FPS·1.2초 지연·19GB VRAM |
| 무한 롤아웃 | 고정 영상 길이의 한계를 넘어 끝없이 이어지는 open-ended 생성 |
| 열린 상상 | 프롬프트를 안 바꿔도 롤아웃 도중 새 장면·역학으로 확장(scene lock-in 회피) |
월드 모델 자체는 새롭지 않다. DeepMind의 Genie, Decart/Etched의 Oasis(Minecraft를 신경망이 실시간 렌더링) 등이 이미 화제가 됐다. 하지만 이들은 대부분 대규모 GPU 인프라를 전제하거나, 실시간을 위해 해상도를 크게 낮췄다. ABot-World가 주목받는 이유는 이 "실시간성 × 해상도 × 하드웨어 접근성"의 삼각 트레이드오프를 소비자 GPU 한 장에서 720p로 돌파했다고 주장하기 때문이다.
기존 접근과 무엇이 다른지 정리하면 이렇다.
| 비교 축 | 흔한 월드 모델 | ABot-World |
|---|---|---|
| 하드웨어 | 다중 GPU 클러스터 / 서버 | 단일 소비자 GPU(RTX 5090) 1장, 19GB |
| 해상도·속도 | 실시간을 위해 저해상도(예: 360p) 타협 | 720p·16FPS 실시간, 지연 1.2초 |
| 영상 길이 | 고정 길이(수 초) 후 끊김/재시작 | 롤링 KV 캐시로 무한 롤아웃 |
| 장면 고착 | 롤아웃 길어지면 한 장면에 갇힘(lock-in) | LongForcing 학습으로 새 장면 확장 |
| 생성 방식 | 전체 클립을 한 번에 diffusion | 블록(3프레임) 단위 자기회귀 + 4-step 증류 |
'실시간'을 가능케 한 엔지니어링이 이 프로젝트의 진짜 볼거리다. 보통 diffusion은 노이즈를 수십 번 반복해서 걷어내야 깨끗한 이미지가 나온다. ABot-World는 DMD(분포 매칭 증류)로 이 과정을 단 4스텝(1000→750→500→250)으로 압축한 '학생 모델'을 쓴다. 여기에 FP8 양자화, Sparse Linear Attention, 경량 스트리밍 VAE(TAEHV)를 얹어 VRAM 19GB·1.2초 지연을 맞췄다. 즉 모델 연구 + 저정밀 추론 엔지니어링이 한 저장소에 다 들어있다.
50번 덧칠 vs 4번 붓질. 일반 diffusion이 유화를 50겹 덧칠해 완성한다면, DMD로 증류한 학생 모델은 스승의 붓놀림을 통째로 배워 4번의 큰 붓질로 비슷한 그림을 낸다. 품질은 약간 양보하지만, 그 대가로 '실시간'이라는 완전히 다른 사용 경험을 얻는다.
제작 주체가 AMAP(고德 지도, 알리바바) CV LAB이라는 점, 그리고 500시간 규모의 액션 주석 학습 데이터셋 공개를 예고했다는 점도 관심을 키웠다. 자율주행·지도 회사가 왜 월드 모델을? — 실제 세계의 이동·공간을 시뮬레이션하는 능력은 지도/내비/로보틱스와 직결되기 때문이다.
기반은 알리바바의 오픈 영상 모델 Wan 2.2다. ABot-World는 이 Wan DiT(Diffusion Transformer)를 자기회귀·블록 단위·로컬 어텐션 구조로 개조했다.
| 구성요소 | 선택 | 역할 |
|---|---|---|
| 프레임워크 | PyTorch 2.8.0 + cu129 | CUDA 12.9 빌드 (최신 Blackwell 대응) |
| diffusion | diffusers 0.31.0 | 스케줄러·파이프라인 유틸 |
| 트랜스포머 | transformers 4.57.3 | umt5-xxl 텍스트 인코더 로딩 |
| 어텐션 가속 | flash_attn 2.8.1, sageattention 2/3 | 고속·저메모리 어텐션 커널 |
| 양자화 | torchao 0.17.0 + AngelSlim | FP8/INT8/NVFP4 등 저정밀 추론 |
| 기타 | einops, omegaconf, sentencepiece | 텐서 조작·설정·토크나이저 |
브라우저에서 키를 누르면 화면이 흘러나오게 하는 계층이다. gradio 5.49 + flask + flask-socketio(WebSocket)로 저지연 프레임 스트리밍을 구현한다. 프론트엔드는 프레임워크 없는 순수 HTML/CSS/JS(js/main.js, key_handler.js)로, WASD/IJKL 입력을 잡아 서버로 보내고 HUD를 그린다.
opencv-python, imageio(+ffmpeg, libx264), av로 프레임을 인코딩·스트리밍한다. 실행 환경은 conda python=3.12, 검증 환경은 Ubuntu 22.04 · CUDA 13.3 · RTX 5090이다.
이게 프로젝트의 심장이다. 보통 영상 diffusion은 클립 전체를 한꺼번에 만든다. 그러면 길이가 고정되고, 길어질수록 메모리가 폭발한다. ABot-World는 Wan DiT를 인과적(causal)으로 개조해, 블록(3프레임 latent) 단위로 순차 생성하고 이전 블록들은 KV 캐시로 저장해 재사용한다. GPT가 토큰을 하나씩 이어 붙이며 앞 문맥을 캐시하는 것과 똑같은 원리를 영상에 적용한 것이다.
영화 통편집 vs 만화 연재. 일반 영상 생성이 2시간짜리 영화를 통으로 렌더링한다면, ABot-World는 만화를 한 컷씩 연재한다. 이번 컷을 그릴 때 앞 컷들의 '기억'(KV 캐시)만 참고하면 되니, 연재가 아무리 길어져도 한 컷 그리는 비용은 일정하다. 그래서 '무한' 롤아웃이 가능하다.
무한히 길어지는 시퀀스에서 모든 과거를 다 보면 결국 비용이 무한대가 된다. ABot-World는 local_attn_size=21 — 최근 21프레임 창만 어텐션한다. 시퀀스가 아무리 길어져도 연산·메모리 상한이 고정된다(max_attention_size = 21 × 880). 오래된 프레임은 잊고 최근 문맥에 집중하는 '슬라이딩 윈도우'다.
실시간의 물리적 조건. config long_forcing_dmd.yaml의 denoising_step_list: [1000, 750, 500, 250]가 보여주듯, 스승 모델의 수십 스텝을 단 4스텝으로 증류한 학생 생성기를 쓴다. 여기에 피라미드 디노이징(초기 스텝은 낮은 해상도로 처리)까지 얹어 초반 연산을 더 아낀다.
8개 키를 어떻게 신경망이 알아듣게 할까? pipeline/causal_inference.py의 set_act + SimpleAdapter가 담당한다.
[W,A,S,D,I,J,K,L]로 만들고 → repeat_interleave(4)로 32채널로 확장 → 화면 전체 공간에 broadcast.SimpleAdapter가 PixelUnshuffle(16배 축소) → Conv2d → residual로 이 '액션 맵'을 DiT latent 공간(H/16, W/16)에 정렬해 토큰에 더한다.keyboard.py에서 상호배타 처리한다.
ref_num_slots: 5 — 참조 이미지의 latent를 5개 슬롯에 캐시해, 장면이 바뀌어도 세계의 일관성을 유지하는 메모리 역할을 한다. 슬롯마다 별도 RoPE(위치 인코딩)를 부여해, 장면 고착(lock-in) 없이 새 장면을 확장할 수 있게 한다.
구조를 읽는 요령: wan/modules/는 "무엇을 생성하는가"(모델), web_client/는 "어떻게 실시간으로 서빙하는가"(시스템)다. 연구자는 앞을, 엔지니어는 뒤를 먼저 보면 된다. 두 세계를 잇는 다리가 pipeline/causal_inference.py다.
| 주제 | 이 레포에서 배울 수 있는 것 |
|---|---|
| 자기회귀 영상 생성 | KV 캐시 + 블록 단위 생성으로 '무한 스트리밍'하는 실제 구현(generate_next_block) |
| Diffusion 증류 | DMD로 diffusion을 4-step까지 압축해 실시간화하는 config·기법 |
| 조건 주입 | 이산 키입력을 latent 컨트롤맵으로 바꾸는 PixelUnshuffle+Conv 어댑터 패턴 |
| 저정밀 추론 | FP8 per-token GEMM, PTQ 양자화, Sparse Attention, 경량 VAE로 VRAM 19GB 달성 |
| 실시간 서빙 | 워커 스레드 + 프레임 큐 + WebSocket으로 브라우저 저지연 스트리밍 |
| 메모리 관리 | DynamicSwapInstaller로 VRAM 부족 시 모듈을 동적 스왑하는 기법 |
local_attn_size를 줄이거나 늘려, '기억 범위'가 일관성/속도에 주는 영향을 관찰한다.denoising_step_list를 4→2step으로 줄여, 품질과 지연의 트레이드오프를 체감한다."데스크탑 GPU 한 장"이라는 말은 사실이지만, 그 한 장이 NVIDIA RTX 5090(Blackwell)이라는 전제가 붙는다. 실측 기준 720p·16FPS·1.2초 지연에 약 19GB VRAM을 쓴다.
| 항목 | 요구/실측 |
|---|---|
| 권장 GPU | NVIDIA RTX 5090 (Blackwell) — 검증 환경 |
| VRAM 사용 | 약 19GB (720p·16FPS 실측) |
| 저메모리 대응 | VRAM 40GB 미만이면 DynamicSwapInstaller 동적 스왑 자동 활성(LOW_MEMORY_THRESHOLD_GB=40) |
| OS / CUDA | Ubuntu 22.04 · CUDA 13.3 · torch cu129 빌드 |
| 컴파일 필요 | flash_attn·sageattention(2/3)·triton 커널 — 최신 CUDA/컴파일러 환경 |
| 정밀도 커널 | FP8/NVFP4는 Ada/Hopper/Blackwell급 GPU 전제 |
| 체크포인트 | Wan2.2_VAE·taew2_2·umt5-xxl·diffusion 가중치 5종 다운로드 필요 |
이 프로젝트의 "single desktop GPU"는 일반 노트북 GPU가 아니다. FP8/NVFP4 저정밀 커널이 최신 아키텍처(Blackwell)에 최적화돼 있어, 구형 GPU에서는 커널 빌드 자체가 안 되거나 속도가 크게 떨어질 수 있다. VRAM 40GB 미만이면 동적 스왑으로 돌아가긴 하지만 지연이 늘어난다. "내 3060에서도 되겠지"라는 기대는 접는 게 안전하다.
ABOTWORLD_DEBUG_FRONTEND=1 bash web_client/run.sh — 모델을 로드하지 않고 웹 UI·키 HUD·WebSocket 구조만 띄운다. 실시간 서빙이 브라우저와 어떻게 통신하는지, 네트워크 탭으로 프레임 스트림 구조를 관찰하자.
long_forcing_dmd.yaml에서 num_frame_per_block=3, denoising_step_list(4스텝), local_attn_size=21을 찾아, "16FPS를 맞추려면 블록당 몇 ms 안에 생성해야 하는가"를 손으로 계산해 본다. 실시간 시스템의 예산 감각을 익히는 훈련이다.
web_client/scene_presets.yaml에 새 프리셋(참조 이미지 + 프롬프트)을 추가하고 실행해, 같은 액션이 다른 세계에서 어떻게 해석되는지 비교한다. '앞으로 가기'가 숲에서와 복도에서 어떻게 달라지는지 관찰.
scripts/inference.py는 15종 양자화(FP8·INT8·NVFP4 등)를 비교한다. 각 설정의 FPS·VRAM·화질을 표로 만들어, "어느 양자화가 실시간 예산을 만족하면서 품질 손실이 가장 작은가"를 찾는다.
SimpleAdapter와 set_act를 읽고, 8키 외에 '마우스 이동' 같은 연속 입력을 어떻게 32채널 컨트롤맵에 끼워 넣을지 설계해 본다. 조건화 어댑터의 일반화 원리를 체득하는 과제.
| 주차 | 주제 | 핵심 개념 |
|---|---|---|
| 1주차 | Diffusion 기초 | 노이즈 예측·역확산·스케줄러. DDPM/DDIM 개념 |
| 2주차 | Latent Diffusion + VAE | 픽셀이 아닌 latent에서 생성하는 이유. VAE 인코더/디코더 |
| 3주차 | DiT & 영상 생성 | 트랜스포머 백본, Wan/Sora 계열, 시공간 어텐션 |
| 4주차 | Diffusion 증류 | DMD·Consistency·LCM — 스텝 수를 줄여 실시간화하는 법 |
| 5주차 | 자기회귀 생성 & KV 캐시 | causal 마스킹, 로컬/슬라이딩 윈도우 어텐션 |
| 6주차 | 월드 모델 | Genie·Oasis·GameNGen — 액션 조건부 시뮬레이션 |
| 7주차 | 저정밀 추론 | FP8/INT8 양자화, PTQ, Sparse Attention 커널 |
| 8주차 | 실시간 서빙 | 스트리밍 파이프라인, WebSocket, 프레임 큐·워커 |
| 용어 | 의미 |
|---|---|
| world model | 월드 모델. 환경의 작동 규칙을 학습해 다음 상태를 예측·시뮬레이션하는 모델 |
| action-conditioned | 액션 조건부. 사용자 입력(키)을 조건으로 받아 다음 프레임을 생성 |
| autoregressive | 자기회귀. 과거만 참조해 다음 조각(프레임/토큰)을 순차 생성 |
| KV cache | 과거 토큰의 Key·Value를 저장·재사용해 순차 생성을 가속하는 캐시 |
| local attention | 로컬 어텐션. 최근 N프레임(=21)만 참조해 무한 길이에서도 비용 상한 고정 |
| DiT | Diffusion Transformer. U-Net 대신 트랜스포머를 쓰는 diffusion 백본 |
| DMD | Distribution Matching Distillation. diffusion을 소수 스텝으로 증류하는 기법 |
| infinite rollout | 무한 롤아웃. 고정 길이 한계 없이 세계를 끝없이 이어 생성 |
| scene lock-in | 장면 고착. 롤아웃이 길어질수록 한 장면에 갇히는 실패 — LongForcing으로 완화 |
| LongForcing | ABot-World의 학습 기법. 긴 롤아웃에서도 새 장면 확장을 유도 |
| VAE | 영상을 저차원 latent로 압축·복원하는 인코더/디코더. TAEHV는 고속 스트리밍 디코더 |
| FP8 quantization | 가중치·연산을 8비트 부동소수로 낮춰 VRAM·연산을 줄이는 저정밀 추론 |
| SimpleAdapter | 키 입력을 DiT latent 공간의 컨트롤맵으로 정렬해 주입하는 어댑터 모듈 |
| DynamicSwapInstaller | VRAM 부족 시 모듈을 CPU↔GPU 동적 스왑해 큰 모델을 작은 메모리에 올리는 도구 |
amap-cvlab.github.io/ABot-Worldhuggingface.co/acvlab/ABot-World-0-5B-LF · ModelScope amap_cvlab/ABot-World-0-5B-LFabot-world.amap.com (ABot World Studio) · reactor.inc/abot-worldpipeline/causal_inference.py(스트리밍) · wan/modules/causal_model.py(causal DiT) · wan/modules/model.py(SimpleAdapter) · configs/long_forcing_dmd.yaml(설정)