[sglang] SGLang: Triton 버전 업그레이드에 따른 MoE 성능 회귀 해결 및 설정 자동화
PR 링크: sgl-project/sglang#24562 상태: Merged | 변경: +0 / -0
들어가며
최근 SGLang 프로젝트에서 PyTorch 2.11로의 업그레이드가 진행되면서, 내부적으로 사용하는 Triton 버전이 3.6.0으로 업데이트되었습니다. 하지만 기존 코드 베이스는 하드코딩된 Triton 버전 리스트에 의존하고 있었기 때문에, 최신 버전인 3.6.0에 대한 최적화 설정(tuned config)을 찾지 못하고 구버전으로 폴백(fallback)되는 성능 회귀(performance regression) 문제가 발생했습니다. 특히 DeepSeek V3 모델과 같이 MoE(Mixture-of-Experts) 구조를 사용하는 모델에서 SM90 아키텍처 기반의 Triton 커널 성능이 크게 저하되는 현상이 관찰되었습니다. 본 글에서는 이 문제를 해결하기 위해 하드코딩된 리스트를 제거하고, 디스크상의 설정을 동적으로 탐색하도록 변경한 PR을 분석합니다.
코드 분석
fused_moe_triton_config.py 변경 사항
기존 코드는 지원하는 Triton 버전을 리스트로 직접 관리하고 있었습니다.
Before:
# Supported Triton versions, should be sorted from the newest to the oldest
supported_triton_versions = ["3.4.0", "3.3.1", "3.2.0", "3.1.0"]
# ... (중략)
# Searching for other triton versions that supports the same config
for try_triton_version in supported_triton_versions:
if try_triton_version == triton_version:
continue
이 방식은 새로운 Triton 버전이 릴리즈될 때마다 개발자가 수동으로 리스트를 업데이트해야 한다는 치명적인 단점이 있습니다. 또한, 최신 버전이 리스트에 없으면 의도치 않게 매우 오래된 버전의 설정을 참조하게 되어 성능 손실이 발생합니다.
After:
# Discover available triton config dirs on disk and search newest-first.
configs_root = os.path.join(config_dir, "configs")
available_versions = sorted(
(
d.removeprefix("triton_").replace("_", ".")
for d in os.listdir(configs_root)
if d.startswith("triton_")
),
key=lambda v: tuple(int(x) for x in v.split(".")),
reverse=True,
)
for try_triton_version in available_versions:
# ... (생략)
변경 후에는 os.listdir을 통해 configs 디렉토리 내의 모든 설정 폴더를 스캔합니다. 이후 sorted 함수와 tuple 변환을 통해 버전 숫자를 기준으로 내림차순 정렬하여, 항상 가장 최신 버전의 설정부터 우선적으로 탐색하도록 로직을 개선했습니다.
왜 이게 좋은가
- 유지보수성 향상: 새로운 Triton 버전이 도입되어도 코드를 수정할 필요가 없습니다. 파일 시스템에 설정 폴더만 추가하면 자동으로 인식됩니다.
- 성능 회귀 방지: 하드코딩된 리스트에 의존하지 않으므로, 최신 환경에서 항상 가장 적합한(최신) 설정 파일을 우선적으로 사용하게 됩니다. 이는 DeepSeek V3와 같은 고성능 모델에서 SM90 아키텍처의 잠재력을 최대한 끌어낼 수 있게 합니다.
- 견고성(Robustness): 버전 문자열을 파싱하여 정렬하는 로직을 도입함으로써, 단순 문자열 정렬 시 발생할 수 있는 버전 비교 오류(예: 3.10이 3.2보다 작게 인식되는 문제)를 원천 차단했습니다.
이러한 패턴은 라이브러리나 프레임워크의 설정 관리에서 매우 권장되는 방식입니다. 하드코딩된 의존성을 제거하고 환경을 동적으로 탐색하게 함으로써, 외부 의존성(Triton, PyTorch)의 잦은 업데이트에 유연하게 대응할 수 있는 구조를 갖추게 되었습니다.
참고 자료
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [sglang] SGLang 성능 최적화: PDL 도입과 안전한 CUDA 동기화로 DSV3.2/GLM-5 가속하기
- 현재글 : [sglang] SGLang: Triton 버전 업그레이드에 따른 MoE 성능 회귀 해결 및 설정 자동화
- 다음글 [sglang] SGLang의 FP4 GEMM 성능 최적화: CuTe DSL 백엔드 도입
댓글