점진적 해상도 생성
점진적 해상도 생성 (Progressive Resolution Generation)
이 페이지는 선택된 SGLang 확산 파이프라인을 위한 실험적인 스펙트럼(spectral) 점진적 해상도 성장 기법을 설명해요. 초기 디노이징 단계를 더 거친(coarser) 잠재 해상도로 실행하고, 전체 해상도 단계 전에 잠재를 스펙트럼 업샘플링해요. 이를 통해 DiT 트랜스포머의 이차 어텐션 비용을 줄여 상당한 속도 향상을 얻을 수 있어요.
출처: 문서
본문
점진적 해상도 성장은 선택된 SGLang 확산 파이프라인을 위한 실험적인 기능이에요. 초기 디노이징 단계를 더 거친 잠재 해상도로 실행하고 전체 해상도 단계 전에 잠재를 스펙트럼 업샘플링해요. 아래 벤치마크 설정에서 이 기법은 DiT 트랜스포머의 이차 어텐션 비용을 줄여 FLUX.1에서 최대 1.63×, FLUX.2에서 1.93×, Z-Image에서 2.33×, Wan 2.1 T2V에서 2.78×, Qwen-Image에서 1.69×, Ideogram 4에서 1.56× 속도 향상을 얻어요.
Spectral Progressive Diffusion (arXiv 2605.18736)을 기반으로 해요.
개요 (Overview)
DiT 어텐션은 시퀀스 길이에 대해 O(n²)이에요. 처음 N개의 디노이징 단계를 절반 공간 해상도로 실행하면 그 단계들의 어텐션 비용을 약 ~6%로 줄여요.
전환 지점 — 각 해상도에서 몇 스텝을 실행할지 — 은 베이즈 최적 주파수 활성화 기준(Bayes-optimal frequency-activation criterion) 으로 계산돼요. 거친 스케일에서 해결할 수 없는 주파수는 거기서 디노이징되지 않아요. 이 방법은 이 기준 아래에서 품질을 보존하도록 설계됐지만, 생성된 출력은 여전히 전체 해상도 기준선과 다를 수 있어요.
| Model | Full-res tokens | Half-res tokens | Token-step ratio |
|---|---|---|---|
| FLUX.1 1024×1024 | 4,096 | 1,024 | 4.0× |
| FLUX.2 1024×1024 | 4,096 | 1,024 | 4.0× |
| Z-Image 1024×1024 | 4,096 | 1,024 | 4.0× |
| Wan 2.1 T2V 480×832 (81 frames) | 6,240 | 1,560 | 4.0× |
| Ideogram 4 1024×1024 | 4,096 | 1,024 | 4.0× |
파라미터 (Parameters)
| Parameter | CLI flag | Default | Description |
|---|---|---|---|
progressive_mode |
--progressive-mode |
"fullres" |
"fullres"는 비활성화(표준 생성과 동일). "dct_rewind"는 스케줄러 되감기(rewind)로 스펙트럼 업샘플 활성화(권장). "dct"는 되감기 없는 업샘플 활성화. |
progressive_levels |
--progressive-levels |
1 |
해상도 반감 횟수. 1 = 하나의 거친 단계(64×64 잠재 → 128×128). 2 = 두 개의 거친 단계(32×32 → 64×64 → 128×128). |
progressive_delta |
--progressive-delta |
0.01 |
노이즈 지배 허용 오차 δ. 거친 해상도에서 실행할 스텝 수를 제어해요. δ가 높을수록 거친 스텝이 많아져 속도 향상이 커져요. |
Tip:
--dit-cpu-offload false를 추가해 트랜스포머를 GPU 상주로 유지하세요. CPU offload를 사용하면 시퀀스 길이와 무관하게 각 스텝이 고정 PCIe 전송 비용을 지불하므로 속도 향상이 희석돼요.
FLUX.1
사용법 (Usage)
sglang generate \
--model-path black-forest-labs/FLUX.1-dev \
--prompt "A serene mountain lake at golden hour, photorealistic" \
--num-inference-steps 50 \
--dit-cpu-offload false \
--progressive-mode dct_rewind \
--progressive-levels 1 \
--progressive-delta 0.05
delta 선택 (Choosing delta)
| δ | Coarse steps (50 total) | Denoising speedup |
|---|---|---|
0.01 |
18 @ 64² + 32 @ 128² | 1.32× |
0.05 |
28 @ 64² + 22 @ 128² | 1.63× |
대부분의 프롬프트에 0.05를 권장해요. 보이는 품질 저하 없이 가장 큰 속도 향상을 줘요.
벤치마크 (Benchmark)
하드웨어: RTX A6000 48 GB, --dit-cpu-offload false. 타이밍 = 디노이징 루프 전용.
| Config | Stage split | Denoise | Speedup |
|---|---|---|---|
| Fullres (baseline) | 50 @ 128² latent | 36.65 s | 1.00× |
| dct_rewind L1 δ=0.01 | 18@64² + 32@128² | 27.67 s | 1.32× |
| dct_rewind L1 δ=0.05 | 28@64² + 22@128² | 22.58 s | 1.62× |
| dct_rewind L2 δ=0.01 | 10@32² + 8@64² + 32@128² | 26.48 s | 1.38× |
Python API
from sglang.multimodal_gen import DiffGenerator
gen = DiffGenerator.from_pretrained(
model_path="black-forest-labs/FLUX.1-dev",
dit_cpu_offload=False,
)
result = gen.generate(sampling_params_kwargs={
"prompt": "A serene mountain lake at golden hour, photorealistic",
"num_inference_steps": 50,
"height": 1024,
"width": 1024,
"progressive_mode": "dct_rewind",
"progressive_levels": 1,
"progressive_delta": 0.05,
})
FLUX.2
FLUX.2-dev, FLUX.2-klein-4B, FLUX.2-klein-9B를 지원해요.
사용법 (Usage)
sglang generate \
--model-path black-forest-labs/FLUX.2-klein-4B \
--prompt "A serene mountain lake at golden hour, photorealistic" \
--num-inference-steps 30 \
--dit-cpu-offload false \
--progressive-mode dct_rewind \
--progressive-levels 1 \
--progressive-delta 0.10
벤치마크 (Benchmark)
하드웨어: RTX A6000 48 GB, --dit-cpu-offload false. 모델: FLUX.2-klein-4B, 30스텝, 1024×1024. 타이밍 = 디노이징 루프 전용, 10개 다양한 프롬프트 평균.
| Config | Stage split | Denoise | Speedup |
|---|---|---|---|
| Fullres (baseline) | 30 @ 64² latent | 9.72 s | 1.00× |
| dct_rewind L1 δ=0.05 | 18@32² + 12@64² | 5.50 s | 1.77× |
| dct_rewind L1 δ=0.10 | 20@32² + 10@64² | 5.03 s | 1.93× |
Python API
from sglang.multimodal_gen import DiffGenerator
gen = DiffGenerator.from_pretrained(
model_path="black-forest-labs/FLUX.2-klein-4B",
dit_cpu_offload=False,
)
result = gen.generate(sampling_params_kwargs={
"prompt": "A serene mountain lake at golden hour, photorealistic",
"num_inference_steps": 30,
"progressive_mode": "dct_rewind",
"progressive_levels": 1,
"progressive_delta": 0.10,
})
Wan 2.1 T2V
Wan-AI/Wan2.1-T2V-1.3B-Diffusers와 Wan-AI/Wan2.1-T2V-14B-Diffusers를 지원해요.
Note: 점진적 생성은 공간 H×W 차원만 키워요. 시간 차원 T(잠재 프레임 수)는 모든 단계에서 고정돼요.
사용법 (Usage)
sglang generate \
--model-path Wan-AI/Wan2.1-T2V-1.3B-Diffusers \
--prompt "A cheetah sprinting across the Serengeti at sunset, slow motion, photorealistic" \
--num-inference-steps 50 \
--num-frames 81 \
--height 480 \
--width 832 \
--guidance-scale 5.0 \
--flow-shift 5.0 \
--dit-cpu-offload false \
--progressive-mode dct_rewind \
--progressive-levels 1 \
--progressive-delta 0.05
delta 선택 (Choosing delta)
| δ | Coarse steps (50 total) | Denoising speedup |
|---|---|---|
0.01 |
23 @ 30×52 + 27 @ 60×104 | 1.65× |
0.02 |
27 @ 30×52 + 23 @ 60×104 | 1.86× |
0.05 |
33 @ 30×52 + 17 @ 60×104 | 2.32× |
0.10 |
37 @ 30×52 + 13 @ 60×104 | 2.78× |
대부분의 프롬프트에 0.05를 권장해요. 0.10은 최대 속도 향상을 제공하지만 움직임이 많은 장면에서 검증해야 해요.
Python API
from sglang.multimodal_gen import DiffGenerator
gen = DiffGenerator.from_pretrained(
model_path="Wan-AI/Wan2.1-T2V-1.3B-Diffusers",
dit_cpu_offload=False,
flow_shift=5.0,
)
result = gen.generate(sampling_params_kwargs={
"prompt": "A cheetah sprinting across the Serengeti at sunset, slow motion, photorealistic",
"num_inference_steps": 50,
"num_frames": 81,
"height": 480,
"width": 832,
"guidance_scale": 5.0,
"progressive_mode": "dct_rewind",
"progressive_levels": 1,
"progressive_delta": 0.05,
})
Z-Image
Tongyi-MAI/Z-Image를 지원해요. Z-Image는 FLUX.1과 동일한 VAE(FluxVAEConfig)를 사용하므로 power-law 스펙트럼 상수도 동일해요. 점진적 단계는 Z-Image의 5D 잠재 형식 [B, C, 1, H, W]를 squeeze/unsqueeze 훅으로 처리하고 각 단계 전환에서 캡션+이미지 RoPE 위치 임베딩을 재계산해요.
Note: 항상
--height 1024 --width 1024(또는 H_lat와 W_lat가 모두 2로 나누어 떨어지는 다른 해상도)를 지정하세요. Z-Image의 기본 해상도(360×640)는 45×80 잠재를 생성하는데, 여기서 H=45는 패치 크기로 나누어 떨어지지 않아요.
사용법 (Usage)
# Standard fullres — unchanged behavior
sglang generate --model-path Tongyi-MAI/Z-Image \
--prompt "A serene mountain lake at golden hour, photorealistic" \
--height 1024 --width 1024
# Progressive dct_rewind L1 δ=0.10 → 2.33× denoising speedup
sglang generate --model-path Tongyi-MAI/Z-Image \
--prompt "A serene mountain lake at golden hour, photorealistic" \
--height 1024 --width 1024 \
--num-inference-steps 50 \
--dit-cpu-offload false \
--progressive-mode dct_rewind \
--progressive-levels 1 \
--progressive-delta 0.10
delta 선택 (Choosing delta)
| δ | Coarse steps (50 total) | Denoising speedup |
|---|---|---|
0.01 |
26 @ 64² + 24 @ 128² | 1.53× |
0.05 |
35 @ 64² + 15 @ 128² | 2.03× |
0.10 |
42 @ 64² + 8 @ 128² | 2.33× |
Z-Image는 이중 CFG(스텝당 두 번의 forward pass)를 사용하므로 거친 해상도에서 절대 어텐션 절감이 두 배가 되어 같은 δ에서 FLUX.1보다 더 높은 점진적 속도 향상을 달성해요. 0.10이 권장 트레이드오프예요.
Python API
from sglang.multimodal_gen import DiffGenerator
gen = DiffGenerator.from_pretrained(
model_path="Tongyi-MAI/Z-Image",
dit_cpu_offload=False,
)
result = gen.generate(sampling_params_kwargs={
"prompt": "A serene mountain lake at golden hour, photorealistic",
"num_inference_steps": 50,
"height": 1024,
"width": 1024,
"progressive_mode": "dct_rewind",
"progressive_levels": 1,
"progressive_delta": 0.10,
})
Qwen-Image
Qwen-Image는 FLUX.1과 동일한 2×2 패치화 규칙(in_channels=64, C=16)을 사용하므로, 동일한 점진적 단계가 RoPE(freqs_cis) 및 공간 메타데이터(img_shapes)용 모델별 훅으로 연결돼요.
# Standard fullres — unchanged behavior
sglang generate --model-path Qwen/Qwen-Image \
--prompt "A serene mountain lake at golden hour"
# Progressive dct_rewind L1 δ=0.20 → 1.69× denoising speedup
sglang generate --model-path Qwen/Qwen-Image \
--prompt "A serene mountain lake at golden hour" \
--progressive-mode dct_rewind --progressive-levels 1 --progressive-delta 0.20 \
--num-inference-steps 30 --dit-cpu-offload false
하드웨어: RTX A6000 48 GB, --dit-cpu-offload false. 타이밍 = 디노이징 루프 전용.
| Config | Stage split | Denoise | Speedup |
|---|---|---|---|
| Fullres (baseline) | 30 @ 128² | 43.00 s | 1.00× |
| dct_rewind L1 δ=0.05 | 13@64² + 17@128² | 33.25 s | 1.29× |
| dct_rewind L1 δ=0.10 | 16@64² + 14@128² | 33.86 s | 1.27× |
| dct_rewind L1 δ=0.20 | 19@64² + 11@128² | 25.40 s | 1.69× |
Ideogram 4
ideogram-ai/ideogram-4를 지원해요. Ideogram 4는 이중 트랜스포머 아키텍처를 사용해요: 조건부 트랜스포머(텍스트 + 이미지 토큰)와 별도 가중치의 무조건 트랜스포머(이미지 토큰만, LLM 피처 제로)로 구성돼요. 두 트랜스포머 모두 거친 해상도에서 축소되어 단일 트랜스포머 모델과 동일한 토큰 비율 이점을 제공해요.
Note: Ideogram 4의 logit-normal 노이즈 스케줄(
std=1.75,mu=0)은 스텝을 중간 sigma 범위 근처에 집중시켜요. FLUX에 비해 고-sigma 거친 적격 영역에 떨어지는 스텝이 더 적어서, 주어진 δ에서 달성 가능한 속도 향상이 제한돼요.
사용법 (Usage)
20-step (V4_DEFAULT_20 preset)
sglang generate \
--model-path ideogram-ai/ideogram-4 \
--prompt "A serene mountain lake at golden hour, photorealistic" \
--height 1024 --width 1024 \
--num-inference-steps 20 \
--dit-cpu-offload false \
--progressive-mode dct_rewind \
--progressive-levels 1 \
--progressive-delta 0.05
48-step (V4_QUALITY_48 preset)
sglang generate \
--model-path ideogram-ai/ideogram-4 \
--prompt "A serene mountain lake at golden hour, photorealistic" \
--height 1024 --width 1024 \
--num-inference-steps 48 \
--dit-cpu-offload false \
--progressive-mode dct_rewind \
--progressive-levels 1 \
--progressive-delta 0.05
벤치마크 (Benchmark)
하드웨어: RTX A6000 48 GB, torch_sdpa, --dit-cpu-offload false. 타이밍 = 디노이징 루프 전용.
20-step (V4_DEFAULT_20)
| Config | Stage split | Denoise | Speedup |
|---|---|---|---|
| Fullres (baseline) | 20 @ 64² | 53.99 s | 1.00× |
| dct_rewind L1 δ=0.01 | 6 @ 32² + 14 @ 64² | 43.47 s | 1.24× |
| dct_rewind L1 δ=0.05 | 9 @ 32² + 11 @ 64² | 38.14 s | 1.42× |
| dct_rewind L1 δ=0.10 | 11 @ 32² + 9 @ 64² | 34.60 s | 1.56× |
48-step (V4_QUALITY_48)
| Config | Stage split | Denoise | Speedup |
|---|---|---|---|
| Fullres (baseline) | 48 @ 64² | 130.92 s | 1.00× |
| dct_rewind L1 δ=0.01 | 12 @ 32² + 36 @ 64² | 109.79 s | 1.19× |
| dct_rewind L1 δ=0.05 | 21 @ 32² + 27 @ 64² | 93.83 s | 1.40× |
| dct_rewind L1 δ=0.10 | 26 @ 32² + 22 @ 64² | 84.94 s | 1.54× |
Python API
from sglang.multimodal_gen import DiffGenerator
gen = DiffGenerator.from_pretrained(
model_path="ideogram-ai/ideogram-4",
dit_cpu_offload=False,
)
result = gen.generate(sampling_params_kwargs={
"prompt": "A serene mountain lake at golden hour, photorealistic",
"num_inference_steps": 48,
"height": 1024,
"width": 1024,
"progressive_mode": "dct_rewind",
"progressive_levels": 1,
"progressive_delta": 0.05,
})
제한 사항 (Limitations)
- 시퀀스 병렬 처리 비호환.
--ulysses-degree나--ring-degree와 결합할 수 없어요. SP가 활성화되면RuntimeError를 발생시켜요. - torch.compile 비호환. 컴파일된 커널은 고정 시퀀스 길이를 가지므로 해상도 전환이 재컴파일이나 오류를 유발해요.
--enable-torch-compile없이 점진적(progressive) 기능을 사용하세요. - Cache-DiT 상호 작용은 실험적. 점진적 단계는 해상도 전환 시 Cache-DiT 컨텍스트를 새로 고치지만, 이 조합에 의존하기 전에 품질과 속도 향상을 벤치마크해야 해요.