점진적 해상도 생성

점진적 해상도 생성 (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-DiffusersWan-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 컨텍스트를 새로 고치지만, 이 조합에 의존하기 전에 품질과 속도 향상을 벤치마크해야 해요.

참고 자료 (References)

더 알아보기