JoyAI-Echo
JoyAI-Echo
JoyAI-Echo는 LTX-2를 기반으로 한 8-step 장문(long-form) 오디오-비디오 모델이에요. 짝을 이루는 메모리 뱅크가 프롬프트 전환에 걸쳐 디코딩된 시각적 콘텍스트와 오디오 잠재 변수를 전달해, 화면과 사운드트랙 양쪽 모두에서 연속성이 필요한 multi-shot·분 단위 시퀀스에 가장 강력해요. 표준 LTX 파이프라인 대신 shot 간에 시청각 메모리를 공유해야 할 때 JoyEcho를 선택해요.
SGLang은 내장 JoyAI-Echo overlay를 통해 Echo 1.0 모놀리식 릴리스를 구체화(materialize)해요. 예제 실행 전에 고정된 체크포인트를 준비하세요.
출처: 문서
본문
JoyAI-Echo multi-shot 오디오-비디오 생성을 SGLang Diffusion으로 실행하세요.
1. 모델 소개
JoyAI-Echo는 LTX-2를 기반으로 한 8-step 장문 오디오-비디오 모델이에요. 짝을 이루는 메모리 뱅크가 프롬프트 전환에 걸쳐 디코딩된 시각적 콘텍스트와 오디오 잠재 변수를 전달해, 화면과 사운드트랙 모두에서 연속성이 필요한 multi-shot·분 단위 시퀀스에 가장 강력해요.
shot 간에 시청각 메모리를 공유해야 할 때 표준 LTX 파이프라인 대신 JoyEcho를 고르세요. 증류(destilled)된 832×480 경로는 LTX-2.3이 제공하는 더 높은 해상도의 2단계 품질 모드보다 장문 연속성과 처리량을 우선시해요.
| 측면 | 표준 LTX-2.3 | JoyEcho |
|---|---|---|
| Pipeline | LTX2Pipeline / LTX2TwoStageHQPipeline |
JoyEchoPipeline (이 모델의 기본값) |
| Denoising | 다단계 flow matching + CFG | LTX-2 DMD 증류 경로 (8 steps, guidance_scale=1.0) |
| Multi-shot | 미지원 | shot 간 짝을 이루는 오디오-비디오 메모리 뱅크 |
| Sequence parallelism | LTX-2 SP (video/audio 샤딩) | Ulysses SP (ulysses_degree=2): single-shot과 multi-shot + memory bank |
| Post-processing | 선택적 2단계 HQ 업스케일링 | shot별 mp4 출력 |
2. SGLang-diffusion 설치
diffusion 의존성과 함께 SGLang을 설치하세요:
uv pip install "sglang[diffusion]" --prerelease=allow
플랫폼별 설정은 SGLang Diffusion 설치 가이드를 참고하세요.
3. 모델 배포
3.1 Echo 1.0 체크포인트 준비
네이티브 overlay는 JoyAI-Echo-release.safetensors를 필요로 해요. 업스트림 저장소의 Echo 1.5 리비전에는 이 파일이 없어요. Echo 1.0 리비전을 Hugging Face 캐시로 다운로드하세요:
JOY_ECHO_MODEL_PATH=$(python - <<'PY'
from huggingface_hub import snapshot_download
print(snapshot_download(
repo_id="jdopensource/JoyAI-Echo",
revision="4187f9a53c6eff3a76c51e79bd27f70d10f7591b",
allow_patterns=["JoyAI-Echo-release.safetensors", "*.json", "*.md", "LICENSE"],
))
PY
)
반환된 캐시 경로를 --model-path로 사용하고 로컬 가중치를 쓸 때는 --model-id jdopensource/JoyAI-Echo를 유지하세요. 모델 ID는 BCG가 JoyEcho의 지원 정책을 선택하도록 해줘요. 초기 시작 시 overlay와 그 텍스트 인코더 의존성도 함께 다운로드·구체화해요.
3.2 모델 서빙
JoyEcho는 jdopensource/JoyAI-Echo에 등록된 기본 JoyEchoPipeline을 사용해요. 일반적인 832x480 / 121-frame / 8-step 설정에는 단일 고VRAM GPU(예: H100 또는 H200)면 충분해요.
sglang serve \
--model-path "$JOY_ECHO_MODEL_PATH" \
--model-id jdopensource/JoyAI-Echo
장기 실행을 위한 선택적 환경 변수:
멀티 GPU 서빙에는 텐서 병렬 처리(TP)와 **Ulysses 시퀀스 병렬 처리(SP)**가 지원돼요. JoyEcho SP는 비대칭 레이아웃을 사용해요: 비디오 타겟 잠재 변수는 랭크 간에 시간 샤딩되고, 오디오(memory 토큰 포함)는 모든 랭크에 복제되어 cross-attention이 시간적으로 정렬되도록 유지돼요. enable_memory_bank=true를 쓴 multi-shot 실행은 SP에서 지원돼요.
sglang serve \
--model-path "$JOY_ECHO_MODEL_PATH" \
--model-id jdopensource/JoyAI-Echo \
--num-gpus 2 \
--ulysses-degree 2
4. 모델 호출
4.1 기본 샘플링
| 설정 | 기본값 |
|---|---|
| Resolution | 832x480 |
| Frames | 121 |
| FPS | 25 |
| Steps | 8 |
| Guidance scale | 1.0 |
| Seed | 12345 |
4.2 Single-shot 텍스트-비디오
sglang generate \
--model-path "$JOY_ECHO_MODEL_PATH" \
--model-id jdopensource/JoyAI-Echo \
--prompt "A curious raccoon walks through a sunlit forest path" \
--height 480 --width 832 --num-frames 121 --fps 25 \
--num-inference-steps 8 --seed 42 \
--save-output
독립 클립에서는 구성 파일로 메모리 뱅크를 비활성화하세요:
cat > /tmp/joy_echo_single.json <<'EOF'
{
"prompt": "A curious raccoon walks through a sunlit forest path",
"enable_memory_bank": false,
"seed": 42,
"height": 480,
"width": 832,
"num_frames": 121,
"fps": 25,
"num_inference_steps": 8
}
EOF
sglang generate --config /tmp/joy_echo_single.json \
--model-path "$JOY_ECHO_MODEL_PATH" --model-id jdopensource/JoyAI-Echo \
--save-output
4.3 Multi-shot 생성
JoyEcho는 모든 shot을 한 번의 forward pass로 생성하지 않아요. 각 shot은 하나의 생성 요청이에요. 연속성은 파이프라인 인스턴스 위의 프로세스 내 메모리 뱅크가 담당해요.
일반적인 워크플로:
- Shot 0 — 메모리 뱅크가 비어 있음; 모델이 독립 A/V 클립 생성.
- After decode — 디코딩된 비디오 프레임과 패킹된 오디오 잠재 변수가 메모리 뱅크에 커밋됨 (기본 최대 7 슬롯).
- Shot 1+ — 이전 shot 프레임이 재인코딩되어 denoising 전에 메모리 prefix로 앞에 붙음.
- Per-shot seeding — 공식 의미론은
prompt_seed = base_seed + shot_index를 사용.
구성 파일에서 여러 프롬프트를 리스트로 전달하세요:
cat > /tmp/joy_echo_4shot.json <<'EOF'
{
"prompt": [
"Shot 0: A raccoon wakes up in a cozy attic.",
"Shot 1: The raccoon climbs down and opens the back door.",
"Shot 2: It walks through a rainy alley under neon signs.",
"Shot 3: The raccoon finds a warm bakery window and stops."
],
"enable_memory_bank": true,
"reset_memory_bank": true,
"seed": 42,
"height": 480,
"width": 832,
"num_frames": 121,
"fps": 25,
"num_inference_steps": 8
}
EOF
sglang generate --config /tmp/joy_echo_4shot.json \
--model-path "$JOY_ECHO_MODEL_PATH" --model-id jdopensource/JoyAI-Echo \
--save-output
--prompt-path로 텍스트 파일(줄마다 프롬프트 하나)에서 프롬프트를 전달할 수도 있어요:
sglang generate \
--model-path "$JOY_ECHO_MODEL_PATH" \
--model-id jdopensource/JoyAI-Echo \
--prompt-path /tmp/joy_echo_shots.txt \
--seed 42 \
--height 480 --width 832 --num-frames 121 --fps 25 \
--num-inference-steps 8 \
--save-output
4.4 메모리 뱅크 제어
| Parameter | 기본값 | 의미 |
|---|---|---|
enable_memory_bank |
true |
shot 간 짝을 이루는 A/V 메모리 뱅크 읽기/쓰기. |
reset_memory_bank |
true |
새 세션 시작 시(request_id 변경 또는 첫 shot) 뱅크와 shot 카운터 정리. |
shot 간 연속성이 없이 독립 shot을 원하면 enable_memory_bank=false를 설정하세요.
4.5 측정된 2×H200 single-shot 구성
짧은 독립 클립에서는 --component-residency=all=resident로 텍스트/오디오-비디오 컴포넌트를 GPU에 유지하세요. 전체 스테이지 프로파일에서 이렇게 하면 컴포넌트 사용 사이의 반복적인 host-to-device 가중치 복사가 제거되는 것으로 나타났어요.
다음 구성은 Ulysses degree 2, TP1, PyTorch 2.11.0+cu130, 640x384, 33 frames, 8 steps, seed 42로 두 H200에서 측정됐어요. 컴파일과 메모리 뱅크를 비활성화해요:
cat > joy_echo_h200.json <<'EOF'
{"enable_memory_bank": false}
EOF
CUDA_VISIBLE_DEVICES=0,1 sglang generate \
--model-path "$JOY_ECHO_MODEL_PATH" --model-id jdopensource/JoyAI-Echo \
--config joy_echo_h200.json --prompt "A curious raccoon" \
--width 640 --height 384 --num-frames 33 --num-inference-steps 8 --seed 42 \
--num-gpus 2 --ulysses-degree 2 \
--performance-mode manual --enable-torch-compile=false --quality lossless \
--component-residency=all=resident --warmup-mode request \
--save-output --perf-dump-path joy_echo_h200.json.perf
BCG에서는 --enable-breakable-cuda-graph --warmup-resolutions 640x384 --warmup-num-frames 33을 추가하세요. 성공적인 [Diffusion BCG] captured 로그와 요청 서명 미스가 없는지 확인하세요. warmup과 동일한 모델 ID, 해상도, 프레임 수, 품질을 유지하세요.
요청 warmup 이후 구성별로 두 개의 새 프로세스 저장 요청:
| Lossless mode | Auto residency E2E | All resident E2E | Reduction | Peak reserved per rank, auto → resident |
|---|---|---|---|---|
| Eager | 2.563 s | 2.366 s | 7.65% | 46.43 → 69.32 GiB |
| BCG | 1.229 s | 1.058 s | 13.88% | 48.77–48.88 → 69.32 GiB |
이 타이밍에서 로딩, warmup, 프로파일링은 제외돼요. 짝을 이루는 eager 프로파일은 고정된 host-to-device 복사 71개(13.07 GB, 프로파일된 랭크에서 278.86 ms)를 제거하고, 커널 런치는 같은 77,045개예요. 8개의 lossless 출력은 픽셀 단위로 동일한 비디오 프레임을 가지며, 오디오 차이는 기준선 반복 변동과 비슷해요. 이 결과는 기본 121-frame 또는 multi-shot 메모리 뱅크 워크로드가 아니라 이 컴팩트한 single-shot 워크로드를 다뤄요.
이 레시피에는 quality=lossless를 사용하세요. High 모드 출력은 별도 품질 비교를 통과하지 못했고, high + BCG는 런타임에서 거부돼요. 더 큰 요청이 가용 메모리를 초과하면 auto residency로 돌아가거나 선택된 컴포넌트만 resident로 유지하세요.
5. 실용 팁
- 공식 JoyEcho DMD 증류 경로와 맞추려면
--num-inference-steps 8과--guidance-scale 1.0을 사용하세요. - Multi-shot 프롬프트는
prompt리스트,prompt_path, 또는 같은 서버 인스턴스에 대한 순차 API 호출로 전달할 수 있어요. - 메모리 뱅크는 7 슬롯으로 제한되고, shot 8부터는 가장 오래된 슬롯이 밀려나요.
- 2-GPU 지연 시간에는 single-shot과 multi-shot 모두에서 Ulysses SP(
--num-gpus 2 --ulysses-degree 2)를 시도해요. 다른 샤딩 전략이나 GPU 2개 이상이 필요하면 TP를 사용하세요. - 긴 multi-shot SP 세션에서는
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True를 설정하세요. - JoyEcho는 동기화된 오디오와 함께 shot별 mp4 파일을 출력해요. LTX-2.3 HQ 같은 내장 2단계 HQ 업스케일링 경로는 없어요.