본문으로 건너뛰기

AMD GPU에서 NVFP4를 MXFP4로 즉시 변환해 서빙

SGLang의 online requantization이 AMD MI350X·MI355X에서 NVFP4 모델을 native MXFP4 성능으로 서빙합니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

AMD Instinct™ MI350X와 MI355X는 native 4비트 연산에 MXFP4를 사용하므로 NVFP4 checkpoint를 그대로 실행할 수 없었지만, SGLang의 online requantization 경로가 로딩 중 가중치를 한 레이어씩 MXFP4로 변환해 이 제약을 해소했습니다. 변환된 가중치는 AMD의 native MXFP4 GEMM과 동적 MXFP4 활성값 경로에서 처리되며, 다섯 모델의 steady-state 처리량은 native AMD MXFP4 checkpoint 대비 -0.9%에서 +1.0% 차이에 머물렀습니다. GPQA-Diamond-CoT와 AIME25에서는 NVFP4 emulation 기준과 평균 점수 차이가 ±0.05 이내였고, GSM8K에서는 원본 고정밀 checkpoint 점수의 98.7%에서 100.7%를 회복했습니다. 대신 서버 시작 시 10~55초의 일회성 변환 시간이 추가되고, 원본 NVFP4와 bit-exact 결과가 필요한 실험에는 적합하지 않습니다.

섹션별 상세

01
NVFP4 checkpoint는 대규모 모델을 4비트로 저장하지만 MI350X와 MI355X의 native 4비트 연산 형식인 MXFP4와 블록 크기 및 스케일 인코딩이 다릅니다. NVFP4는 16개 값마다 FP8 E4M3 블록 스케일과 FP32 텐서 스케일을 사용하고, MXFP4는 32개 값마다 E8M0 스케일을 사용하므로 가중치를 변환하지 않으면 native MXFP4 backend에 입력할 수 없습니다. SGLang의 online 경로는 별도 오프라인 checkpoint를 만들거나 전체 모델을 BF16으로 실행해야 했던 선택지 사이에 로딩 시 자동 변환이라는 경로를 추가합니다.
NVFP4 checkpoint가 source 감지, NVFP4 weight tensor 추출, FP32 dequantization, MXFP4 requantization, MXFP4 weight 저장을 거쳐 native MXFP4 GEMM과 동적 MXFP4 activation serving으로 이어지는 흐름도입니다.
Diagram도식은 SGLang이 모델 로딩 중 NVFP4 가중치를 레이어별로 변환하고, 제외 모듈은 BF16 또는 고정밀도 경로에 남기며, mixed-precision FP8 레이어는 별도 native FP8 경로로 보내는 구조를 나타냅니다. 이 흐름은 요청 처리 전에 변환을 끝내므로 online이라는 명칭이 요청별 변환을 뜻하지 않음을 뒷받침합니다.
02
SGLang은 --quantization quark_mxfp4 플래그로 NVFP4 source 형식을 감지한 뒤 각 가중치 텐서를 dequantize하고 MXFP4로 requantize해 사전 할당된 목적지에 저장합니다. 변환은 레이어별로 한 번만 일어나며, FP8 등 고정밀도로 유지하도록 checkpoint에 지정된 모듈은 변환에서 제외되고 원래 경로로 로딩됩니다. 따라서 요청마다 변환을 반복하지 않고, 추론 단계에서는 MXFP4 가중치와 동적으로 양자화한 MXFP4 활성값이 native GEMM으로 전달됩니다.
03
전체 모델을 BF16으로 복원한 뒤 다시 양자화하는 방식과 달리 레이어 하나의 중간 결과만 메모리에 유지하므로 추가 메모리 상한이 전체 모델이 아니라 단일 레이어 크기로 제한됩니다. ModelOpt와 AMD Quark export를 인식하고 config.json 또는 hf_quant_config.json에서 source 형식을 읽으며, MIXED_PRECISION checkpoint의 레이어별 정밀도도 처리합니다. 이 구조는 수백 GB 규모의 scratch 공간과 두 번째 가중치 사본을 요구하는 오프라인 변환 부담을 줄입니다.
04
다섯 checkpoint에서 online 경로의 출력 토큰 처리량은 MiniMax-M2.7 3516.0 tok/s, Qwen3.5-397B-A17B 2963.2 tok/s, Qwen3.5-397B-A17B-V2 3007.5 tok/s, DeepSeek-R1 2799.0 tok/s, Kimi-K2.6 2148.8 tok/s였습니다. 동일 조건의 native AMD MXFP4 경로와 비교한 차이는 각각 -0.7%, +0.4%, +0.2%, -0.9%, +1.0%였고, 글은 이를 실행 간 변동 범위로 판단합니다. 변환을 모델 로딩 때 수행해도 steady-state serving 처리량에는 유의미한 손실이 나타나지 않았습니다.
다섯 모델에서 online NVFP4 to MXFP4 경로와 native AMD MXFP4 checkpoint의 steady-state 출력 토큰 처리량을 비교한 막대그래프입니다.
Chartonline 경로는 MiniMax-M2.7 3516 tok/s, Qwen3.5-397B 2963 tok/s, Qwen3.5-397B-V2 3008 tok/s, DeepSeek-R1 2799 tok/s, Kimi-K2.6 2149 tok/s를 기록합니다. native 경로와의 차이는 그래프에 -0.7%, +0.4%, +0.2%, -0.9%, +1.0%로 표시되어 로딩 시 변환이 steady-state 처리량을 거의 바꾸지 않음을 나타냅니다.
05
성능은 MXFP4 형식 자체만으로 결정되지 않고 AMD CDNA4용 SGLang serving 경로의 커널 최적화와 함께 확보됩니다. AITER의 native FP4 GEMM과 fused-MoE 커널은 가중치와 활성값을 MFMA 명령에 직접 전달하며, 작은 batch에서는 활성값 양자화와 GEMM을 결합해 kernel launch와 HBM 왕복을 줄이고 큰 입력에서는 중복 양자화를 피하는 별도 quantization 커널을 사용합니다. 로딩 시 MXFP4 가중치와 블록 스케일을 MFMA 타일 배치로 재배치하고 expert 차원을 정렬해 매 forward pass의 재패킹도 제거합니다.
06
정확도 비교를 위해 NVFP4 가중치를 BF16으로 복원하고 활성값에도 NVFP4 quantize-dequantize를 적용하는 software emulation backend를 만들었습니다. 이 기준은 MI350X와 MI355X에서 native NVFP4 연산을 실행할 수 없는 문제를 보완해 format 변환만의 영향을 비교하도록 구성됐습니다. GPQA-Diamond-CoT와 AIME25에서 online 경로와 emulation의 평균 점수 차이는 모든 모델·과제 조합에서 ±0.05 이내였으며, 서로 다른 seed만으로도 약 5~10%의 점수 변화가 발생했습니다.
AIME25와 GPQA-Diamond-CoT에서 online NVFP4 to MXFP4 경로와 NVFP4 emulation 기준의 평균 추론 정확도를 모델별로 비교한 그래프입니다.
ChartAIME25에서는 모델별 두 경로의 점수가 대체로 근접하고, GPQA-Diamond-CoT에서도 Qwen3.5-397B는 0.854 대 0.852, Qwen3.5-397B-V2는 0.850 대 0.843으로 나타납니다. 일부 모델에서 emulation이 높고 일부에서는 online 경로가 높아 일관된 정확도 하락 패턴보다 seed 변동의 영향이 큰 결과로 읽힙니다.
NVFP4 emulation 점수에서 online requantization 점수를 뺀 모델·벤치마크별 정확도 차이를 나타낸 그래프입니다.
Chart표시된 차이는 Qwen AIME -0.023부터 Kimi AIME +0.046까지이며 모든 값이 ±0.05 구간 안에 있습니다. 글에서 다른 seed가 약 5~10%의 점수 변화를 일으킨다고 밝힌 점과 함께 보면, 두 경로 사이 차이가 측정 잡음 범위를 벗어나지 않는다는 근거가 됩니다.
07
두 번의 4비트 rounding이 오차를 크게 누적하지 않은 이유는 두 오차가 평균 0에 가까운 독립적인 잡음으로 측정됐기 때문입니다. Qwen3.5-397B-A17B의 MoE expert 가중치에서 NVFP4 오차와 추가 MXFP4 오차의 평균 pairwise correlation은 약 -0.04였고, 두 오차의 크기는 선형 합보다 제곱합의 제곱근에 가깝게 결합됐습니다. 수천 개 가중치를 합산하는 GEMM에서는 zero-mean 오차 일부가 상쇄되어 NVFP4에서 MXFP4로 변환한 출력 SQNR이 약 17 dB로 유지됐고 NVFP4 단독보다 약 3.6 dB 낮았습니다.
두 경로의 greedy decoding trace가 모두 달라져도 최종 정답이 유지되는 비율과 GPQA-Diamond-CoT 문항별 정답 결과를 함께 나타낸 그래프입니다.
ChartAIME25에서는 trace가 100% 달랐지만 정답 결과가 90%에서 같았고, GPQA-Diamond-CoT에서는 92%에서 같았습니다. 198개 GPQA 문항 중 두 경로 모두 정답인 경우는 162개였으며 online-only 정답 11개와 emulation-only 정답 5개가 있어 어느 경로가 일관되게 우세하다는 근거는 나타나지 않습니다.
Qwen3.5-397B-A17B MoE expert 가중치에서 NVFP4와 추가 MXFP4 requantization 오차의 분포, 오차 상관관계, GEMM 출력 SQNR을 비교한 세 부분 그래프입니다.
ChartNVFP4 오차와 MXFP4 추가 오차는 0을 중심으로 분포하고 평균 pairwise correlation은 -0.04로 표시되어 두 번째 rounding이 첫 번째 오차를 같은 방향으로 누적하지 않음을 나타냅니다. NVFP4 to MXFP4 출력 SQNR은 약 17 dB로 NVFP4 단독보다 약 3.6 dB 낮지만, 수천 개 가중치를 합산하는 GEMM에서 zero-mean 오차가 일부 상쇄되어 신호 우세 상태를 유지합니다.
08
greedy decoding에서는 두 경로의 생성 trace가 100% 달라졌지만 최종 정답은 AIME25의 90%, GPQA-Diamond-CoT의 92%에서 동일했습니다. GPQA-Diamond-CoT 198문항에서는 두 경로가 모두 맞힌 문항이 162개, 모두 틀린 문항이 20개였고 online 경로만 맞힌 문항은 11개, emulation 경로만 맞힌 문항은 5개였습니다. 두 경로 중 어느 쪽이 유리한지 일관된 방향이 나타나지 않아, 글은 이를 체계적인 정밀도 손실보다 sampling noise에 가까운 결과로 판단합니다.
09
GSM8K에서는 online NVFP4 to MXFP4 경로가 원본 release 대비 MiniMax-M2.7 100.7%, Qwen3.5-397B-A17B 99.1%, Qwen3.5-397B-A17B-V2 98.7%, Kimi-K2.6 99.0%, DeepSeek-R1 99.2%의 점수를 기록했습니다. 이 수치는 source checkpoint의 기본 산술 추론 능력이 변환 후에도 대부분 유지됐음을 나타냅니다. 다만 MXFP4의 32개 단위 E8M0 블록은 NVFP4보다 거칠기 때문에 원본 NVFP4와 bit-exact 결과가 필요한 정밀도 검증에는 변환 경로를 사용할 수 없습니다.
다섯 모델의 원본 고정밀도 release와 online NVFP4 to MXFP4 경로의 GSM8K 정확도를 비교하고 원본 점수 대비 회복률을 표시한 그래프입니다.
ChartMiniMax-M2.7은 원본 0.918에서 변환 경로 0.924로 100.7%를 기록했고, Qwen3.5-397B는 0.954에서 0.945로 99.1%를 기록했습니다. 나머지 모델도 Qwen3.5-397B-V2 98.6%, Kimi-K2.6 99.0%, DeepSeek-R1 99.2%로 원본 checkpoint의 기본 산술 추론 정확도를 대부분 유지합니다.
10
online requantization의 대가는 steady-state 처리량이 아니라 서버 시작 시간에 집중됩니다. AMD MI350X 실험에서 native MXFP4 대비 추가 시작 시간은 DeepSeek-R1 34초, Kimi-K2.6 55초, MiniMax-M2.7 12초, Qwen3.5-397B-A17B 26초, Qwen3.5-397B-A17B-V2 44초였습니다. native MXFP4 연산을 지원하지 않는 하드웨어, 아직 지원하지 않는 source 형식, 매우 민감한 load-time benchmark에서는 다른 경로를 선택해야 합니다.

용어 해설

NVFP4
NVFP4는 E2M1 형식의 4비트 값 두 개를 1바이트에 저장하고, 16개 값마다 FP8 E4M3 블록 스케일과 텐서별 FP32 스케일을 적용하는 수치 형식입니다. 대규모 모델의 가중치를 낮은 메모리 사용량으로 저장하지만, AMD Instinct™ MI350X와 MI355X의 native 4비트 연산 형식인 MXFP4와 구조가 달라 직접 실행할 수 없습니다.
MXFP4
MXFP4는 E2M1 4비트 값을 32개 단위로 묶고 각 블록에 E8M0 power-of-two 스케일을 적용하는 OCP microscaling 형식입니다. MI350X와 MI355X의 native 4비트 GEMM 경로가 이 형식을 직접 소비하므로, NVFP4 가중치를 MXFP4로 바꾸면 별도 BF16 GEMM 없이 하드웨어 가속 경로를 사용할 수 있습니다.
Requantization은 이미 낮은 정밀도로 양자화된 값을 다른 블록 크기와 스케일 규칙을 가진 정밀도 형식으로 다시 양자화하는 과정입니다. 이 글의 SGLang 경로는 모델 로딩 중 NVFP4 가중치를 한 레이어씩 복원한 뒤 MXFP4로 변환하고, 요청 처리 중에는 변환을 반복하지 않아 steady-state 성능 저하를 피합니다.(Requantization)
Requantization은 이미 낮은 정밀도로 양자화된 값을 다른 블록 크기와 스케일 규칙을 가진 정밀도 형식으로 다시 양자화하는 과정입니다. 이 글의 SGLang 경로는 모델 로딩 중 NVFP4 가중치를 한 레이어씩 복원한 뒤 MXFP4로 변환하고, 요청 처리 중에는 변환을 반복하지 않아 steady-state 성능 저하를 피합니다.
MXFP4 GEMM
MXFP4 GEMM은 MXFP4 가중치와 MXFP4 활성값을 AMD CDNA4의 scaled matrix-core MFMA 명령에 직접 입력하는 행렬 곱셈 경로입니다. SGLang은 AITER의 dense GEMM과 fused-MoE 커널, 활성값 양자화 결합, 가중치 사전 재배치를 이용해 별도 dequantize와 반복적인 데이터 재배치 비용을 줄입니다.
신호 대 양자화 잡음비(SQNR)
SQNR은 양자화된 출력의 신호 크기를 양자화 잡음과 비교하는 지표로, 값이 높을수록 양자화로 인한 잡음이 작습니다. 글의 Qwen3.5-397B-A17B 가중치 실험에서 NVFP4를 MXFP4로 다시 양자화한 경로는 약 17 dB를 기록해 NVFP4 단독 경로보다 약 3.6 dB 낮았지만, 출력 신호가 여전히 잡음보다 우세한 범위에 머물렀습니다.

코드 예제

bash
sglang serve --model-path \
  --tensor-parallel-size \
  --quantization quark_mxfp4

SGLang 서버를 quark_mxfp4 설정으로 실행해 NVFP4 checkpoint를 로딩 시점에 MXFP4로 변환합니다.

bash
lm_eval --model sglang \
  --model_args "pretrained=,tp_size=,quantization=quark_mxfp4,trust_remote_code=True" \
  --tasks --apply_chat_template --seed \
  --gen_kwargs do_sample=True,temperature=,top_p=0.95,top_k=40,max_gen_toks=64000 \
  --batch_size auto

lm-eval-harness에서 GPQA-Diamond-CoT 또는 AIME25의 SGLang 기반 정확도를 측정합니다.

bash
lm_eval --model sglang \
  --model_args "pretrained=,tp_size=,quantization=quark_mxfp4,trust_remote_code=True" \
  --tasks gsm8k \
  --gen_kwargs do_sample=False,temperature=0.0,max_gen_toks=32000 \
  --batch_size auto

SGLang의 online requantization 경로로 GSM8K 정확도를 측정합니다.

bash
python3 -m sglang.benchmark.serving --backend sglang \
  --host 127.0.0.1 --port 30000 \
  --model --tokenizer \
  --dataset-name random --random-input-len 1024 --random-output-len 1024 \
  --random-range-ratio 1.0 --num-prompts 200 \
  --max-concurrency 64 --request-rate 20

동일한 입력·출력 길이와 동시성 조건에서 SGLang serving 처리량을 측정합니다.

기술

  • SGLang
  • AMD Quark
  • ROCm 7.0.0
  • AITER
  • Triton 3.4.0
  • lm-eval-harness 0.4.12
  • MXFP4 GEMM
  • MFMA
  • NVFP4
  • BF16

활용 사례

  • MI350X 또는 MI355X에서 NVFP4 전용 checkpoint 서빙
  • 오프라인 변환과 두 번째 가중치 사본 없이 대규모 LLM 배포
  • 공개 MXFP4 checkpoint가 없는 양자화 설정의 빠른 검증
  • AMD native 4비트 가속을 활용한 production serving
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 09. 08.수집 2026. 09. 09.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.