본문으로 건너뛰기

[flashinfer] FlashInfer SM90 아키텍처 성능 최적화: QkvNormRopeExchangeOverlap의 Shape Gate 개선

PR 링크: flashinfer-ai/flashinfer#6717 상태: Merged | 변경: +24 / -15

들어가며

고성능 LLM 추론 엔진인 FlashInfer에서 QkvNormRopeExchangeOverlap 연산은 QKV 프로젝션, RMSNorm, RoPE, 그리고 Ulysses 통신을 융합하여 처리합니다. 이 과정에서 GPU 아키텍처별로 최적의 성능을 내기 위해 'Shape Gate'라는 메커니즘을 사용하여 행(row) 수에 따라 실행 계획을 동적으로 조정합니다. 이번 PR은 SM90(Hopper) 아키텍처에서 기존에 비활성화되어 있던 words_capacity_small_m 게이트를 활성화하여, 작은 행 크기에서의 통신 효율을 최적화하는 내용을 담고 있습니다.

코드 분석

1. flashinfer/comm/cake_qkv_exchange_plan.py

핵심 변경 사항은 SM90 아키텍처의 기본 설정값을 변경한 것입니다. words_capacity_small_m을 0(off)에서 4096으로 변경하여, 4096행 이하의 작업에 대해 readiness word를 발행하도록 했습니다.

# Before
"sm_90a": {
    "words_capacity_small_m": SHAPE_GATE_OFF,
    "reserved_sms_large_m": 16384,
    "per_dest_large_m": SHAPE_GATE_OFF,
},

# After
"sm_90a": {
    "words_capacity_small_m": 4096,
    "reserved_sms_large_m": 16384,
    "per_dest_large_m": SHAPE_GATE_OFF,
},

2. tests/comm/test_qkv_norm_rope_exchange_overlap.py

변경 사항이 의도대로 동작하는지 검증하기 위해 테스트 케이스가 업데이트되었습니다. 4096행 이하의 경우 words_capacity_small_m 게이트가 정상적으로 발동하는지 확인합니다.

# After
hopper = plans.default_shape_gates("sm_90a")
for rows in (128, 4096):
    verdict = plans.gate_rows(hopper, rows)
    assert verdict.fired == ("words_capacity_small_m",)
    assert verdict.words_capacity_per_dest == 1

왜 이게 좋은가

이번 최적화는 Hopper(H100) 아키텍처에서 실제 벤치마크를 통해 성능 향상을 입증했습니다. 8개 GPU 노드 환경에서 그룹 크기별로 측정했을 때, +1.19%(8 ranks), +0.40%(4 ranks), +0.42%(2 ranks)의 성능 향상을 기록했습니다.

이러한 최적화의 핵심 교훈은 다음과 같습니다:

  1. 아키텍처별 튜닝의 중요성: 동일한 커널이라도 SM90, SM100 등 아키텍처의 특성에 따라 최적의 실행 계획이 다를 수 있습니다.
  2. 데이터 기반의 게이트 설정: 무조건적인 최적화보다는 특정 행 크기(threshold)를 기준으로 게이트를 설정함으로써, 작은 작업과 큰 작업 모두에서 오버헤드를 최소화할 수 있습니다.
  3. 테스트를 통한 검증: Shape Gate와 같은 복잡한 실행 계획 변경 시, 단위 테스트를 통해 아키텍처별 분기 로직이 정확히 동작하는지 확인하는 것이 필수적입니다.

이번 변경은 커널 코드 자체를 수정하지 않고도 호스트 측의 계획(plan)만 조정하여 성능을 끌어올린 효율적인 사례입니다.

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글