본문으로 건너뛰기

[SGLang] 하드웨어별 양자화 튜닝: B200, H100, MI300X 최적 설정

들어가며

동일한 양자화 알고리즘이라도 GPU 아키텍처에 따라 최적의 커널 파라미터가 다르다. SGLang은 python/sglang/srt/layers/quantization/configs/ 디렉터리에 하드웨어별 최적화된 Triton 커널 설정을 JSON 파일로 미리 저장하여, 런타임에 자동으로 적용한다.

구조도

configs/ 디렉터리 구조
├── README.md
└── N={N},K={K},device_name={GPU},dtype={type},block_shape=[{bn},{bk}].json

파일명 파싱:
  N=24576, K=7168         → 행렬 크기 (출력 x 입력)
  device_name=NVIDIA_B200 → GPU 모델
  dtype=fp8_w8a8          → 양자화 타입
  block_shape=[128,128]   → 블록 양자화 크기

지원 GPU 목록:
  NVIDIA: B200, H200, H100, H20, L40, L20Y, A100, A800
  AMD:    MI300X, MI325X, Radeon Graphics

핵심 코드 분석

1. 설정 파일 포맷

각 JSON 파일은 배치 크기별 최적 Triton 커널 파라미터를 담고 있다.

H100 설정 예시 (N=1536,K=1536,device_name=NVIDIA_H100_80GB_HBM3,dtype=fp8_w8a8,block_shape=[128, 128].json):

{
    "1": {
        "BLOCK_SIZE_M": 64,
        "BLOCK_SIZE_N": 64,
        "BLOCK_SIZE_K": 128,
        "GROUP_SIZE_M": 1,
        "num_warps": 4,
        "num_stages": 4
    },
    "2": {
        "BLOCK_SIZE_M": 64,
        "BLOCK_SIZE_N": 32,
        "BLOCK_SIZE_K": 128,
        "GROUP_SIZE_M": 16,
        "num_warps": 4,
        "num_stages": 4
    }
}

키("1", "2", ...)는 입력 토큰 수(M 차원)이다. 토큰 수에 따라 다른 타일 크기와 파이프라인 스테이지를 사용한다.

2. B200 vs H100 비교

B200 설정 (N=24576,K=7168,device_name=NVIDIA_B200,dtype=fp8_w8a8,block_shape=[128, 128].json):

{
    "1": {
        "BLOCK_SIZE_M": 16,
        "BLOCK_SIZE_N": 64,
        "BLOCK_SIZE_K": 128,
        "GROUP_SIZE_M": 16,
        "num_warps": 4,
        "num_stages": 3
    }
}

B200은 BLOCK_SIZE_M=16으로 H100의 64보다 작다. 이는 B200의 더 넓은 SM 구조에서 작은 M 타일이 효율적이기 때문이다. num_stages도 H100의 4에서 3으로 줄어 레지스터 압력을 낮춘다.

3. AMD MI300X 설정

MI300X 설정 (N=1536,K=7168,device_name=AMD_Instinct_MI300X,dtype=fp8_w8a8,block_shape=[128, 128].json):

{
    "1": {
        "BLOCK_SIZE_M": 64,
        "BLOCK_SIZE_N": 16,
        "BLOCK_SIZE_K": 128,
        "GROUP_SIZE_M": 4,
        "num_warps": 4,
        "num_stages": 2,
        "waves_per_eu": 0
    }
}

AMD GPU의 핵심 차이점:

  • waves_per_eu: AMD 전용 파라미터로, Execution Unit당 웨이브 수를 제어한다. 0은 자동을 의미한다.
  • num_stages: 2: AMD의 메모리 계층 구조에 맞춰 파이프라인 깊이가 얕다.
  • BLOCK_SIZE_N: 16: NVIDIA의 32-64보다 작은 N 타일을 사용한다.

4. 배치 크기별 최적화

각 설정 파일은 배치 크기(토큰 수)별로 다른 파라미터를 갖는다.

토큰 수 → 최적 전략
1-2개:   작은 M 타일 (64), 낮은 병렬도
4-8개:   중간 M 타일, GROUP_SIZE_M 조정
16-32개: 큰 M 타일, 높은 병렬도
64+개:   최대 M 타일, num_stages 증가

이는 LLM 추론의 특성을 반영한다. Decode 단계에서는 토큰 1개씩 처리하므로 M=1 설정이 중요하고, Prefill 단계에서는 M이 큰 설정이 중요하다.

5. 행렬 크기별 설정 분리

같은 GPU에서도 행렬 크기에 따라 최적 파라미터가 다르다.

N=1536, K=1536   → 작은 행렬 (attention projection)
N=7168, K=7168   → 중간 행렬 (MLP)
N=24576, K=7168  → 큰 행렬 (gate+up fused)
N=32768, K=512   → 비대칭 행렬 (vocabulary projection)

6. dtype별 설정

현재 두 가지 양자화 타입의 설정이 존재한다.

fp8_w8a8:     FP8 가중치 + FP8 활성화
int8_w8a8:    INT8 가중치 + INT8 활성화

FP8은 주로 H100, H200, B200 등 Hopper 이상 GPU에서 사용되고, INT8은 A100, A800 등 Ampere GPU에서 사용된다.

7. 설정 파일 자동 선택

런타임에 현재 GPU의 이름, 행렬 크기, 양자화 타입을 조합하여 적합한 설정 파일을 검색한다.

탐색 순서:
1. 정확한 (N, K, GPU, dtype, block_shape) 매칭
2. 매칭 실패 시 Triton 오토튜닝 폴백

미리 튜닝된 설정이 없으면 Triton의 런타임 오토튜닝이 작동하지만, 첫 실행에 시간이 소요된다.

하드웨어 비교 표

GPU 아키텍처 FP8 지원 INT8 지원 FP4 지원 주요 특성
B200 Blackwell (SM120) O O O 최신, FP4 네이티브
H200 Hopper (SM90) O O X 대용량 HBM3e
H100 Hopper (SM90) O O X 데이터센터 표준
H20 Hopper (SM90) O O X 중국 시장용
L40 Ada Lovelace (SM89) O O X 추론 최적화
L20Y Ada Lovelace (SM89) O O X 저전력
A100 Ampere (SM80) X O X INT8 전용
A800 Ampere (SM80) X O X 중국 시장용
MI300X CDNA 3 O O X AMD 최고 성능
MI325X CDNA 3 O O X MI300X 후속

커널 파라미터 해설

파라미터 설명 일반적 값
BLOCK_SIZE_M M 차원 타일 크기 16, 32, 64, 128
BLOCK_SIZE_N N 차원 타일 크기 16, 32, 64, 128
BLOCK_SIZE_K K 차원 타일 크기 128 (고정)
GROUP_SIZE_M M 차원 스레드 그룹 1, 4, 8, 16, 64
num_warps 블록당 워프 수 4, 8
num_stages 소프트웨어 파이프라인 스테이지 2, 3, 4, 5
waves_per_eu EU당 웨이브 수 (AMD 전용) 0 (자동)

BLOCK_SIZE_K=128이 고정인 이유는 블록 양자화의 block_shape=[128, 128]과 일치시키기 위해서이다.

설계 근거

  1. 사전 튜닝: Triton 오토튜닝은 첫 실행에 수 분이 소요된다. 주요 GPU/행렬 크기 조합에 대해 미리 튜닝된 설정을 제공하여 즉시 최적 성능을 달성한다.
  2. 배치 크기 적응: Decode(M=1)와 Prefill(M=큰 값)에서 최적 파라미터가 크게 다르므로, 배치 크기별로 분리하여 관리한다.
  3. 하드웨어 추상화: 파일명 규약으로 GPU를 식별하여, 같은 코드가 다른 하드웨어에서 자동으로 최적 설정을 적용한다.
  4. AMD 전용 파라미터: waves_per_eu는 AMD의 wavefront 스케줄링을 제어하는 핵심 파라미터이다. NVIDIA에는 없는 이 파라미터로 AMD GPU의 CU 활용률을 최적화한다.

관련 포스트

참고

댓글

관련 포스트

SGLang 의 다른글