LingBot World 2.0
LingBot World 2.0
LingBot World 2.0은 LingBot 계열의 14B 실시간 카메라 제어 월드 모델입니다. 라이브 인과 세션에서 연속적으로 생성하고, 청크 사이에 제어 업데이트를 받으며, DiT·VAE 상태를 재사용해 증분 프레임을 전달합니다.
출처: 문서
본문
<DiffusionModelTags tags={["realtime", "world model", "14B causal DiT", "camera control", "interactive KV window"]} />
1. 모델 소개 (Model Introduction)
LingBot World 2.0은 LingBot 계열의 14B 실시간 카메라 제어 월드 모델입니다. 라이브 인과 세션에서 연속적으로 생성하고, 청크 사이에 제어 업데이트를 받으며, 증분 프레임 전달을 위해 DiT·VAE 상태를 재사용합니다.
더 큰 모델과 대화형 KV-창 경로가 8-GPU 배포를 정당화할 때 2.0을 선택하세요. 이전 LingBot 릴리스처럼 오프라인 비디오 디퓨전의 전체-클립 전역 컨텍스트보다 반응형 제어와 제한된 인과 상태를 우선시합니다.
2. 배포 (Deployment)
export SGLANG_LINGBOT_LAZY_VAE_ENCODE_BLACK_FRAMES=60
export SGLANG_LINGBOT_ENABLE_INTERACTIVE_KV_WINDOW=true
sglang serve \
--model-path robbyant/lingbot-world-v2-14b-causal-fast-diffusers \
--pipeline-class-name LingBotWorldCausalDMDPipeline \
--num-gpus 8 \
--ulysses-degree 8 \
--dit-cpu-offload false \
--text-encoder-cpu-offload false \
--vae-config.use-parallel-decode true \
--vae-config.parallel-decode-mode spatial \
--enable-torch-compile false
선택적 KV 캐시 압축 (Optional KV-Cache Compression)
장기 실행 세션은 양자화 가이드에 설명된 대로 quant-videogen을 설치하고 서버 명령에 --kv-cache-quant int4를 추가해 완료된 인과 KV-캐시 청크에 대해 손실 int4 PRQ 압축을 활성화할 수 있습니다. 현재 및 가장 최근 완료된 청크는 BF16으로 유지됩니다. 알고리즘, 튜닝 옵션, 측정된 메모리-지연 트레이드오프, 지원 한계는 인과 KV-캐시 양자화를 참조하세요.
3. Realtime WebUI
가벼운 로컬 WebUI는 지연, 프레임 전송, 카메라 제어 동작을 검증하는 데 유용합니다.
python -m http.server 18080 -d python/sglang/multimodal_gen/apps/realtime_webui
http://127.0.0.1:18080을 열고 사용:
ws://127.0.0.1:30000/v1/realtime_video/generate
4. HTTP 및 WebSocket API
LingBot World 2.0은 realtime 비디오 WebSocket 엔드포인트를 사용합니다. 서버는 하나의 라이브 세션을 유지하고, 한 번에 하나의 청크를 생성하며, 생성이 실행되는 동안 런타임 제어 이벤트를 받습니다.
엔드포인트 (Endpoints)
| API | 방식 (Method) | 목적 (Purpose) | 참고 (Notes) |
|---|---|---|---|
/v1/models |
GET |
세션을 열기 전에 서빙되는 모델 id 조회. | WebUI는 서버가 모델 메타데이터를 노출할 때 모델 필드를 채우는 데 사용. |
/v1/realtime_video/generate |
WebSocket |
하나의 realtime LingBot 세션을 만들고 생성된 비디오 청크를 스트리밍. | 첫 클라이언트 메시지는 MessagePack으로 인코딩된 init 메시지여야 함. |
init 메시지
WebSocket이 열린 직후 이 MessagePack 맵을 보내세요.
| 파라미터 (Parameter) | 타입 (Type) | 필수 (Required) | 의미 (Meaning) |
|---|---|---|---|
type |
string | Yes | "init"이어야 함. |
model |
string | No | 모델 id. 비워 두면 서빙 모델 사용. |
prompt |
string | Yes | 초기 장면과 동작 스타일용 텍스트 프롬프트. |
first_frame |
bytes 또는 string | Yes | 초기 레퍼런스 이미지. WebUI/클라이언트에서 바이트를 보내거나 서버가 읽을 수 있는 이미지 경로/문자열을 보냄. |
size |
string | Yes | 생성 크기 WIDTHxHEIGHT. 예: 832x480. |
fps |
number | Yes | 생성 스트림의 대상 재생 FPS. |
num_frames |
integer | Yes | 생성 청크당 프레임 수. LingBot은 chunked causal 생성을 사용하므로 청크당 지연과 큐 크기를 제어. |
seed |
integer | No | 결정적 샘플링용 랜덤 시드. |
num_inference_steps |
integer | No | 청크당 디노이즈 스텝. 생략 시 LingBot 기본값 4. |
guidance_scale |
number | No | Classifier-free guidance 스케일. Realtime LingBot은 보통 1 사용. |
negative_prompt |
string | No | 디퓨전 파이프라인에 전달되는 네거티브 프롬프트. |
quality |
"lossless", "extra-high", "high" |
No | lossless는 FP32 VAE 디코드를 유지. extra-high는 FP32 디코드를 유지하고 적격 요청-게이트 커널 융합만 활성화. high는 그 융합을 포함하고 검증된 BF16 디코드 경로로 청크당 지연을 낮춤. |
max_chunks |
integer | No | 이 청크 수 후 중지. 연속 세션에는 생략. |
realtime_causal_sink_size |
integer | No | 인과 어텐션 창에 유지하는 sink 프레임/토큰 수. |
realtime_causal_kv_cache_num_frames |
integer | No | 인과 KV 캐시 창에 유지하는 최근 프레임 수. |
realtime_output_format |
"webp", "jpeg", "raw" |
No | 프리뷰/출력 전송. webp·jpeg는 인코딩된 프리뷰 프레임 전송, raw는 원시 RGB 전송, 생략 시 무손실 delta-gzip RGB. |
output_compression |
integer | No | webp 또는 jpeg용 프리뷰 품질. 1에서 100까지. |
enable_upscaling |
boolean | No | 프레임 디코드 후 서버 측 슈퍼 레졸루션 활성화. |
upscaling_scale |
integer | No | 슈퍼 레졸루션 배율. 현재 기본값은 업스케일링 활성화 시 4. |
upscaling_model_path |
string | No | 선택적 Real-ESRGAN 모델 경로. |
enable_frame_interpolation |
boolean | No | 프레임 인터폴레이션 활성화. 실제 생성 FPS를 측정할 때는 비활성화 유지. |
frame_interpolation_exp |
integer | No | 인터폴레이션 배율 지수. 1은 2x 프레임. |
frame_interpolation_scale |
number | No | 인터폴레이션용 RIFE 내부 배율. |
frame_interpolation_model_path |
string | No | 선택적 RIFE 모델 경로. |
condition_inputs.camera_actions |
list[list[string]] |
No | 초기 스크립트 카메라 동작. 프레임당 하나의 동작 리스트. |
런타임 event 메시지
init 후 MessagePack 이벤트 맵을 보내 라이브 세션을 업데이트합니다.
| 파라미터 (Parameter) | 타입 (Type) | 필수 (Required) | 의미 (Meaning) |
|---|---|---|---|
type |
string | Yes | "event"이어야 함. |
kind |
"prompt", "camera_actions", 또는 "composite_input" |
Yes | 런타임 이벤트 종류. |
payload |
string, object, 또는 list | Yes | prompt는 비어 있지 않은 문자열. camera_actions는 스크립트 list[list[string]] 또는 state-mode 페이로드. composite_input은 input_types와 각 명명된 입력을 포함하는 맵. |
event_id |
integer | No | 클라이언트 시퀀스 id. 서버는 이벤트가 샘플링된 후 청크/프레임 메타데이터에 이를 반향. |
camera_actions는 두 가지 페이로드 모드를 지원합니다:
| 모드 (Mode) | 페이로드 형태 (Payload shape) | 의미 (Meaning) |
|---|---|---|
| Script | list[list[string]] |
다가오는 청크가 소비하는 고정 프레임별 동작 시퀀스. |
| State | { "mode": "state", "transitions": [{"actions": [...], "client_ts_ms": ...}] } |
키보드 또는 UI 컨트롤의 라이브 제어 상태 전환. |
지원되는 LingBot 동작 토큰: 카메라 이동 w, a, s, d와 보기 컨트롤 i, j, k, l.
프롬프트와 카메라 컨트롤을 한 이벤트로 업데이트하는 등 여러 런타임 입력을 함께 샘플링해야 할 때 composite_input을 사용하세요.
서버 메시지
| 메시지 (Message) | 페이로드 (Payload) | 의미 (Meaning) |
|---|---|---|
frame_batch |
payload 바이트가 있는 MessagePack 맵 |
프레임 한 배치. 맵은 chunk_index, num_frames, content_type, encoding, width, height, 프레임 배치 메타데이터를 포함. |
chunk_stats |
MessagePack 맵 | 청크별 타이밍·전송 메트릭: scheduler_forward_ms, raw_payload_build_ms, chunk_total_ms, num_frames, ws_payload_bytes. |
error |
MessagePack 맵 | 서버 측 검증 또는 생성 오류. |
최소 클라이언트 스케치
import msgspec.msgpack
import websocket
ws = websocket.create_connection("ws://127.0.0.1:30000/v1/realtime_video/generate")
ws.send_binary(msgspec.msgpack.encode({
"type": "init",
"prompt": "A quiet rainy London alley, stable camera motion.",
"first_frame": open("reference.jpg", "rb").read(),
"size": "832x480",
"fps": 25,
"num_frames": 9,
"num_inference_steps": 4,
"guidance_scale": 1,
"realtime_output_format": "webp",
"output_compression": 95,
}))
ws.send_binary(msgspec.msgpack.encode({
"type": "event",
"kind": "camera_actions",
"event_id": 1,
"payload": {"mode": "state", "transitions": [{"actions": ["w"], "client_ts_ms": 0}]},
}))
ws.send_binary(msgspec.msgpack.encode({
"type": "event",
"kind": "prompt",
"event_id": 2,
"payload": "A quiet snowy Tokyo alley, stable camera motion.",
}))
ws.send_binary(msgspec.msgpack.encode({
"type": "event",
"kind": "composite_input",
"event_id": 3,
"payload": {
"input_types": ["prompt", "camera_actions"],
"prompt": "A quiet neon Shanghai alley, stable forward camera motion.",
"camera_actions": [["w"], ["w"], []],
},
}))
5. 일관성 (Consistency)
LingBot World 2.0은 일관성 검사에 raw-frame websocket GT와 청크별 지연 가드를 사용합니다.
6. 참고 (Notes)
- 대화형 세션에는 realtime 엔드포인트를 사용하세요:
/v1/realtime_video/generate. - 대화형 테스트에는 WebP 프리뷰 전송을 선호하고, 일관성 검사에는 raw-frame 전송을 사용하세요.
- 장기 실행 세션은 인과 캐시, 조건 샘플링, VAE 디코드 동작을 바꾸기 전에 raw-frame 일관성으로 검증해야 합니다.