본문으로 건너뛰기

[flashinfer] FlashInfer, NVIDIA 최신 GPU를 위한 AlphaMoE NVFP4 커널 최적화로 성능 대폭 향상

PR 링크: flashinfer-ai/flashinfer#6511 상태: Merged | 변경: +9933 / -2008

들어가며

최근 AI 모델, 특히 대규모 언어 모델(LLM)의 발전은 엄청난 연산 능력을 요구합니다. 이러한 요구에 부응하기 위해 GPU 아키텍처는 끊임없이 발전하고 있으며, 소프트웨어 최적화는 이러한 하드웨어의 잠재력을 최대한 끌어내는 데 필수적입니다. NVIDIA의 최신 GPU인 B200(sm_100a) 및 GB300(sm_103a)은 이전 세대 대비 상당한 성능 향상을 제공하지만, 이를 활용하기 위한 최적화된 커널은 필수적입니다.

이번 글에서는 FlashInfer 레포지토리의 PR(#4340 / #5930 lineage)을 분석하여, CAKE 팀에서 개발한 AlphaMoE NVFP4 routed-MoE 연산자가 NVIDIA B200 및 GB300 GPU에서 어떻게 성능을 대폭 향상시켰는지 상세히 살펴보겠습니다. 이 PR은 기존의 SOTA(State-Of-The-Art) 베이스라인을 능가하는 성능을 달성했으며, 특히 다양한 벤치마크에서 뛰어난 결과를 보여주었습니다. Quantization 레시피, tolerance, compile flag, precision class 등은 변경하지 않고 순수하게 커널 최적화만으로 이러한 성과를 이루었다는 점이 주목할 만합니다.

코드 변경사항 분석

이 PR은 여러 커널의 최적화를 통해 전반적인 성능 향상을 목표로 합니다. 주요 변경 사항을 파일별로 나누어 살펴보겠습니다.

csrc/alphamoe_nvfp4_sm100.cu

이 파일은 AlphaMoE 연산의 핵심 CUDA 커널들을 포함하고 있으며, 이번 PR의 대부분의 최적화가 이곳에서 이루어졌습니다.

1. Barrier ID 최적화 (nvfp4_u1_c358nb_down 등)

기존의 일부 다운 커널(nvfp4_s14_c358n_down, nvfp4_s12_c360_down, nvfp4_s11_c407_down)은 하드웨어의 네임드 배리어(named barrier) 제한으로 인해 SM당 최대 2개의 CTA(Compute Thread Array)만 실행할 수 있었습니다. 이는 공유 메모리(shared memory)의 충분한 용량에도 불구하고 활용률을 저하시키는 병목 현상이었습니다.

이번 PR에서는 이 네임드 배리어 ID를 14/15에서 1/2로 변경하여, SM당 최대 10개의 CTA까지 실행 가능하도록 제한을 완화했습니다. 이 변경으로 인해 공유 메모리가 바인딩 제한이 되었고, GB300에서 c358nb의 경우 CTA당 4개, c360b의 경우 5개까지 실행 가능해졌습니다. 이는 활성화된 워프(warp) 수를 크게 증가시켜 성능 향상으로 이어집니다.

Before:

// ... (기존 코드) ...
asm volatile("barrier.sync 14, 192;" ::: "memory");
// ... (기존 코드) ...

After:

// ... (변경된 코드) ...
asm volatile("barrier.sync 1, 192;" ::: "memory");
// ... (변경된 코드) ...

2. K-256 패널 스트리밍 (nvfp4_u1_c358nd_down)

glm_batch_m512 연산에서 사용되는 새로운 라우트 17은 기존의 K-128 박스 대신 K-256 패널로 W2 가중치를 스트리밍합니다. 이는 prepare_nvfp4_w2_data_k256 및 prepare_nvfp4_w2_scales_k256에서 이미 생성된 데이터를 활용하여 TMA(Tensor Memory Access) 쌍을 효율적으로 사용합니다. 이전 방식은 두 개의 8KB K-128 박스와 스칼라 스케일 개더(gather)를 사용했지만, 새로운 방식은 더 큰 K-256 패널을 직접 스트리밍하여 메모리 접근 패턴을 최적화합니다.

3. Compute Capability 기반 커널 선택 (nvfp4_u1_c416t_up)

B200(sm_100a) GPU에서는 glm_decode_m8 연산에 대해 새로운 nvfp4_u1_c416t_up 커널이 선택됩니다. 이 커널은 2개의 CTA/SM으로 실행되며, 더 많은 공유 메모리를 활용합니다. 반면, GB300(sm_103a)에서는 기존 커널(nvfp4_s11_c416s_up)이 더 나은 성능을 보여 해당 커널이 유지됩니다. 이는 GPU 아키텍처별 특성을 고려한 최적화입니다.

Before (sm_103a 유지 커널):

// ... (기존 코드) ...
namespace nvfp4_s11_c416s_up {
// ...
}

After (sm_100a 신규 커널):

// ... (변경된 코드) ...
namespace nvfp4_u1_c416t_up {
// ...
}

4. 토큰 타일 개더 최적화 (nvfp4_u1_c500ag_up)

glm_decode_m1000 및 glm_prefill_m2048 연산에서 사용되는 라우트 16은 토큰 타일 업 커널의 소비자 워프(consumer warp)가 직접 hidden_states_scale에서 스케일 팩터(scale factor)를 가져오도록 변경되었습니다. 이를 통해 별도의 스케일 팩터 패널 커널(c505d)의 실행이 제거되어 오버헤드가 줄었습니다. 대규모 밴드(c500y)는 기존 방식을 유지합니다.

5. moe_align_block_size_kernel 동기화 개선

PR #6222에서 제안된 moe_align_block_size_kernel의 __syncthreads() 누락 문제가 수정되었습니다. 이 문제는 prefix[] 공유 메모리 쓰기가 이진 탐색 전에 완료되지 않아 잘못된 전문가 ID를 할당할 수 있는 경쟁 상태(race condition)를 야기했습니다. 이 수정은 정확성을 보장합니다.

Before:

// ... (기존 코드) ...
  if (tid < num_experts) prefix[tid] = scan_buf[tid];
// ... (기존 코드) ...

After:

// ... (변경된 코드) ...
  if (tid < num_experts) prefix[tid] = scan_buf[tid];
  __syncthreads();
// ... (변경된 코드) ...

6. 자체 라우팅 업 커널 (Routes 18 & 19)

라우트 18 (M=512 GLM) 및 라우트 19 (M=128 GLM)는 전문가별 토큰 계획(expert-major token plan)을 업 커널 내에서 직접 생성하도록 변경되었습니다. 기존에는 별도의 정렬(alignment) 커널이 필요했지만, 이제 업 커널이 이 작업을 통합하여 실행합니다. 이를 통해 정렬 런치(alignment launch)가 사라지고, GB300에서 라우트 18은 약 2.51us, 라우트 19는 약 2.83us의 성능 향상을 보였습니다. B200에서도 유사한 성능 개선이 관찰되었습니다.

Before (라우트 17 체인 예시):

// Up kernel -> Alignment launch -> Down kernel -> Finalize kernel

After (라우트 18 체인 예시):

// Up kernel (includes alignment logic) -> Down kernel -> Finalize kernel

왜 이게 좋은가?

이 PR은 여러 측면에서 뛰어난 최적화를 보여줍니다.

  1. 실질적인 성능 향상:

    • NVIDIA GB300 (sm_103a) GPU에서 측정된 결과에 따르면, 다양한 워크로드에서 Stock 베이스라인 대비 1.02x ~ 1.27x의 속도 향상을 달성했습니다. 특히 M=8, H=7168, I=128 셰이프에서는 1.27x의 놀라운 속도 향상을 보였습니다.
    • NVIDIA B200 (sm_100a) GPU에서도 유사하게 1.01x ~ 1.20x의 속도 향상을 기록했습니다.
    • 대규모 배치(large batch) 워크로드에서도 꾸준한 성능 개선이 확인되었습니다.
  2. 하드웨어 특성 활용:

    • Compute Capability별 커널 선택(nvfp4_u1_c416t_up vs nvfp4_s11_c416s_up)은 각 아키텍처의 고유한 성능 특성을 최대한 활용합니다.
    • 배리어 ID 최적화는 SM의 활용률을 높여 GPU 자원을 더 효율적으로 사용하게 합니다.
  3. 코드 복잡성 감소 및 효율성 증대:

    • 자체 라우팅 업 커널(Routes 18 & 19)은 별도의 정렬 커널을 제거하여 전체 파이프라인을 단순화하고 지연 시간을 줄였습니다.
    • 토큰 타일 개더 최적화는 불필요한 커널 호출을 제거하여 오버헤드를 줄입니다.
  4. 정확성 및 안정성 보장:

    • moe_align_block_size_kernel의 경쟁 상태 수정은 연산의 정확성을 보장합니다.
    • NVFP4 tolerance 내에서 Stock 및 이전 main 브랜치와 비교했을 때 수치적 차이가 거의 없거나 허용 범위 내에 있음을 보여줍니다. 이는 성능 향상이 정확성을 희생시키지 않았음을 의미합니다.
    • 다양한 sanitizer (memcheck, synccheck, racecheck) 테스트를 통과하여 안정성을 입증했습니다.
  5. 일반적인 교훈:

    • 하드웨어 아키텍처 이해: GPU의 Compute Capability, 배리어 메커니즘, 공유 메모리 활용 방식 등을 깊이 이해하는 것이 최적화의 핵심입니다.
    • 병렬 처리 최적화: CTA/SM당 실행 가능한 워프 수를 늘리고, 불필요한 동기화 및 커널 호출을 제거하는 것이 중요합니다.
    • 코드 경로 통합: 관련 로직을 하나의 커널로 통합하여 파이프라인의 오버헤드를 줄일 수 있습니다.
    • 정확성 검증: 성능 최적화 과정에서 수치적 정확성 및 기능적 무결성을 철저히 검증해야 합니다.

리뷰 댓글 분석

주요 리뷰 댓글은 테스트 실행을 요청하는 것이었습니다. @yyihuang님은 test_alphamoe_nvfp4_sm100.py, test_alphamoe_nvfp4_selfroute.py, test_alphamoe_nvfp4_source_route.py 등 관련 테스트 스위트의 실행을 지시했습니다. 이는 코드 변경이 기존 기능에 영향을 미치지 않고 의도한 대로 작동하는지 확인하는 표준적인 절차입니다. 봇의 응답은 CI 파이프라인이 시작되었음을 나타내며, 이는 자동화된 테스트 및 검증이 진행되었음을 시사합니다.

결론

이번 FlashInfer PR은 NVIDIA의 최신 GPU 아키텍처에서 AlphaMoE NVFP4 연산의 성능을 크게 향상시키는 중요한 발걸음입니다. CAKE 팀은 하드웨어의 특성을 깊이 이해하고, 커널 수준의 정교한 최적화를 통해 실질적인 속도 향상과 정확성 보장을 동시에 달성했습니다. 이는 대규모 AI 모델의 효율적인 추론을 위한 중요한 기여이며, 향후 GPU 기반 AI 연산의 발전에 긍정적인 영향을 미칠 것입니다.

참고 자료

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

댓글

관련 포스트

PR Analysis 의 다른글