어텐션 백엔드
어텐션 백엔드 (Attention Backends)
이 문서는 sglang diffusion(sglang.multimodal_gen)에서 사용 가능한 어텐션 백엔드와 이를 선택하는 방법을 설명해요. DiT/diffusion transformer는 --attention-backend로 엄격하게 선택되고, 인코더·VAE 같은 보조 컴포넌트는 호환이 되면 사용 후 컴포넌트 기본값이나 플랫폼 호환 백엔드로 폴백해요.
출처: 문서
본문
이 문서는 sglang diffusion(sglang.multimodal_gen)에서 사용 가능한 어텐션 백엔드와 선택 방법을 설명해요.
개요 (Overview)
어텐션 백엔드는 AttentionBackendEnum(sglang.multimodal_gen.runtime.platforms.interface.AttentionBackendEnum)으로 정의되고 CLI 플래그 --attention-backend로 선택돼요.
백엔드 선택은 공유 어텐션 레이어(sglang.multimodal_gen.runtime.layers.attention.layer의 LocalAttention / USPAttention / UlyssesAttention)가 수행해요. --attention-backend은 diffusion transformer / DiT에 엄격해요. 인코더·VAE 같은 보조 컴포넌트는 호환될 때 사용하고, 그 다음 컴포넌트 기본값이나 플랫폼 호환 백엔드로 폴백해요. 보조 컴포넌트가 특정 백엔드를 사용해야 하면 --component-attention-backends를 사용해요. 호환되지 않는 오버라이드는 — SGLang 어텐션 레이어를 구성하지 않는 컴포넌트에 대한 오버라이드 포함 — cross-attention용 sparse 백엔드가 교체될 때를 제외하고는 실패해요.
diffusers 백엔드를 사용할 때 --attention-backend은 diffusers의 set_attention_backend에 전달돼요(예: flash, _flash_3_hub, sage, xformers, native).
- CUDA: 지원되면 FlashAttention(FA3/FA4) 선호, 그 외 PyTorch SDPA로 폴백. SM100/B200에서 dense 비-인과 fp16/bf16 네이티브 어텐션은 cuDNN SDPA를 선호하고 cuDNN에 호환 커널이 없으면 FA4로 폴백.
- ROCm: 사용 가능하면 FlashAttention 사용, 그 외 PyTorch SDPA로 폴백.
- Intel XPU: XPU Flash Attention 백엔드 사용(fp16/bf16, 헤드 크기 64/96/128/192/256), 그 외 PyTorch SDPA로 폴백.
- MUSA: 사용 가능하면 FlashAttention 사용, 설치되면 Sage Attention도 지원, 그 외 PyTorch SDPA로 폴백.
- MPS: 항상 PyTorch SDPA 사용.
- NPU: ring attention이면 FA 사용, 그 외 PyTorch SDPA 사용.
백엔드 옵션 (Backend options)
SGLang 네이티브 파이프라인의 경우 CLI는 AttentionBackendEnum의 소문자 이름을 수용해요. 아래 표는 내장 플랫폼이 구현한 백엔드를 나열해요. fa3/fa4는 fa의 별칭으로 수용돼요.
| CLI 값 | Enum 값 | 참고 |
|---|---|---|
fa / fa3 / fa4 |
FA |
FlashAttention. fa3/fa4는 인자 파싱 중 fa로 정규화 (ServerArgs.**post\_init**) |
torch_sdpa |
TORCH_SDPA |
PyTorch scaled\_dot\_product\_attention |
sliding_tile_attn |
SLIDING_TILE_ATTN |
Sliding Tile Attention (STA). st\_attn 필요. --attention-backend-config로 구성 |
sage_attn |
SAGE_ATTN |
sageattention 필요. Hopper (SM90)에서는 PyPI sageattention==2.2.0이 상류 SM90 바인딩 수정이 없어 지원되지 않음. pip install --force-reinstall git+https://github.com/thu-ml/SageAttention.git@d9704247a5139ab4c03bf7fc6b35cc0e2cbb5ea4 --no-build-isolation 설치. 상류 SageAttention CUDA 확장은 SM80/SM86/SM89/SM90/SM120 대상, 상류 setup.py 참고 |
sage_attn_3 |
SAGE_ATTN_3 |
상류 지침에 따라 설치된 SageAttention3 필요 |
sparge_attn |
SPARGE_ATTN |
훈련 없는 sparse SageAttention2. CUDA SM80/86/87/89/90, FP16/BF16, 헤드 차원 64/128, 시퀀스 길이 최소 128의 정방 self-attention. 다른 어텐션 형태는 dense SDPA 사용. pip install git+https://github.com/thu-ml/SpargeAttn.git --no-build-isolation 설치, topk로 유지 블록 비율 구성 |
sol_attn |
SOL_ATTN |
상류 sol-attn 패키지 필요. pip install git+https://github.com/NVlabs/Sana.git@sol-engine#subdirectory=techniques/sparse\_backends로 설치. BF16, 헤드 차원 128. --attention-backend-config로 구성 |
video_sparse_attn |
VIDEO_SPARSE_ATTN |
vsa 필요. --attention-backend-config로 sparsity 구성 |
subblock_sparse_attn |
SUBBLOCK_SPARSE_ATTN |
CUDA SM90, SM100, SM120에서 MiniMax-H3용 훈련 없는 SubBlock sparsity. 기본 계산 모드는 BF16, compute\_mode=sage\_fp8은 SpargeAttn을 요구하는 SM90 전용 근사 경로. MiniMax-H3 레시피 참고 |
video_sparse_attn_h3 |
VIDEO_SPARSE_ATTN_H3 |
MiniMax-H3 / FastH3용 Video Sparse Attention (VSA-H3). 인트리 Triton block-sparse 커널 (SM90 / SM100 / SM103), 외부 패키지 없음. --attention-backend-config로 구성 |
hybrid_window_attn_h3 |
HYBRID_WINDOW_ATTN_H3 |
VDN-H3 하이브리드 어텐션: 청크 정렬 윈도우 softmax(정확, 게이팅) + 윈도우 보수 위의 Video Delta linear 브랜치. 윈도우는 FlashAttention varlen 호출의 합집합으로 실행 (SM100 / SM103 / SM120에서 FA4, SM90에서 FA3; SM80 / SM86 / SM89에서는 같은 FA3 빌드가 Sm80 메인루프를 FA2급 속도로 실행). --attention-backend-config로 구성 |
vmoba_attn |
VMOBA_ATTN |
kernel.attn.vmoba\_attn.vmoba 필요. --attention-backend-config로 구성 |
aiter |
AITER |
aiter 필요 |
aiter\_sage |
AITER\_SAGE |
aiter 필요 |
sla\_attn |
SLA\_ATTN |
Sparse Linear Attention. SpargeAttn 필요. pip install git+https://github.com/thu-ml/SpargeAttn.git --no-build-isolation로 설치 |
sage\_sla\_attn |
SAGE\_SLA\_ATTN |
SageAttention + Sparse Linear Attention. SpargeAttn 필요 (SLA와 동일 설치) |
sparse_video_gen_2_attn |
SPARSE_VIDEO_GEN_2_ATTN |
svg 필요. 설치 지침은 https://github.com/svg-project/Sparse-VideoGen 참고 |
laser\_attn |
LASER\_ATTN |
sgl\_kernel\_npu로 설치할 수 있는 attentions 필요. NPU 전용 |
block\_sparse\_attn |
BLOCK\_SPARSE\_ATTN |
sgl\_kernel\_npu로 설치할 수 있는 attentions 필요. NPU 전용 |
rain\_fusion\_attn |
RAIN\_FUSION\_ATTN |
sgl\_kernel\_npu로 설치할 수 있는 attentions 필요. NPU 전용 |
fp8\_fa\_sm120 |
FP8\_FA\_SM120 |
SM120 GPU (GeForce RTX 50, RTX PRO Blackwell)용 FP8 (E4M3) dense 어텐션, CuTe-DSL로 작성. Q/K/V는 헤드별로 즉시 양자화, 출력은 BF16 유지. 비-인과, 배치 1, 헤드 차원 128, BF16 입력; 다른 호출은 torch\_cudnn\_sdpa 사용. 옵트인 전용: 출력이 BF16 어텐션과 호출당 상대 RMS 약 5% 차이. 각 새 시퀀스 길이는 한 번 컴파일 (약 10초) |
선택 우선순위 (Selection priority)
runtime/layers/attention/selector.py의 선택 순서는:
global_force_attn_backend(...)/global_force_attn_backend_context_manager(...)- 해당 컴포넌트가 구성되는 동안
--component-attention-backends의 컴포넌트 오버라이드 - CLI
--attention-backend(ServerArgs.attention_backend) - 선언 시 레이어 또는 컴포넌트 기본값
- 자동 선택 (플랫폼 능력, dtype, 설치된 패키지)
명시적 전역 백엔드 불일치는 DiT self-attention에서 실패해요. 보조 컴포넌트는 선언된 기본값이나 다른 호환 백엔드로 폴백할 수 있어요. self-attention용으로 선택된 sparse 백엔드는 cross-attention용 호환 dense 백엔드로 유사하게 폴백해요. 명시적 컴포넌트 오버라이드는 그 외에는 엄격해요.
모델 및 레이어 백엔드 집합은 자동 선택을 안내하지만, 명시적 요청의 긍정 허용 목록은 아니에요. 따라서 --attention-backend 또는 --component-attention-backends로 선택된 백엔드는 매 모델 집합에 먼저 추가하지 않고 사용할 수 있어요. 플랫폼이 해석할 수 없거나 dense cross-attention, packed variable-length attention, ring-attention LSE 같은 필수 연산이 없으면 여전히 fail-closed해요. 정확성을 위해 특정 백엔드가 필요한 모델 경로는 이를 필수로 선언해요. 해당 레이어는 주변 컴포넌트가 오버라이드돼도 그 백엔드를 유지해요.
자동, 측정 기반 선택은 --enable-attention-backend-autotune true를 전달해요. 각 레이어의 첫 충분히 큰 입력에서 네이티브 런타임이 호환 후보를 타이밍하고, 출력이 수치 가드 내에 있고 측정 이득이 노이즈 마진을 초과할 때만 전환해요. 튜너는 기본적으로 비활성이고 현재 SM90과 SM12x에서 검증돼요. --attention-backend 또는 --component-attention-backends로 명시적으로 선택된 백엔드나 모델이 정확성을 위해 요구하는 백엔드는 대체하지 않아요.
구성 (Configuration)
일부 백엔드는 추가 구성이 필요해요. --attention-backend-config로 이 파라미터를 전달할 수 있어요. 이 인자는 다음을 받아요:
- JSON 또는 YAML 구성 파일 경로.
- JSON 문자열 (예:
'{"sparsity": 0.5}'). - 키-값 쌍 (예:
"sparsity=0.5,enable_x=true").
지원 구성 파라미터 (Supported Configuration Parameters)
Sliding Tile Attention (sliding_tile_attn)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
mask_strategy_file_path |
str |
필수. 마스크 전략 JSON 파일 경로 | - |
sta_mode |
str |
STA 모드 | STA_inference |
skip_time_steps |
int |
sparse 어텐션으로 전환하기 전 전체 어텐션을 사용할 스텝 수 | 15 |
Video Sparse Attention (video_sparse_attn)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
sparsity |
float |
검증 sparsity (0.0 - 1.0) | 0.0 |
SpargeAttention (sparge_attn)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
topk |
float |
헤드당 유지되는 예측 어텐션 블록 비율. 더 높은 값은 더 많은 어텐션 작업을 유지하고 일반적으로 품질을 향상. (0, 1] 안이어야 함 |
0.5 |
SpargeAttention은 topk=1에서도 근사예요. 권장 상류 커널이 SageAttention2를 통해 어텐션을 양자화하기 때문이에요. 배포 전에 대상 모델과 해상도에서 출력 품질과 end-to-end 지연 시간을 검증해요.
H3용 Video Sparse Attention (video_sparse_attn_h3)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
VSA_sparsity |
float |
top-k 선택에서 제외되는 비디오 타일 비율 (0.0 - 1.0). 0.9는 FastH3 훈련 정책 |
0.9 |
vsa_mode |
str |
exempt: 비비디오 키(텍스트/오디오 프리픽스 타일)가 항상 선택. compete: top-k에서 비디오 타일과 경쟁 |
exempt |
vsa_dense_first_n_steps |
int |
처음 N개 디노이징 스텝에 dense 어텐션 사용 | 0 |
vsa_dense_layers |
`list[int]`` | dense로 유지되는 레이어 인덱스, 예: [0, 1] |
[] |
vsa_tile_size |
int |
커널 타일 크기. 64(훈련된 (4, 4, 4) 지오메트리)만 수용 |
64 |
VSA-H3 제약:
- DiT만 sparse로 실행. 토큰 리파이너, 텍스트 인코더, VAE는 dense 기본값을 유지. H3 텍스트 인코더에 SDPA 전용 레이어가 있으므로 명시적
--component-attention-backends text_encoder=fa는 거부됨 - 체크포인트의 훈련된
to_gate_compress압축 브랜치 사용. 기본 MiniMax-H3 가중치는 제로 게이트를 로드하고 순수 sparse로 실행 - Ulysses 시퀀스 병렬 처리 지원.
--ring-degree> 1,torch.compile, breakable CUDA graph 실행은 거부
VDN-H3용 Hybrid window attention (hybrid_window_attn_h3)
VDN-H3는 모든 DiT 블록의 dense self-attention을 두 브랜치로 교체해요. softmax 브랜치는 청크 정렬 프레임 윈도우에 대한 정확한 softmax입니다(프레임 t는 청크 t // 5에 속하고 청크 c - 1 .. c + 1에 어텐션. 프레임 0과 F-1은 행과 열로 dense. 모든 텍스트/오디오 쌍은 dense 유지) 헤드별 시그모이드 게이트로 스케일. linear 브랜치(프레임별 Video Delta 규칙 순환, 프레임에 대해 정방향과 역방향)는 정확히 윈도우의 보수를 커버하고 어텐션 모듈이 구동해요. 마스크는 요청-정적이라 메타데이터는 요청당 한 번 구축돼요. 체크포인트의 transformer/config.json이 윈도우 지오메트리를 운반하고 백엔드가 이를 읽어요.
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
vdn_h3_dense_smoke |
bool |
base-H3 + LoRA 동등성 스모크를 위해 VDN-H3 가중치에서 dense 트랜스포머 백엔드(fa) 허용. 게이트와 linear 브랜치가 건너뜀: 연구용, 샘플 아님 |
false |
vdn_max_gather_rows |
int |
윈도우 FlashAttention 호출당 수집되는 K/V 행의 상한. 연속 청크 그룹은 이까지 하나의 호출을 채움. 분할은 어떤 쿼리의 유지 키 집합도 바꾸지 않고 패스 수와 gather의 피크 메모리만 바꿈 | 200000 |
Hybrid window attention 제약:
- VDN-H3는 이 백엔드를 트랜스포머에 요구해요. 이 가중치의 dense 백엔드는 linear 브랜치와 게이트를 조용히 건너뛰므로
vdn_h3_dense_smoke가 설정되지 않으면 거부돼요. 토큰 리파이너, 텍스트 인코더, VAE는 dense 어텐션 유지 - 기본 MiniMax-H3와 FastH3 체크포인트는 linear 브랜치가 없어 이 백엔드에 거부됨
- Ulysses 시퀀스 병렬 처리 지원 (QK-norm + RoPE는 헤드 샤드의 all-to-all 후 실행).
--ring-degree> 1,torch.compile, breakable CUDA graph 실행은 거부
V-MoBA (vmoba_attn)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
temporal_chunk_size |
int |
시간 차원의 청크 크기 | - |
temporal_topk |
int |
시간 차원에서 선택할 Top-K 토큰 | - |
spatial_chunk_size |
list[int] |
공간 차원 (H, W)의 청크 크기 | - |
spatial_topk |
int |
공간 차원에서 선택할 Top-K 토큰 | - |
st_chunk_size |
list[int] |
시공간 차원 (T, H, W)의 청크 크기 | - |
st_topk |
int |
시공간 차원에서 선택할 Top-K 토큰 | - |
moba_select_mode |
str |
선택 모드 (예: threshold) |
threshold |
moba_threshold |
float |
선택용 임계값 | 0.25 |
moba_threshold_type |
str |
임계값 유형 (예: query_head) |
query_head |
first_full_step |
int |
전체 어텐션을 사용할 초기 스텝 수 | 12 |
first_full_layer |
int |
전체 어텐션을 사용할 초기 레이어 수 | 0 |
temporal_layer |
int |
시간 레이어 수 | 1 |
spatial_layer |
int |
공간 레이어 수 | 1 |
st_layer |
int |
시공간 레이어 수 | 1 |
Block Sparse Attention (block_sparse_attn)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
skip_first_steps |
int |
sparse 어텐션으로 전환하기 전 laser attention을 사용할 스텝 수 | 10 |
sparsity |
float |
sparsity 계수는 (0, 1) 범위여야 함 | 0.2 |
Sol-Attn (sol_attn)
| 파라미터 | 타입 | 설명 | 기본값 |
|---|---|---|---|
tau |
float |
라우팅 임계값 스케일. 더 높은 값은 더 적은 정확한 KV 블록을 선택 | 1.0 |
thresh_type |
str |
임계값 모드: diag 또는 exact |
diag |
sink_tokens |
int |
텍스트/오디오 행 같은 프리픽스 토큰용 정확한 KV sink 길이 | 0 |
sink_start |
int |
정확한 KV sink 범위의 시작 인덱스 | 0 |
dense_steps |
int |
처음 N개 디노이징 스텝에 dense 어텐션 사용 | 10 |
dense_layers |
str |
dense로 유지되는 레이어 인덱스, 예: 0,1 또는 0-2 |
0,1 |
dense_backend |
str |
dense 프리픽스에 사용되는 백엔드: fa(기본) 또는 sage_attn. sage_attn은 근사 |
fa |
kv_splits |
`int | str` | Sol-Attn 커널에 전달되는 KV 분할 인자. 긴 시퀀스에서 auto 사용 |
플랫폼 지원 매트릭스 (Platform support matrix)
| 백엔드 | CUDA | ROCm | XPU | MUSA | MPS | NPU | 참고 |
|---|---|---|---|---|---|---|---|
fa |
Yes | Yes | ✅ | ✅ | ❌ | ✅ | CUDA는 SM80+ 및 fp16/bf16 필요. XPU는 자체 flash attention 백엔드 사용. required runtime이 설치된 경우에만 FlashAttention 사용, 그 외 torch\_sdpa로 폴백. NPU는 추가 설치 불필요 |
torch_sdpa |
Yes | Yes | Yes | Yes | ✅ | ✅ | 플랫폼 간 가장 호환되는 옵션 |
sliding_tile_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. st\_attn 필요. --attention-backend-config로 구성 |
sage_attn |
Yes | No | No | Yes | ❌ | ❌ | CUDA 및 MUSA의 선택 의존성. Hopper에서 설치 패키지에 SM90 바인딩 수정이 없으면 FlashAttention으로 폴백 |
sage_attn_3 |
Yes | No | No | No | ❌ | ❌ | CUDA 전용 (선택 의존성) |
sparge_attn |
Yes | No | No | No | ❌ | ❌ | CUDA SM80/86/87/89/90 전용. SpargeAttn 필요. 헤드 차원 64/128 및 시퀀스 길이 최소 128의 정방 self-attention |
sol_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. sol-attn 필요. pip install git+https://github.com/NVlabs/Sana.git@sol-engine#subdirectory=techniques/sparse\_backends로 설치. --attention-backend-config로 구성 |
video_sparse_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. vsa 필요. --attention-backend-config로 sparsity 구성 |
video_sparse_attn_h3 |
Yes | No | No | No | ❌ | ❌ | CUDA 전용 (SM90 / SM100 / SM103). 인트리 Triton 커널, 외부 의존성 없음. --attention-backend-config로 구성 |
sla\_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. SpargeAttn 필요 |
sage\_sla\_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. SpargeAttn 필요 |
vmoba\_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. kernel.attn.vmoba\_attn.vmoba 필요. --attention-backend-config로 구성 |
aiter |
❌ | ✅ | No | No | ❌ | ❌ | aiter 필요 |
aiter\_sage |
❌ | ✅ | No | No | ❌ | ❌ | aiter 필요 |
sparse_video_gen_2_attn |
Yes | No | No | No | ❌ | ❌ | CUDA 전용. svg 필요 |
laser\_attn |
❌ | ❌ | ❌ | ❌ | ❌ | ✅ | NPU 전용. sgl\_kernel\_npu의 attentions 필요. seqlen이 2048 미만이면 SDPA 사용 |
block\_sparse\_attn |
❌ | ❌ | ❌ | ❌ | ❌ | ✅ | NPU 전용. sgl\_kernel\_npu의 attentions 필요. --attention-backend-config로 구성 |
rain\_fusion\_attn |
❌ | ❌ | ❌ | ❌ | ❌ | ✅ | NPU 전용. sgl\_kernel\_npu의 attentions 필요. --attention-backend-config로 구성 |
fp8\_fa\_sm120 |
Yes | ❌ | ❌ | ❌ | ❌ | ❌ | CUDA SM120 전용. 다른 디바이스와 지원되지 않는 호출에서는 torch\_cudnn\_sdpa로 폴백 |
사용법 (Usage)
CLI로 백엔드 선택 (Select a backend via CLI)
sglang generate \
--model-path <MODEL_PATH_OR_ID> \
--prompt "..." \
--attention-backend fa
sglang generate \
--model-path <MODEL_PATH_OR_ID> \
--prompt "..." \
--attention-backend torch_sdpa
한 컴포넌트 오버라이드 (Override one component)
특정 모듈이 주 트랜스포머와 다른 어텐션 의미가 필요할 때 컴포넌트 오버라이드를 사용해요:
sglang generate \
--model-path <MODEL_PATH_OR_ID> \
--prompt "..." \
--attention-backend fa \
--component-attention-backends text_encoder=torch_sdpa
컴포넌트 키는 model_index.json의 파이프라인 모듈 이름(text_encoder, text_encoder_2, transformer, transformer_2, connectors)과 일치해요. 이 오버라이드는 폴백을 고정해야 할 때 사용해요. 전역 백엔드와 달리 호환되지 않는 컴포넌트 오버라이드는 다른 백엔드를 선택하는 대신 오류를 발생시켜요. 유일한 역할 기반 예외는 sparse self-attention 백엔드로, 같은 컴포넌트의 cross-attention 레이어에 호환 dense 백엔드를 사용해요. 컴포넌트는 SGLang 선택 가능 어텐션을 구성하거나 첫 사용까지 선택을 명시적으로 연기해야 해요. 고정 어텐션이 있는 컴포넌트는 오버라이드를 거부해요. 컴포넌트별 오버라이드는 네이티브 파이프라인에만 적용돼요. Diffusers 백엔드는 대신 전역 --attention-backend 패스스루를 수용해요.
요청별 오버라이드 (denoise 루프)
단일 서버가 정확한 어텐션과 근사 어텐션을 나란히 서빙할 수 있어요. 요청은 attention_backend_override 샘플링 파라미터로 DiT denoise 어텐션 백엔드를 전환할 수 있어요. 유효 값은 정확/드롭인 dense 커널 — fa, torch_sdpa, sage_attn, sage_attn_3. 이 필드는 동적 배치 시그니처에 참여하므로 다른 백엔드의 요청은 절대 배치를 공유하지 않아요.
sglang generate \
--model-path <MODEL_PATH_OR_ID> \
--prompt "..." \
--attention-backend-override sage_attn
client.images.generate(
model="<MODEL_PATH_OR_ID>",
prompt="...",
extra_body={"attention_backend_override": "sage_attn"},
)
호환되지 않는 서버 설정은 조용히 폴백하는 대신 요청을 거부해요(서버 로그 포함). breakable CUDA graph와 torch.compile은 어텐션 커널을 캡처/트레이스된 그래프로 구워요. sparse 서버 백엔드(sliding_tile_attn, video_sparse_attn, ...)는 요청별 dense 전환과 혼합할 수 없어요. ring 병렬 처리에서는 대상이 ring-capable이어야 해요. sage_attn / sage_attn_3은 손실(양자화 어텐션)이라는 점에 주의하세요. 워크로드에서 품질을 검증해요.
요청 범위 Skip Softmax
Skip Softmax (BLASST)는 QK matmul은 유지하지만, 추정 softmax 질량이 임계값 아래인 어텐션 타일에 대해 지수, softmax-state 업데이트, V 로드, PV matmul을 건너뛰어요. SGLang의 고정 의존성과 함께 제공되는 FlashInfer 커널이 지원하는 명시적 손실 최적화예요. 알고리즘과 측정된 품질/성능 트레이드오프는 BLASST paper와 NVIDIA의 video-generation study 참고.
하나의 이미지 또는 비디오 요청에서 skip_softmax_params를 전달해요. 런타임은 그 배치에 대해 호환 self-attention 레이어를 FA/FlashInfer 경로로 라우팅해요. cross-attention은 정상 백엔드를 유지하고, 다음 요청은 서버 기본값을 복원해요.
client.videos.create(
model="<MODEL_PATH_OR_ID>",
prompt="...",
extra_body={
"skip_softmax_params": {
"threshold_scale_factor": 500.0,
"start_step": 14,
}
},
)
threshold_scale_factor는 필수이며 양수여야 해요. 커널은threshold_scale_factor / context_length를 사용해요. 더 큰 값은 더 많은 작업을 건너뛰고 보통 품질 손실을 증가시켜요.start_step은 sparse 실행이 시작되는 0-기반 디노이징 스텝이에요. 기본0. 초기 고노이즈 스텝을 dense로 유지하는 것이 일반적으로 더 안전해요.
의도적으로 기본 임계값이 없어요. 각 모델, 해상도, 스텝 수, 배포 백엔드에서 출력 품질 메트릭에 대해 임계값과 시작 스텝을 캘리브레이션해요. 한 워크로드에 튜닝된 값은 이식되지 않아요.
현재 지원은 FP16/BF16, 헤드 차원 128 또는 256, Hopper SM90 및 Blackwell SM100/SM103/SM107의 마스크 없는 self-attention. Ulysses 시퀀스 병렬 처리는 커널이 all-to-all 후 실행되므로 지원돼요. Ring Attention, 어텐션 마스크, torch.compile, breakable CUDA graph는 조용히 dense 어텐션을 실행하는 대신 요청을 거부해요. FA 백엔드만 제공하는 모델은 자동으로 자격이 없어요. 런타임은 여전히 GPU, dtype, 헤드 차원, 어텐션 역할, 실행 모드를 확인해요.
SpargeAttention 사용 (Using SpargeAttention)
선택 CUDA 확장을 설치한 후 백엔드를 명시적으로 선택해요:
pip install ninja
pip install git+https://github.com/thu-ml/SpargeAttn.git --no-build-isolation
sglang generate \
--model-path <MODEL_PATH_OR_ID> \
--prompt "..." \
--attention-backend sparge_attn \
--attention-backend-config topk=0.5
sparge_attn은 호환 self-attention 레이어에 적용돼요. cross-attention은 기존 dense 폴백을 사용해요. 짧은 self-attention과 비대칭 Q/KV도 dense SDPA를 사용해요. LTX-2, LTX-2.3, LTX-2.5는 호환 비디오(128)와 오디오(64) 헤드 차원이 있어 충분히 길고 마스크 없는 self-attention이 SpargeAttention을 사용하고 프롬프트와 오디오-비디오 cross-attention은 dense로 유지돼요. Ulysses 시퀀스 병렬 처리는 지원되지만, 상류 커널이 ring 병합에 필요한 softmax LSE를 노출하지 않으므로 ring attention은 지원되지 않아요. K/V-gather SP는 따라서 일반 sparse 백엔드 규칙을 따르고 대신 Ulysses를 사용해요.
Sage then Sol hybrid
sol_attn은 처음 dense_steps 스텝을 dense로 유지해요. dense_backend=sage_attn을 설정해 그 프리픽스를 SageAttention에서, 꼬리를 Sol sparse 어텐션에서 실행해요. 텍스트 인코더는 torch_sdpa로 유지해요:
sglang generate \
--model-path MiniMaxAI/MiniMax-H3 \
--model-variant fl2va \
--attention-backend sol_attn \
--attention-backend-config dense_backend=sage_attn,dense_steps=10 \
--component-attention-backends text_encoder=torch_sdpa,transformer=sol_attn \
--prompt "A cat walking on a sunny beach, gentle waves." \
--save-output
sage_attn과 sol_attn 모두 근사예요. 기본 DiT 백엔드는 fa로 유지돼요.
Sliding Tile Attention (STA) 사용
# 마스크 전략 파일 경로를 config로 전달
sglang generate \
--model-path <MODEL_PATH_OR_ID> \
--prompt "..." \
--attention-backend sliding_tile_attn \
--attention-backend-config "mask_strategy_file_path=/abs/path/to/mask_strategy.json"
ROCm / MPS 참고 (Notes for ROCm / MPS)
- ROCm: 환경에서 사용 가능한 것에 따라
--attention-backend torch_sdpa또는fa사용. - MPS: 플랫폼 구현은 항상
torch_sdpa사용.