[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]과 일치시키기 위해서이다.
설계 근거
- 사전 튜닝: Triton 오토튜닝은 첫 실행에 수 분이 소요된다. 주요 GPU/행렬 크기 조합에 대해 미리 튜닝된 설정을 제공하여 즉시 최적 성능을 달성한다.
- 배치 크기 적응: Decode(M=1)와 Prefill(M=큰 값)에서 최적 파라미터가 크게 다르므로, 배치 크기별로 분리하여 관리한다.
- 하드웨어 추상화: 파일명 규약으로 GPU를 식별하여, 같은 코드가 다른 하드웨어에서 자동으로 최적 설정을 적용한다.
- AMD 전용 파라미터:
waves_per_eu는 AMD의 wavefront 스케줄링을 제어하는 핵심 파라미터이다. NVIDIA에는 없는 이 파라미터로 AMD GPU의 CU 활용률을 최적화한다.
관련 포스트
- SGLang FP8: 8비트 부동소수점 양자화
- SGLang Block-wise INT8: 블록 단위 정수 양자화
- SGLang Compressed Tensors: 통합 양자화 프레임워크
참고
- SGLang 소스:
python/sglang/srt/layers/quantization/configs/ - 설정 파일 포맷:
configs/README.md - Triton 오토튜닝: triton-lang/triton
관련 포스트
SGLang 의 다른글
- 이전글 [SGLang] MoE 전용 양자화: 전문가별 독립 양자화 전략
- 현재글 : [SGLang] 하드웨어별 양자화 튜닝: B200, H100, MI300X 최적 설정
- 다음글 [SGLang] Fused MoE (Triton): 라우팅과 전문가 연산의 융합
댓글