시퀀스 병렬 처리
시퀀스 병렬 처리 (Sequence Parallelism)
이 페이지는 긴 이미지 또는 비디오 잠재(latent) 시퀀스를 GPU에 걸쳐 분할하는 시퀀스 병렬 처리(SP)를 설명해요. SGLang Diffusion에서 공개 컨트롤은 --sp-degree, --ulysses-degree, --ring-degree, --sp-attention-mode예요.
출처: 문서
본문
시퀀스 병렬 처리는 긴 이미지 또는 비디오 잠재 시퀀스를 GPU에 걸쳐 분할해요. SGLang Diffusion의 공개 컨트롤은:
--sp-degree: 총 시퀀스 병렬 정도--ulysses-degree: Ulysses 병렬 정도--ring-degree: ring 병렬 정도--sp-attention-mode: 각 SP 그룹 내부에서 사용되는 어텐션 교환
정도는 다음을 충족해야 해요:
sp_degree = ulysses_degree * ring_degree
기본 --sp-attention-mode ulysses는 all-to-all을 사용해 시퀀스 샤드를 어텐션 헤드에 걸쳐 재분배해요. --sp-attention-mode kv_gather는 쿼리를 시퀀스 샤드로 유지하고 키와 값을 all-gather한 다음 각 랭크의 로컬 출력을 직접 계산해요. K/V-gather 모드는 현재 --ring-degree 1로 비인과적 어텐션을 지원해요. 레거시 UlyssesAttention 어댑터를 통한 varlen 호출과 비디오 희소 어텐션은 지원되지 않아요.
시퀀스 길이나 비디오 형태가 DiT forward pass를 병목으로 만들고 모델이 시퀀스 샤딩을 지원할 때 SP를 사용해요. 지연 시간 중심의 다중 GPU Qwen/Wan 배포의 경우 CFG 병렬 처리 및 FSDP와도 비교해요. SP가 모든 모델에 자동으로 최선의 다중 GPU 설정은 아니에요.
어텐션 교환 선택 (Choosing The Attention Exchange)
| Mode | Communication | Memory | Constraints |
|---|---|---|---|
ulysses |
어텐션 전후의 All-to-all | 어텐션 중 어텐션 헤드 샤드를 가진 전체 시퀀스 | 어텐션 헤드 나눗셈이 Ulysses 정도와 일치해야 함 |
kv\_gather |
K와 V의 All-gather; Q와 출력은 시퀀스 샤드로 유지 | SP 그룹 내 전체 K와 V 복제 | 비인과적 어텐션 및 ring\_degree=1; 레거시 varlen 또는 비디오 희소 어텐션 없음 |
어느 교환도 보편적으로 더 빠르지 않아요. K/V gather는 역 all-to-all을 피하고 로컬 어텐션 형태나 집합 연산이 더 효율적일 때 도움이 될 수 있고, Ulysses는 더 적은 어텐션 활성화 메모리를 사용할 수 있어요. 대상 모델, 해상도, 가속기, 인터커넥트에서 둘 다 벤치마크해요.
SP 정도 P에 대해 랭크당 근사 네트워크 페이로드에서 K/V gather는 Ulysses에 비해 P / 2예요(각 랭크의 로컬 샤드 제외). 따라서 SP2에서 페이로드는 비슷하고, SP4에서 K/V gather는 약 2배, SP8에서 4배의 데이터를 옮겨요. K/V gather는 all-gather와 로컬 어텐션 레이아웃이 더 효율적일 때, 특히 낮은 SP 정도에서 여전히 더 빠를 수 있지만, 이 확장은 인터커넥트와 입력 형태를 선택 정책의 일부로 만듭니다.
권장 명령 (Recommended Commands)
Ulysses 시퀀스 병렬 처리
기본 모드는 ring 병렬 처리를 사용하지 않을 때 총 SP 정도만 필요해요:
sglang serve \
--model-path Qwen/Qwen-Image \
--num-gpus 4 \
--sp-degree 4 \
--port 8898
K/V-Gather 시퀀스 병렬 처리
동일한 SP 프로세스 그룹 레이아웃을 사용하고 대체 어텐션 교환을 명시적으로 선택해요:
sglang serve \
--model-path Qwen/Qwen-Image \
--num-gpus 4 \
--sp-degree 4 \
--sp-attention-mode kv_gather \
--port 8898
텐서 + 시퀀스 병렬 처리
TP와 SP는 독립적인 차원을 사용해요. DP와 CFG 병렬 처리가 비활성화된 상태에서 필요한 GPU 수는 tp_size * sp_degree예요. 이 예시는 2-랭크 SP 차원에 걸쳐 두 TP 그룹을 만들어요:
sglang serve \
--model-path Qwen/Qwen-Image \
--num-gpus 4 \
--tp-size 2 \
--sp-degree 2 \
--sp-attention-mode kv_gather \
--port 8898
--sp-attention-mode kv_gather를 생략하면 동일한 tp=2, sp=2 토폴로지로 TP + Ulysses를 사용해요.
TP + SP 동작 방식
TP와 SP는 DiT 프로세스 메시의 직교 차원을 형성해요. tp=2, sp=2에서 랭크 [0, 1]과 [2, 3]은 TP 그룹이고, 랭크 [0, 2]와 [1, 3]은 SP 그룹이에요. 따라서 각 랭크는 각 유형의 그룹 하나에 속해요:
- TP는 지원되는 어텐션과 MLP 프로젝션 가중치 및 계산을 샤딩한 다음 TP 그룹 내에서 부분 프로젝션 결과를 통신해요.
- SP는 잠재 시퀀스와 어텐션 활성화를 샤딩한 다음 SP 그룹 내부에서 Ulysses 또는 K/V gather를 사용해요.
순수 SP는 DiT 가중치를 모든 SP 랭크에 복제해요. TP 추가는 TP-샤딩 가중치가 사용하는 랭크별 메모리를 줄이고 SP의 시퀀스 활성화 샤딩을 유지하지만, 모든 적용 가능한 DiT 블록에 TP 통신을 추가하는 대가가 있어요. 모든 파라미터나 런타임 버퍼가 TP-샤딩되는 것은 아니므로 정확한 메모리 감소는 모델에 따라 달라요.
따라서 TP + SP는 기본 지연 시간 승자가 아니라 용량과 메모리-지연 시간 파레토 옵션으로 취급되어야 해요. 단일 NVSwitch 노드에서 완전한 DiT 가중치가 모든 GPU에 맞으면 순수 SP가 자주 이겨요. 반복 TP 집합 연산을 피할 수 있기 때문이에요. 순수 SP가 맞지 않거나 더 많은 메모리 헤드룸이 필요하거나 측정된 메모리 감소가 작은 지연 시간 증가를 감수할 만할 때 TP + SP를 시도해요.
다음 대표 eager 결과는 한 NVSwitch 노드의 8개 H200 GPU를 사용했어요. 시간은 중앙값 스케줄러 측 end-to-end 지연 시간이에요. 보편적 정책을 정의하기보다 트레이드오프를 설명해요:
| Model and workload | Fastest tested topology | TP plus SP Pareto point | Tradeoff |
|---|---|---|---|
| Qwen-Image, 1536x1536 | CFG2xSP4 Ulysses: 972.6 ms, 62.8 GiB/GPU | CFG2xTP2xSP2 K/V: 1017.4 ms, 48.4 GiB/GPU | 4.6% 느림, 22.9% 피크 메모리 감소 |
| Wan2.2-A14B, 832x480x81 | CFG2xSP4 K/V: 6573.5 ms, 61.9 GiB/GPU | CFG2xTP2xSP2 K/V: 7243.1 ms, 34.2 GiB/GPU | 10.2% 느림, 44.7% 피크 메모리 감소 |
| LTX2.3, 768x512x241 | SP8 K/V: 7258.2 ms, 55.4 GiB/GPU | TP2xSP4 K/V: 10372.3 ms, 37.8 GiB/GPU | 42.9% 느림, 31.8% 피크 메모리 감소 |
K/V gather는 같은 토폴로지가 전역 지연 승자가 아니더라도 동일 토폴로지에서 TP + SP를 여전히 개선할 수 있어요. 같은 실험에서 Ulysses에 비해 TP2xSP4를 FLUX에서 4.2%, LTX2.3에서 8.4% 개선하고, CFG2xTP2xSP2를 Qwen-Image에서 6.0%, Wan2.2-A14B에서 2.7% 개선했어요. SP 어텐션 백엔드를 먼저 선택하는 대신 순수 SP, TP, CFG와 그 실현 가능한 결합을 포함한 전체 후보 집합을 항상 비교해요.
FSDP + 시퀀스 병렬 처리
FSDP는 SP에 참여하는 동일한 워커에 걸쳐 DiT 가중치를 샤딩할 수 있어요. TP × SP와 달리 FSDP와 SP 정도는 GPU 수를 곱하지 않아요. 순수 SP가 충분히 빠르지만 복제된 DiT 가중치 또는 긴 시퀀스 활성화가 메모리 헤드룸을 너무 적게 남길 때 유용해요:
sglang serve \
--model-path Lightricks/LTX-2.3 \
--num-gpus 2 \
--use-fsdp-inference true \
--sp-degree 2 \
--sp-attention-mode kv_gather \
--port 8898
FSDP는 가중치 all-gather 통신을 추가하므로 둘 다 맞을 때 순수 SP와 비교해요. K/V gather는 FSDP 아래에서도 동일한 비인과적 및 ring_degree=1 제약을 가져요.
Ring 시퀀스 병렬 처리
이 예시는 sp=2, ulysses=1, ring=2로 두 GPU를 사용해요.
sglang serve \
--model-path Wan-AI/Wan2.2-TI2V-5B-Diffusers \
--num-gpus 2 \
--sp-degree 2 \
--ulysses-degree 1 \
--ring-degree 2 \
--port 8898
단일 GPU 기준선 (Single-GPU Baseline)
이득을 시퀀스 병렬 처리에 귀속하기 전에 명시적 단일 GPU 기준선을 사용해요.
sglang serve \
--model-path Wan-AI/Wan2.2-TI2V-5B-Diffusers \
--num-gpus 1 \
--sp-degree 1 \
--ulysses-degree 1 \
--ring-degree 1 \
--port 8898
정도 선택 (Choosing The Degrees)
| Setting | Typical use | Notes |
|---|---|---|
--sp-degree 1 |
단일 GPU 또는 시퀀스 분할 없음 | 이것을 기준선으로 사용해요. |
--ulysses-degree N |
Ulysses 전용 시퀀스 병렬 처리 | ring 병렬 처리가 필요 없으면 --ring-degree 1 유지. |
--ring-degree N |
긴 시퀀스에 걸친 ring 기반 시퀀스 분할 | --sp-degree를 ulysses\_degree \* ring\_degree와 동일하게 유지. |
크로스-노드 시퀀스 병렬 처리 (Cross-Node Sequence Parallelism)
Ulysses 단독으로는 시퀀스 병렬 처리를 한 노드의 GPU 수를 넘어 확장할 수 없어요. 더 넓게 가면 헤드 수 나눗셈을 위반하거나 더 느린 인터노드 링크에 걸쳐 all-to-all을 노출해요. Ring의 point-to-point KV 회전은 어텐션 컴퓨트와 겹치도록 설계됐으며, 이는 all-to-all보다 훨씬 더 느린 크로스-노드 링크를 견뎌요 — 그래서 노드 간 SP 확장 패턴은 노드-로컬 Ulysses × 크로스-노드 Ring이며 Ulysses 단독이 아니에요.
크로스-노드 실행은 일반 SP 정도 위에 세 가지 플래그를 추가해요:
--nnodes: 노드 수.--num-gpus는 모든 노드의 총 GPU 수로 유지되고, 각 노드는num_gpus // nnodes로컬 워커를 실행해요.--node-rank: 이 노드의 랭크. 헤드 노드(HTTP/TokenizerManager 표면 유지)에서0, 다른 노드에서1..nnodes-1(워커 전용).--dist-init-addr: 모든 노드에서 도달 가능한host:portrendezvous 주소 — 보통 헤드 노드 주소.
모든 노드에서 동일한 명령을 실행하고 --node-rank만 바꿔요:
# node 0 (head)
sglang serve \
--model-path MiniMaxAI/MiniMax-H3 \
--model-variant ref2va \
--num-gpus 16 \
--nnodes 2 \
--node-rank 0 \
--dist-init-addr <node0-ip>:23456 \
--sp-degree 16 \
--ulysses-degree 8 \
--ring-degree 2 \
--encoder-parallel replicate \
--port 30010
# node 1 (worker)
sglang serve \
--model-path MiniMaxAI/MiniMax-H3 \
--model-variant ref2va \
--num-gpus 16 \
--nnodes 2 \
--node-rank 1 \
--dist-init-addr <node0-ip>:23456 \
--sp-degree 16 \
--ulysses-degree 8 \
--ring-degree 2 \
--encoder-parallel replicate \
--port 30010
--encoder-parallel replicate는 오늘날 크로스-노드 배포에 필요해요. auto 폴드 결정은 아직 노드 경계 인지가 없어서 노드 간에 텍스트 인코더를 폴드하려 하며, 이는 레퍼런스 조건 인코더를 충돌시켜요. Encoder Parallelism 참고.
Warning 크로스-노드 ring 지원은 모델별이며 실행 플래그만의 속성이 아니에요. 모델 쿡북에서 지원을 확인하고 토폴로지 요구 사항은 Parallelism을 참고해요. 단일 노드 Ulysses만 있는 모델에
--ring-degree > 1을 전달하면 예외가 발생하거나 경우에 따라 조용히 잘못된 출력을 계산할 수 있어요. 크로스-노드 확장이 지원된다고 가정하기 전에 모델 쿡북 페이지를 확인해요.
노드 경계를 넘는 수치 (Numerics across node boundaries)
Ring의 P2P 홉을 통한 online-softmax 병합은 단일 노드 어텐션과 다른 순서로 부동소수점 연산을 누적하므로, 크로스-노드 실행은 같은 프롬프트와 시드의 단일 노드 실행과 비트 일치할 것이라고 기대되지 않아요 — 이것은 다른 어텐션 백엔드를 선택하는 것과 같은 종류의 차이이며 정확성 회귀가 아니에요. 기대되는 것: 동일한 크로스-노드 배포에 대해 같은 요청을 두 번 실행하면 바이트 동일 출력을 내야 해요. 크로스-토폴로지 비교가 아니라 그 반복 요청 검사를 사용해 크로스-노드 배포의 결정성을 검증해요.
벤치마킹 안내 (Benchmarking Guidance)
SP를 벤치마크할 때 같은 모델, 정밀도, 해상도, 프레임 수, 스텝 수, 스케줄러 설정, 프롬프트 유형, 출력 경로를 비교해요. 단계 지연 시간과 피크 GPU 메모리를 모두 보고해요. SP는 통신 오버헤드를 추가하면서 GPU당 메모리를 줄일 수 있어요.
유용한 메트릭:
- End-to-end 지연 시간
- Denoising 단계 지연 시간
- Decoding 단계 지연 시간
- 피크 GPU 메모리 및 피크 할당 메모리
- 가능할 때 통신 또는 런타임 오버헤드
참조 벤치마크 (Reference Benchmark)
다음 수치는 한 설정의 참조 측정이에요. 모든 Wan2.2 배포에 대한 일반적 약속이 아니에요.
- 모델:
Wan-AI/Wan2.2-TI2V-5B-Diffusers - 하드웨어: 시퀀스 병렬 처리용 48GB RTX 40-시리즈 GPU 2개, 기준선용 48GB RTX 40-시리즈 GPU 1개
- 시퀀스 병렬 구성:
sp=2, ulysses=1, ring=2(u1r2) - 기준선 구성:
sp=1, ulysses=1, ring=1(u1r1)
단계 시간 분해 (Stage Time Breakdown)
| Stage / Metric | u1r2 (s) |
u1r1 baseline (s) |
Speedup |
|---|---|---|---|
| InputValidation | 0.1060 | 0.1029 | 0.97x |
| TextEncoding | 1.3965 | 2.2261 | 1.59x |
| LatentPreparation | 0.0002 | 0.0002 | 1.00x |
| TimestepPreparation | 0.0003 | 0.0004 | 1.33x |
| Denoising | 52.6358 | 71.6785 | 1.36x |
| Decoding | 7.6708 | 13.4314 | 1.75x |
| Total | 63.74 | 90.63 | 1.42x |
메모리 사용량 (Memory Usage)
| Memory Metric | u1r2 (GB) |
u1r1 baseline (GB) |
Delta |
|---|---|---|---|
| Peak GPU Memory | 20.07 | 27.40 | -7.33 |
| Peak Allocated | 13.35 | 20.40 | -7.05 |
| Memory Overhead | 6.72 | 7.00 | -0.28 |
| Overhead Ratio | 33.5% | 25.6% | +7.9pp |
이 설정에서 end-to-end 지연 시간은 90.63s에서 63.74s(1.42x)로 개선되고 피크 GPU 메모리는 7.33GB 줄었어요. 오버헤드 비율은 증가했으므로 향후 튜닝은 여전히 대상 하드웨어의 통신과 런타임 오버헤드를 확인해야 해요.
크로스-노드 참조 벤치마크 (Cross-Node Reference Benchmark)
다음 수치는 MiniMax-H3의 크로스-노드 Ulysses × Ring 배포 참조 측정이에요. 모든 모델이나 토폴로지에 대한 일반적 약속이 아니며, 각 모델 쿡북 페이지에서 자체 검증된 크로스-노드 상태를 확인해요.
- 모델:
MiniMaxAI/MiniMax-H3 - 하드웨어: 2노드 × 8× NVIDIA H200 SXM, 동일 클러스터, 노드 간 InfiniBand
- 크로스-노드 구성:
--num-gpus 16 --sp-degree 16 --ulysses-degree 8 --ring-degree 2 - 단일 노드 기준선:
--num-gpus 8 --sp-degree 8 --ulysses-degree 8 --ring-degree 1
프롬프트, 시드, 스텝 수를 고정한 디노이즈 단계 전용 비교:
| Task | Single-node (s/step) | Cross-node (s/step) | Change |
|---|---|---|---|
| T2VA denoise | 0.749 | 0.477 | -36.3% |
| Ref2VA / V2V denoise | 2.572 | 1.494 | -41.9% |
이득은 시퀀스 길이에 따라 커져요. ring의 홉당 통신 비용은 거의 일정하게 유지되는 반면 어텐션 컴퓨트는 시퀀스 길이에 따라 이차적으로 커지므로, V2V의 더 긴 패킹된 시퀀스가 T2VA의 더 짧은 것보다 더 많은 이득을 얻어요. point-to-point KV 회전을 어텐션 컴퓨트에 대해 파이프라인(차단 all_gather 대신)하면, 하나의 V2V 요청의 전체 디노이즈 단계가 단일 노드 8-GPU 기준선 128.6초 대비 68.1~68.3초로 완료됐고(-47.0%), 파이프라인되지 않은 크로스-노드 경로와 바이트 동일한 출력을 냈어요.