인코더 병렬 처리

인코더 병렬 처리 (Encoder Parallelism)

이 페이지는 DiT가 디노이징하는 동안 텍스트/이미지 인코더가, 인코더가 인코딩하는 동안 전체 DiT 복제본이 유휴 상태가 되는 문제를 해결하는 --encoder-parallel 옵션을 설명해요. 이 옵션은 네이티브 인코더가 그렇지 않으면 사용되지 않는 GPU를 인코딩 단계에 활용할 방법을 결정해요.

출처: 문서

본문

DiT가 디노이징하는 동안 텍스트와 이미지 인코더는 유휴 상태이고, 인코더가 인코딩하는 동안 전체 DiT 복제본은 유휴 상태예요. --encoder-parallel은 네이티브 인코더가 그렇지 않으면 사용되지 않는 그 GPU들을 인코딩 단계에 어떻게 사용할지 결정해요. 폴딩(folding)은 네이티브 텍스트/이미지 인코더에 적용되며, 복제본 내 배치 DP(batch DP)는 현재 명시적으로 지원되는 네이티브 텍스트 인코더를 요구해요.

--encoder-parallel {auto,fold,dp,replicate}
Mode What it does Use when
auto 네이티브 텍스트/이미지 인코더에는 폴딩 또는 기존 레이아웃을 선택하고, 지원되는 네이티브 텍스트 인코더에는 배치 DP를 선택 기본값; 인코더별로 결정을 내리고 싶을 때
fold 유휴 DiT 복제본에 걸쳐 인코더 가중치를 TP-샤딩 단일 요청 인코딩을 넓은(wide) 인코더 하나가 지배할 때
dp 지원되는 네이티브 텍스트 인코더 복사본이 프롬프트 배치를 나누고, 복제본 내에서 출력을 all-gather --batching-max-size > 1인 처리량 서빙
replicate 인코더를 자체 DiT TP 그룹에 유지하고 다른 복제본 랭크에 걸쳐 중복 인코딩 폴딩과 배치 DP를 비활성화하려 할 때

두 가속 모드는 인코더별로 상호 배타적이에요. 폴딩은 로드된 모델의 수명 동안 가중치를 샤딩하므로, 폴딩된 인코더는 데이터 병렬일 수 없어요.

어떤 모드가 이기는가 (Which Mode Wins)

T5(hidden 4096), Qwen3(2560), CLIP-L(768)에 대해 H100에서, 배치 1~8 그리고 복제본 크기 2와 4로 측정했어요:

  • 폴딩(Folding) 은 인코더가 충분히 넓어서 GEMM을 샤딩하는 것이 추가되는 레이어 단위 all-reduce보다 나을 때 이득이 있어요. T5는 이득을 보지만, Qwen3(+35%)와 CLIP-L(+50%)은 느려지므로 폴딩은 hidden ≥ 4096에서 게이팅돼요. 복제본이 커질수록 각 랭크의 슬라이스가 계속 작아지므로 그 이득도 포화돼요.
  • 데이터 병렬(Data-parallel) 은 인코딩이 계산 바운드일 때만 이득이 있어요. 이를 위해선 넓은 인코더(hidden ≥ 1024 — CLIP-L은 측정한 모든 배치와 복제본에서 더 느림)와 단일 인코딩 호출의 둘 이상의 프롬프트가 필요해요.
  • 복제(Replication) 는 두 조건 모두 성립하지 않을 때 올바른 답이며, 이는 대부분의 단일 요청 지연 시간 작업이에요.

auto는 정확히 이 규칙들을 인코딩하므로, 직접 측정한 구성을 고정하지 않는 한 auto를 선호하세요.

수치 (Numerics)

replicate는 인코더 TP 정도(degree)가 1일 때만 단일 GPU 인코딩과 비트 단위로 일치해요. 기존 DiT TP 레이아웃과 fold 모두 병렬 감소를 재정렬할 수 있어요. 수학적으로 동등하지만 일반적으로 단일 GPU 커널과 비트 단위(bitwise)로 동일하진 않아요.

dp도 비트 단위로 동일하지 않아요. 각 인코더 복사본은 더 작은 배치를 보므로 GEMM 타일링이 분할되지 않은 참조와 다를 수 있어요. 인코더 TP와 결합할 수도 있어요. 하나의 TP 그룹의 모든 랭크는 동일한 배치 슬라이스를 받고, 대응하는 TP 랭크는 직교하는 encoder-DP 그룹에 걸쳐 출력을 수집해요. 결과는 고정된 토폴로지와 배치 형태에 대해 수학적으로 동등하고 결정적이지만, 긴 비디오 샘플링은 작은 부동소수점 차이를 증폭할 수 있어요.

처리량 서빙. DP가 작동하려면 단일 인코딩 호출이 둘 이상의 프롬프트를 담아야 하므로 배칭 상한도 함께 올려야 해요. 인코더 플래그는 의도적으로 DiT 배칭을 바꾸지 않아요:

sglang serve \
  --model-path Wan-AI/Wan2.2-TI2V-5B-Diffusers \
  --model-type diffusion \
  --num-gpus 2 \
  --tp-size 1 \
  --ulysses-degree 2 \
  --encoder-parallel dp \
  --batching-max-size 2

넓은 텍스트 인코더 하나를 사용한 단일 요청 지연 시간:

sglang serve \
  --model-path Wan-AI/Wan2.2-TI2V-5B-Diffusers \
  --model-type diffusion \
  --num-gpus 4 \
  --ulysses-degree 4 \
  --encoder-parallel fold

단일 GPU 참조에 대한 비트 정확 재현성(bit-exact reproducibility):

sglang serve \
  --model-path Qwen/Qwen-Image-2512 \
  --model-type diffusion \
  --num-gpus 2 \
  --encoder-parallel replicate

다른 플래그와의 상호 작용 (Interaction With Other Flags)

  • Tensor parallel: 인코더 DP는 TP와 결합돼요. TP 그룹이 하나의 배치 슬라이스를 함께 인코딩하고, 동일한 파이프라인 복제본 내 직교 랭크가 배치를 분할하고 수집해요. 순수 TP 복제본에는 인코더 복사본이 하나뿐이므로 추가 배치-DP 정도는 없어요.
  • Data parallel: 인코더 집합 연산(collectives)은 파이프라인 복제본을 절대 넘지 않아요. --dp-size > 1인 경우 각 복제본은 자체 TP/SP/CFG 랭크를 독립적으로 사용해요.
  • Dynamic batching: dp는 넓은 배치에서만 이득이 있어요. 이를 선택한다고 --batching-max-size가 바뀌지는 않으며, 별도로 구성해야 해요. Inference Batching 참고.
  • Sequence parallelism: SP는 DiT 잠재 시퀀스를 분할해요. 인코딩 중에 그 랭크들은 배치 DP용 인코더 복사본을 보유하거나 폴딩된 인코더에 참여해요. Sequence Parallelism 참고.

더 알아보기