MI355X가 B300보다 달러당 빠른 이유 - 2.8T Kimi K3를 한 노드에 올린다는 것

🏷️ 정보 GPU 반도체 LLM

이 글은 Is memory the moat?를 참고하여 작성했습니다.

Kimi K3는 2.8조 파라미터 MoE 모델입니다. 이 모델을 AMD MI355X 8장에 올렸더니 NVIDIA B300보다 달러당 성능이 앞섰습니다.

숫자보다 이유가 중요합니다. 이긴 지점은 연산이 아니라 메모리 용량입니다.

측정 조건

입력 1,024토큰, 출력 400토큰. 채팅에 가까운 형태입니다.

세 구성을 비교했습니다.

구성

병렬화

8× MI355X

TP8

2×8 B200

TP16

B300

TP8 + DCP8

TP는 텐서 병렬(tensor parallel), DCP는 디코드 컨텍스트 병렬입니다. B200 구성만 노드 두 개를 씁니다.

결과

구성

노드당 처리량 (tok/s)

단일 스트림 (tok/s)

달러당 (tok/s/$)

8× MI355X (TP8)

952

118

48

B300 (TP8+DCP8)

1,568

172

33

MI355X가 노드당 952 tok/s, 단일 스트림 118 tok/s를 냈고 달러당으로는 48 대 33으로 앞섭니다. GPU당 가격이 2.4배 싼 것이 이 격차의 직접적 원인입니다.

하드웨어 스펙만 놓고 보면 두 칩은 비슷합니다. MI355X의 VRAM은 288GB이고 B300도 같습니다. 절대 처리량에서 MI355X가 압도한 것이 아니라, 비슷한 성능을 훨씬 싸게 낸 구조입니다.

단일 노드에 들어가는가

이 벤치마크의 진짜 결론은 여기에 있습니다.

2.8T 파라미터 MoE를 서빙하려면 가중치가 어딘가에 올라가야 합니다. 288GB × 8 = 2,304GB면 양자화된 K3가 한 노드에 들어갑니다. 들어가면 TP8로 끝나고, 안 들어가면 노드를 넘겨야 하며 TP16이 됩니다.

노드를 넘기는 순간 붙는 비용이 인터커넥트입니다. 노드 안에서는 NVLink나 Infinity Fabric으로 붙지만 노드 사이는 InfiniBand나 이더넷입니다. 대역폭도 지연도 한 자릿수 이상 차이가 납니다. 텐서 병렬은 레이어마다 all-reduce가 들어가는 통신 집약적 방식이라 이 차이가 그대로 처리량에 꽂힙니다.

그래서 B200 2노드 구성(TP16)은 GPU를 두 배 쓰고도 노드당 효율이 떨어집니다. 하드웨어 스펙 차이보다 이 경계가 큽니다.

Prefill-Decode Disaggregation이나 Mooncake에서 다룬 것도 결국 같은 축입니다. 어디에 무엇을 두느냐가 어느 칩을 쓰느냐보다 자주 중요합니다.

2.2배는 소프트웨어에서 나왔습니다

이 글에서 가장 시사적인 부분입니다.

MI355X 초기 성능은 좋지 않았고, 두 가지를 고쳐서 단일 스트림 약 \(2.2\times\)와 프리필 가속을 얻었습니다.

첫째, ROCm 샘플링 브랜치에 top_k_renorm_prob 함수가 빠져 있었습니다. 이 함수가 없으면 스펙큘러티브 디코딩의 검증 단계가 작동하지 않습니다. 초안 모델이 뽑은 토큰을 타깃 모델 분포로 재정규화해 수락 여부를 판정하는 자리인데, 그 구현이 CUDA 경로에만 있고 ROCm 경로에는 없었습니다. 채워 넣자 스펙큘러티브 디코딩이 살아났습니다.

둘째, 어텐션 커널의 shape 불일치가 있었습니다. K3의 헤드 구성이 커널이 기대하는 정렬과 맞지 않아 느린 폴백 경로를 타고 있었습니다. 헤드 수를 패딩해 정렬을 맞추자 빠른 경로로 들어갔습니다.

둘 다 아키텍처 문제가 아닙니다. 이식 과정에서 빠진 구현과 정렬 문제입니다. 즉 격차의 상당 부분이 실리콘이 아니라 소프트웨어 스택 성숙도에서 왔습니다.

이건 CUDA 해자 논의의 실물 데이터입니다. 해자가 실재한다는 증거이면서, 동시에 그 해자가 무엇으로 만들어졌는지를 보여줍니다. 아키텍처 우위가 아니라 누적된 커널 커버리지입니다. 커버리지는 시간과 인력이 메웁니다. 함수 하나를 채워서 2.2배가 나온다는 것은 아직 메울 구멍이 많다는 뜻이면서, 메우면 메워진다는 뜻이기도 합니다.

이 숫자를 어디까지 믿을 것인가

두 가지를 조건으로 달아야 합니다.

측정 형태가 채팅입니다. 입력 1,024, 출력 400은 짧습니다. 컨텍스트가 길어지면 상황이 달라집니다. KV 캐시가 VRAM을 잠식하기 시작하고, 배치 크기를 줄여야 하고, 어텐션 연산이 전체에서 차지하는 비중이 커집니다. 이 구간에서는 메모리 대역폭과 어텐션 커널 최적화가 지배적이 되므로 순위가 뒤집힐 수 있습니다. 긴 출력도 마찬가지입니다. 디코드 스텝이 늘면 스펙큘러티브 디코딩의 수락률과 메모리 대역폭이 더 크게 작용합니다.

달러당 수치는 임대가에 의존합니다. 48 tok/s/\(와 33 tok/s/\)의 차이는 GPU 시간당 단가에서 나옵니다. 이 단가는 사업자마다 다르고 계약 물량에 따라 다르고 시점에 따라 다릅니다. 어느 시점, 어느 사업자 가격표인지 명시되지 않으면 재현되지 않습니다. AMD 인스턴스 공급이 늘거나 NVIDIA 가격이 조정되면 이 표는 바로 무효가 됩니다.

정리

단일 노드 적재 여부가 달러당 성능을 지배합니다. 288GB VRAM으로 2.8T 모델이 한 노드에 들어간 것이 TP8을 가능하게 했고, 그것이 TP16을 써야 하는 구성 대비 우위의 대부분입니다. 칩 스펙 비교보다 이 경계를 먼저 봐야 합니다.

격차의 상당 부분은 소프트웨어입니다. 빠진 함수 하나와 커널 정렬 하나로 \(2.2\times\)가 나왔습니다. CUDA 해자는 실재하지만 아키텍처가 아니라 커버리지로 만들어져 있습니다.

조건을 떼고 인용하면 안 됩니다. 1,024in/400out 채팅 형태이고, 달러당 수치는 특정 시점 임대가 기준입니다. 긴 컨텍스트나 다른 가격 조건에서는 다른 표가 나옵니다.

이 글은 Is memory the moat?의 관점에서 작성되었습니다.