AMD Instinct MI355X에서의 Kimi K3: vLLM 서빙, AgentX에서 GPU당 NVIDIA HGX B300 처리량에 근접
8-GPU AMD Instinct MI355X 시스템이 vLLM으로 Kimi K3를 서빙할 때, AgentX 벤치마크에서 50 tokens/s/user P90 상호작용성 기준으로 NVIDIA HGX B300보다 GPU당 초당 총 토큰 수가 24.4% 더 많고, 벤치마크의 모델링된 소유 비용 가정 하에 달러당 토큰 수가 87.4% 더 많습니다. 이 결과가 중요한 이유는 소프트웨어 이야기이기 때문입니다. MI355X는 B300보다 공개된 고밀도 저정밀 행렬 피크 성능이 낮으므로, 이 이점은 원시 하드웨어 처리량이 아니라 서빙 스택 엔지니어링(캐시 분할, MoE 집합체 재구성, 커널 융합, AITER 어셈블리 어텐션 경로, KDA 병렬화, 드래프트 깊이 튜닝)에서 비롯됩니다.
AgentX의 주요 수치
50 tokens/s/user P90 상호작용성에서 AMD Instinct MI355X는 약 7,567 total tokens/s/GPU를 서빙하며, NVIDIA HGX B300의 6,083과 비교해 24.4% 처리량 우위를 보입니다. SemiAnalysis의 모델링된 TCO(GPU 시간당 $1.50 대 $2.26)를 사용하면, TCO 달러당 총 토큰 수는 1,816만 대 969만이 되어 달러당 토큰 수가 87.4% 더 많습니다. 50토큰 상호작용성 목표에서 이 비교는 모델링된 토큰당 비용이 46.6% 더 낮습니다.
이 벤치마크의 상호작용성은 상호 P90 응답 토큰 간 지연 시간이며, 첫 토큰까지의 시간은 제외합니다. 총 토큰에는 재사용된 입력과 생성된 출력이 모두 포함됩니다.
| 공개 사양, GPU당 | AMD Instinct MI355X | NVIDIA B300 GPU |
|---|---|---|
| 고밀도 저정밀 행렬 피크 | 10.1 PFLOP/s MXFP4 | 13.5 PFLOP/s FP4 |
| GPU 메모리 | 288 GB HBM3E | 288 GB HBM3E |
| 피크 메모리 대역폭 | 8 TB/s | 8 TB/s |
두 가속기는 공개된 메모리 용량과 대역폭이 동일하지만, B300은 공개된 고밀도 저정밀 행렬 피크가 더 높습니다. 이러한 서빙 성능에 도달한 것은 AMD와 vLLM 커뮤니티 협력자들의 지속적인 소프트웨어 엔지니어링을 반영합니다.
AgentX가 측정하는 것
공개 AgentX 벤치마크는 합성 토큰으로 실제 코딩 에이전트 세션 추적을 재생하며, 요청 길이, 타이밍, 프리픽스 공유 패턴을 유지합니다. 이 워크로드는 무제한 캐시로 96% 이상의 이론적 프리픽스 재사용을 제공합니다. 추측 실행은 고정된 합성 수용 참조를 사용합니다.
에이전트 턴은 프리픽스의 대부분을 재사용하므로, 이 벤치마크는 대화 상태를 상주시키고 재계산을 피하는 시스템에 보상을 줍니다. 공개 곡선은 완전한 서빙 스택을 비교하며, 각 개별 최적화 옆에 보고된 측정값은 자체 명시된 구성 하의 별도 테스트에서 나온 것입니다.
Kimi K3 내부: MLA, KDA, MoE
Kimi K3는 두 종류의 어텐션과 희소 MoE를 결합합니다. 돌아오는 에이전트 턴은 프리픽스의 대부분을 재사용할 수 있지만, 짧은 연속 처리는 여전히 세 종류의 데이터를 다룹니다.
- 24개의 MLA 레이어는 대화가 성장함에 따라 커지는 압축된 KV 기록을 유지합니다. 새 쿼리는 여전히 그 기록을 참조합니다.
- 69개의 KDA 레이어는 고정 차원의 상태 행렬을 전달하며, 새 토큰이 도착할 때 업데이트합니다.
- MoE 레이어는 각 토큰을 전문가 네트워크를 선택하는 라우터를 통해 전달합니다. Kimi K3는 토큰당 896개 전문가 중 16개를 선택하며, 전문가 가중치는 요청 간에 공유됩니다.
MLA는 대화가 성장함에 따라 더 많은 기록을 유지합니다. KDA는 고정 차원 상태를 업데이트하므로, 이전 체크포인트를 유지하려면 해당 상태의 추가 복사본을 보관해야 합니다. 최적화 작업은 세 가지 범위로 나뉩니다: 턴 간(캐시 재사용 및 오프로드), 모델 단계 내(전문가 투영, 커널 핸드오프, MLA/KDA 스케줄링), 드래프트 깊이 선택.
1. 캐시: 재사용을 위해 대화 상태 유지
디코드 컨텍스트 병렬 처리(DCP)는 GPU 메모리의 중복 기록을 줄이고, CPU 오프로드는 재사용 가능한 상태를 GPU 외부에 보존합니다.
TP8에서 각 GPU는 Kimi K3의 96개 MLA 쿼리 헤드 중 12개를 처리하지만 전체 압축 KV 기록을 저장합니다 — 텐서 병렬 처리는 캐시를 나누지 않고 헤드를 나눕니다. **8방향 디코드 컨텍스트 병렬 처리(DCP8)**로 각 GPU는 캐시된 위치의 1/8을 저장합니다. 디코드 중 GPU는 쿼리를 교환하고, 로컬 기록에 대해 계산하며, softmax 가중치로 부분 답변을 병합합니다. 각 부분 답변은 정규화 정보를 포함하여 병합이 샤드를 올바르게 가중할 수 있게 합니다. PR #51705는 ROCm AITER DCP 경로를 다중 토큰 검증으로 확장합니다.
142,000토큰 대화의 경우 추정 MLA 페이로드는 24 레이어 × 142,000 위치 × 576 FP8 바이트 ≈ GPU당 1.96 GB입니다. DCP8은 할당 오버헤드 전에 이를 약 245 MB로 줄입니다. 각 GPU는 기록의 1/8에 대해 8배 많은 헤드를 처리하여, 주요 어텐션 연산은 거의 변경되지 않습니다. 이 추가 분할은 MLA 기록에 적용되며, KDA 상태는 기존 헤드 분할을 유지합니다.
CPU 오프로드는 HBM에 더 이상 맞지 않는 상태를 유지
상태가 GPU 메모리에 더 이상 맞지 않을 때, AMD 레시피의 네이티브 vLLM CPU 오프로드는 MLA 기록과 KDA 체크포인트를 호스트 DRAM에 보존합니다.
캐시 히트는 일치하는 재개 지점이 필요합니다. MLA 기록이 토큰 3,072에 도달했지만 최신 호환 KDA 체크포인트가 2,048에 있다면, 요청은 2,048에서 재개하고 나머지 프리픽스를 재계산해야 합니다. 어텐션 블록 꼬리를 KDA 체크포인트와 함께 저장하면 재개 위치가 정렬됩니다(PR #54736). 해당 상태를 복원하면 GPU로의 전송과 프리픽스 재계산 회피를 교환합니다.
2. MoE: GPU 간 중복 작업 제거
단일 GPU에서 라우팅된 전문가 출력 투영은 소비자가 기대하는 완전한 벡터를 반환합니다. 원래 ROCm 경로에서는 이전 축소 및 정규화가 8개 GPU 모두에 동일한 잠재 입력을 제공하고 각각 전체 가중치를 보유했으므로 — 동일한 투영이 8번 실행되었습니다.
출력 좌표는 GPU 간에 분할될 수 있지만, 모든 랭크는 여전히 완전한 결과가 필요합니다. Kimi K3는 이미 공유 전문가 부분에 대한 all-reduce가 있습니다. 각 GPU는 소유한 라우팅 출력만 공유 전문가 부분에 추가하고, 기존 all-reduce가 새 컬렉티브 없이 완전한 결과를 조립합니다(PR #51253). ROCm 구현은 해당 CUDA 전략을 기반으로 합니다. 각 출력 좌표는 라우팅 기여를 정확히 한 번 받으며, 전체 투영 가중치는 복제된 상태로 유지됩니다.
PR 테스트에서 8개의 AMD Instinct MI355X GPU, TP8, 동시성 8–128, 무작위 8K 입력/1K 출력 요청, 프리픽스 캐싱 비활성화 조건에서 출력 처리량은 3.05–4.91% 상승했습니다.
GPU 메모리를 확보하여 더 많은 캐시 상태 유지
각 랭크가 사용하는 행만 로드하면 TP8에서 92개 MoE 레이어에 걸쳐 GPU당 약 3.85 GiB가 해제됩니다(PR #59591). 융합 경로의 계산은 동일하며, 추가 공간은 MLA 기록과 KDA 체크포인트를 저장할 수 있습니다.
이 변경은 헤드라인 공개 결과에 사용된 이미지 이후에 적용되었습니다. 별도의 AgentX 실험에서는 동시성 32와 48에서 1% 미만의 처리량 증가를 보였지만, 동시성 70에서는 28.9% 증가했으며, 보고된 프리픽스 캐시 히트율은 **74.8%에서 80.1%**로 상승했습니다. 높은 동시성에서의 더 큰 이득은 캐시 압력과 일치합니다. 측정은 8개의 AMD Instinct MI355X GPU, TP8/DCP8, FP8 KV, 30분 실행, CPU 오프로드 또는 추측 디코딩 없이 수행되었으며, 반복 실행 불확실성은 보고되지 않았습니다.
3. 메모리 트래픽: 연산 융합 및 불필요한 복사 제거
각 GPU 내에서 다음으로 살펴볼 곳은 커널 간에 전달되는 데이터입니다.
Kimi K3의 단일 토큰 KDA 경로는 세 개의 컴퓨트 커널과 두 개의 출력 복사를 실행했습니다. 컨볼루션은 Q/K 정규화, 감쇠 및 베타 게이트, 순환 업데이트를 이미 융합한 커널 전에 실행되었고, 출력 정규화는 이후에 실행되었습니다. 융합된 HIP 경로는 이러한 연산을 단일 실행으로 수행하고 대상 버퍼에 직접 씁니다(PR #50654). 중간 핸드오프는 온칩에 유지되며, 컨볼루션 기록과 순환 상태는 다음 토큰을 위해 GPU 메모리로 이동합니다.
AttnRes는 이전 레이어 블록 출력을 실행 중인 잔차와 혼합합니다. 이 혼합을 RMSNorm과 결합하면 임시 혼합물이 레지스터에 유지됩니다(PR #50593). 이후 레이어를 위해 저장된 실행 잔차는 BF16 반올림을 유지하며, 혼합물은 정규화를 통해 FP32로 유지됩니다. AttnRes 융합으로 8개의 AMD Instinct MI355X GPU, TP8, 100K 입력/1K 출력 요청, 프리픽스 캐싱 비활성화 조건에서 출력 처리량은 14.2% 상승했습니다. 긴 프리필 지연 시간은 사실상 변경되지 않았습니다.
사용하는 커널에만 입력 복사
ROCm 행렬 곱셈 디스패처는 커널을 선택하기 전에 입력을 패킹했습니다. 폴백을 선택하면 해당 커널이 원래 입력을 읽고 복사본은 사용되지 않았습니다. 패킹을 전문화된 분기로 이동하여 이러한 복사를 제거했습니다(PR #58566).
프로파일은 낭비를 명확히 보여주었습니다: 디코드 단계당 69개의 불필요한 복사, KDA 레이어당 하나. 각각 1,792바이트만 이동했지만 약 4.8마이크로초가 걸렸습니다 — 실행 오버헤드가 지배적이었으므로 바이트를 더 빠르게 이동해도 거의 도움이 되지 않았습니다. PR의 TP8, 동시성 1, 6드래프트, 384K 컨텍스트 프로파일에서 제거된 복사는 단계당 0.339ms의 복사 커널 시간을 차지했습니다.
4. MLA: AMD AITER 어셈블리로 더 빠른 긴 컨텍스트 디코딩
Kimi K3는 TP8에서 GPU당 12개의 쿼리 헤드를 가집니다. 16으로 패딩하면 AMD AITER의 어셈블리 디코드 경로를 사용할 수 있습니다. 보고된 긴 컨텍스트 테스트에서 출력 토큰당 시간은 43.8에서 23.6밀리초로 감소했습니다.
비교는 TP8, DCP 없이, 동시성 1에서 수행되었습니다. PR #50578의 어댑터는 4개의 쿼리 헤드를 복사하여 16헤드 레이아웃으로 패킹하고 출력을 폐기합니다. DCP8은 다른 96헤드 형태를 제시합니다. 이는 각 쿼리 헤드가 캐시된 위치에 대해 독립적으로 어텐션을 수행하므로 모델의 연산을 보존합니다 — 다른 헤드를 추가해도 원래 헤드의 softmax는 변경되지 않습니다. 이 디코드 경로에서는 쿼리만 패딩되며, 저장된 압축 KV 기록은 동일한 크기를 유지합니다.
| 입력 / 출력 토큰 | 원래 Gluon 경로 | 패딩된 어셈블리 경로 |
|---|---|---|
| 1K / 1K | 22.9 ms/토큰 | 22.8 ms/토큰 |
| 32K / 1K | 43.8 ms/토큰 | 23.6 ms/토큰 |
이는 8개의 AMD Instinct MI355X GPU, TP8, 동시성 1, MXFP4 모델 가중치, BF16 어텐션, 일반 단일 토큰 디코드에서 PR 보고된 출력 토큰당 평균 시간입니다. 짧은 입력 경우는 거의 변화가 없고, 긴 입력 경우는 출력 토큰당 시간이 거의 절반으로 줄었습니다.
메커니즘은 스케줄링입니다. 검사된 이전 코드에서 보수적인 스케줄링 힌트가 Gluon 경로를 요청당 하나의 워크그룹으로 제한했고, 해당 워크그룹은 여전히 전체 대화를 처리했습니다. 패딩은 AMD AITER의 어셈블리 경로를 사용 가능하게 했으며, 기록을 병렬 조각으로 나누고 결과를 결합하는 다른 정책을 사용했습니다 — 검사된 어셈블리 정책은 16개 파티션을 선택했습니다. 기록 파티션은 단일 GPU 내 워크그룹에 할당된 작업이며, KV 저장은 변경되지 않습니다.
5. KDA: 프리필 및 추측 검증 병렬화
MLA는 유지된 기록을 워크그룹 간에 분할할 수 있습니다. KDA는 더 어려운 스케줄링 문제를 제시합니다: 각 토큰은 이전 상태에 의존합니다. PR #54038의 융합 프리필은 들어오는 상태가 알려지기 전에 각 토큰 그룹의 결합 변환을 준비합니다.
KDA는 행렬 변환으로 이를 수행합니다. 그룹 요약의 정렬된 스캔이 각 그룹의 시작 상태를 결정하고, 그룹은 토큰을 병렬로 재생합니다. 토큰 순서는 유지되지만, 각 그룹은 더 이상 이전 그룹의 재생을 기다리지 않습니다. 그룹화는 두 번째 워크를 추가하고 융합 청크 경로를 두 개에서 네 개의 실행으로 확장합니다. 이는 적은 시퀀스 또는 헤드가 너무 적은 병렬 작업을 노출할 때 도움이 되며, 그렇지 않으면 추가 패스가 절약보다 더 많은 비용이 들 수 있습니다. 각 그룹 내에서 순환 워크는 청크 간에 상태를 행렬-누산기 레지스터에 유지하여 전역 메모리 쓰기 및 재로드를 피합니다.
융합 KDA는 별도의 3-백엔드 비교에서 4K 및 16K 입력 길이에서 Triton보다 5.3–5.6% 더 많은 입력 처리량을 제공했습니다: 8개의 AMD Instinct MI355X GPU, TP8, 동시성 32, 프리픽스 캐싱 비활성화, 단일 토큰 출력. 이는 완전한 백엔드를 측정합니다.
추측 검증을 위한 더 작은 타일
짧은 검증 배치는 다른 분할이 필요합니다. TP8에서 각 GPU는 128개의 값 열을 가진 12개의 KDA 헤드를 가집니다. 각 헤드를 4개의 32열 타일로 분할하면 256개 컴퓨트 유닛에서 48개의 워크그룹만 실행됩니다. PR #58045는 4열 타일로 전환하여 수를 384로 높입니다. 각 타일은 다른 값 열을 소유하고 동일한 토큰 시퀀스를 순서대로 걷습니다.
별도의 그래프 재생 커널 테스트에서 단일 AMD Instinct MI355X GPU(TP8 차원, 단일 시퀀스, 4개 검증 위치)에서 시간은 레이어당 **16.20에서 5.61마이크로초(2.89배)**로 감소했습니다. 이는 더 좁은 타일, 단일 웨이브 워크그룹, 균일 길이 전문화, 호이스트된 토큰 불변 작업을 포함합니다. 비정형 배치는 동적 경로를 유지하며, 테스트는 출력과 순환 상태를 비교합니다.
6. 추측 디코딩: 드래프트할 토큰 수 선택
더 빠른 검증은 확인할 가치가 있는 드래프트 토큰 수를 변경할 수 있습니다. 유용한 비율은 커밋된 출력을 전체 드래프트–검증–커밋 주기 시간으로 나눈 것입니다.
AgentX의 고정 수용 참조에서 3개 드래프트는 주기당 3.00 예상 커밋 토큰을 제공하고, 4개 드래프트는 복구 또는 보너스 토큰을 포함하여 3.36을 제공합니다 — 주기당 커밋 출력이 12% 더 많습니다. 따라서 4개 드래프트는 전체 주기가 3개 드래프트보다 12% 미만 더 오래 걸리는 경우에만 처리량을 향상시킵니다. 이 12% 임계값은 비용 예산이며, 전체 주기 성장은 게시물에서 측정되지 않았습니다.
공개 AMD 레시피는 DCP1에서 3~7개 드래프트를 사용하며, 더 큰 DCP8 동시성 설정에서는 추측을 비활성화합니다.
기술 노트: KDA 프롤로그의 정밀도 및 온칩 메모리
KDA 프롤로그는 64×64 청크 내 의존성 행렬의 역을 계산하며, 이후 행렬 곱은 이 변환을 사용하여 토큰 의존성을 설명합니다. 역의 중간 값은 커지고 상쇄될 수 있으므로 너무 일찍 반올림하면 최종 결과에 필요한 정보가 손실됩니다. 구현은 AMD의 네이티브 FP32 행렬 명령을 사용하여 민감한 역에 FP32 입력과 누적을 유지하고, 완성된 역만 후속 곱을 위해 BF16으로 반올림합니다.
FP32 누적은 시작 전에 손실된 정보를 복구할 수 없습니다. 256에서 256.5를 빼면 원래 FP32 입력이 유지될 때 0.5가 되지만, 입력이 먼저 BF16으로 반올림되면 0이 됩니다(256.5는 해당 크기에서 256으로 반올림). 이 예시 값은 역이 네이티브 16×16×4 FP32 행렬 명령을 사용하여 입력과 누적 정밀도를 모두 유지하는 이유를 보여줍니다.
프롤로그는 또한 로컬 메모리 예산이 있습니다. AMD는 온칩 공유 스크래치를 LDS라고 부릅니다. Q 및 K 타일은 다른 시간에 필요하므로 저장 공간을 재사용하며, 삼각형 입력은 점유된 10개의 16×16 블록만 저장합니다. 워크그룹은 79.5 KiB를 요청하며, 이는 80 KiB로 반올림됩니다 — AMD CDNA 4 컴퓨트 유닛의 160 KiB LDS 예산의 절반입니다. 할당은 1,280바이트 단위로 반올림되므로 두 개의 80 KiB 할당이 맞지만 두 개의 81.25 KiB 할당은 맞지 않습니다. 이는 용량 계산이며, 레지스터 및 기타 리소스가 추가 제한을 부과할 수 있습니다.
MoE 측면에서 별도의 기술 노트가 정밀도를 다룹니다: PR #53940의 A4W4 통합은 활성화를 8비트에서 4비트로 변경하고 가중치는 4비트로 유지합니다. 총 트래픽에는 BF16 중간 출력과 전문가 타일 패딩도 포함됩니다. 상당한 서버 배치에서도 전문가당 행 수가 적을 수 있기 때문입니다.
벤치마크 구성 및 주의 사항
비교 대상에서의 서빙 구성:
| P90 상호작용성 (tokens/s/user) | AMD Instinct MI355X | NVIDIA HGX B300 |
|---|---|---|
| 30 및 50 | SimpleCPU 오프로드; DCP8 / 드래프트 없음 ~ DCP1 / 3개 드래프트 | Mooncake 오프로드; DCP8 |
| 150 | GPU 전용; DCP1; 5~7개 드래프트 | Mooncake 오프로드; DCP8 |
두 시스템 모두 8개 GPU, TP8, FP4 가중치, FP8 KV를 사용합니다. 값은 일치하는 상호작용성에서 각 공개 오프로드 또는 GPU 전용 시리즈 내에서 보간됩니다. 동시성, DCP 및 드래프트 깊이는 브래킷 실행 간에 다를 수 있습니다.
제출은 vLLM 36768d1bf(AMD) 및 5894fdf98(NVIDIA)을 사용합니다. 구성된 호스트 캐시 예산은 각각 GPU당 224.875 및 281 GB입니다. 재생은 cc-traces-weka-062126 데이터 세트와 고정된 AIPerf 하네스를 사용하며, 워밍업은 제외되고 고정 합성 수용 곡선 하에서 1시간 프로파일링이 수행됩니다. 다운로드된 데이터 세트 개정판은 기록되지 않았으며, 폐쇄 루프 재생은 다른 완료 요청 혼합을 생성할 수 있습니다.
비용 모델은 SemiAnalysis의 대형 하이퍼스케일러 소유 모델을 사용하며, 공개 GPU 비용 상수는 AMD Instinct MI355X의 경우 GPU 시간당 $1.50, NVIDIA HGX B300의 경우 $2.26입니다. 총 토큰/$ = 총 토큰/s/GPU × 3,600 ÷ 모델링된 $/GPU-시간. 일부 자본 및 활용 가정은 비공개입니다.
스냅샷은 2026년 10월 9일에 검색된 SemiAnalysis InferenceX 데이터이며, 제출 날짜는 2026년 9월 30일(AMD) 및 2026년 8월 16일(NVIDIA)입니다. PR 벤치마크는 명시된 워크로드를 사용하며, PR #59591은 헤드라인 이미지 이후에 실행된 별도 실험입니다.
다음에 최적화할 것
진행 중인 프리필/디코드 분리 작업은 또 다른 살펴볼 곳을 추가합니다: 워커 균형 및 전송이 데이터가 필요하기 전에 완료되는지 여부.
다른 모델 또는 워크로드의 경우, 게시물은 배포된 요청 형태로 시작하여 세 가지 확인을 권장합니다:
- 랭크 비교. 여러 GPU가 컬렉티브가 조립할 수 있는 동일한 결과를 계산하고 있습니까?
- 버퍼 추적. 선택된 경로에서 각 임시 텐서에 소비자가 있습니까? 데이터가 온칩에 유지될 수 있습니까?
- 독립 작업 계산. 실제 헤드, 토큰 및 타일이 부하를 분산할 충분한 워크그룹을 생성합니까?
필요한 응답 속도에서 완전한 요청을 측정하고 출력과 저장된 상태를 모두 확인하십시오. 더 빠른 커널은 다음 토큰을 지연시키는 작업을 줄일 때 중요합니다.
Kimi K3 노력은 AMD, Embedded LLM 및 더 넓은 커뮤니티의 50개 이상의 병합된 AMD/ROCm 관련 vLLM PR에 걸쳐 있으며, AITER 개발, 통합, 검토 및 벤치마킹과 함께 진행됩니다. 기여는 어텐션, 순환, MoE, 양자화, 그래프 실행, 캐시 지원 및 플랫폼 통합을 다룹니다.