시퀀스 병렬 처리

시퀀스 병렬 처리 (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 정도에서 여전히 더 빠를 수 있지만, 이 확장은 인터커넥트와 입력 형태를 선택 정책의 일부로 만듭니다.

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-degreeulysses\_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:port rendezvous 주소 — 보통 헤드 노드 주소.

모든 노드에서 동일한 명령을 실행하고 --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%), 파이프라인되지 않은 크로스-노드 경로와 바이트 동일한 출력을 냈어요.

더 알아보기