
AI 추론 비용과 성능을 함께 최적화하려면 모델·하드웨어·작업 부하에 맞춰 설정을 조정해야 한다. aistack은 Qwen3.8-27B와 GLM5.3-Flash를 코딩 에이전트 작업으로 시험한 결과, FP8은 속도와 메모리의 균형이 좋았고 INT4 AWQ는 가중치 메모리를 크게 줄였지만 일부 처리량이 낮아졌다고 밝혔다. 결과는 실행마다 달라질 수 있으며, KV 캐시를 FP8로 바꾸는 효과도 메모리 압박 여부에 따라 반대 방향으로 나타났다.
같은 모델·GPU·작업 부하에서도 vLLM 설정에 따라 처리량과 상호작용성이 달라졌다. aistack은 GLM5.3-Flash-FP8을 4×H200 NVL에서 동시 요청 96개로, Qwen3.8-27B-FP8을 1×H200 NVL에서 동시 요청 32개로 측정했다. 배치 한도, 스케줄러, 추측 디코딩, 메모리 사용률, 프리픽스 캐싱과 그 조합이 결과에 영향을 줬으며, 업체는 최적화 설정을 자동으로 찾는 기술도 개발 중이라고 설명했다.
양자화가 필요한 이유와 방식
양자화(quantization)는 숫자를 더 적은 비트로 표현해 모델 메모리와 GPU 메모리 이동량을 줄이는 방법이다. 예를 들어 8개 가속기가 든 B200 노드는 HBM3e 메모리 1,440~1,536GB를 제공하지만, 2.8조 개 매개변수의 Kimi K3를 BF16으로 저장하려면 최소 약 5.6TB가 필요하다. 32GB 메모리의 RTX 5090에서 Qwen3.8-27B를 절반 정밀도로 실행하는 데도 54GB가 필요하다. 이런 경우 낮은 정밀도 형식으로 바꾸면 모델을 하드웨어에 넣을 수 있다.
비트 수를 줄이면 가중치 저장 공간과 메모리 트래픽이 감소하고, 지원되는 커널에서는 계산도 빨라질 수 있다. 남는 메모리를 더 많은 캐시 문맥이나 동시 요청에 쓸 수도 있다. 반면 정확도 저하 가능성과 형식 변환·연산에 드는 비용이 있다. 결과는 모델, 숫자 형식, GPU와 커널에 따라 다르다. Kimi K3는 기본적으로 MXFP4 양자화를 사용한다.
정수 양자화는 일정한 간격의 값으로 숫자를 표현하고, 부동소수점 형식은 부호·지수·가수로 값을 표현해 크기에 따라 간격이 달라진다. 균일 어파인 정수 양자화는 실수 0을 정확히 나타내기 위해 스케일과 제로포인트를 사용한다. 원문은 float32 값 0.37을 범위 [-1.2, 0.8]의 4비트 정수로 바꾸는 예를 든다. 16개 표현값 중 가장 가까운 값은 0.40이며, 양자화 뒤에는 원래 값과의 오차가 생긴다. 값이 보정 범위를 벗어날 때 발생하는 클리핑 오차도 정확도를 낮출 수 있다. PyTorch는 0~15만 쓰더라도 텐서를 8비트 컨테이너에 저장하며, 실제 INT4 구현은 패킹되거나 특수한 저비트 표현을 쓴다.
사후 학습 양자화(PTQ)는 사전 학습된 모델의 가중치를 다시 학습하지 않고 낮은 정밀도로 변환한다. 보통 작은 보정 데이터셋을 이용해 스케일을 정하고 반올림과 이상치를 처리한다. GPTQ와 AWQ가 널리 쓰이는 방법이다. 양자화 인식 학습(QAT)은 학습 또는 미세 조정 과정에서 양자화를 모사해 모델이 낮은 정밀도에서 생기는 오차에 적응하도록 한다. 공격적인 양자화로 정확도가 크게 낮아진 경우, 특히 작은 언어 모델에서 정확도를 회복할 수 있다.
BF16과 FP16은 모델 가중치와 계산에 흔히 쓰이는 16비트 형식이고, FP32는 더 높은 수치 정밀도가 필요한 연산에 쓰인다. BF16은 FP16보다 표현 범위가 넓지만 정밀도는 낮다. FP8은 지원 GPU에서 저장 공간을 줄이고 계산을 가속할 수 있다. E4M3는 정밀도에, E5M2는 표현 범위에 더 무게를 둔다. INT8·INT4는 정수 추론 형식이며, NVFP4는 Blackwell GPU에서 4비트 부동소수점 값과 스케일을 함께 쓴다. 가중치·활성값·KV 캐시는 서로 다른 형식을 사용할 수 있다.
| 형식 | 값당 바이트 | 27B 가중치 크기 | BF16 대비 최대 연산 성능(H100 / B200) | 지원·주요 용도 |
|---|---|---|---|---|
| FP32 | 4 | 약 108GB | 0.07× / 0.03× (텐서 코어가 아닌 코어에서 67 / 75 TFLOPS) | 모든 GPU. 마스터 가중치, 옵티마이저 상태, 누산기, 소프트맥스·정규화 연산 |
| BF16 | 2 | 약 54GB | 1× (989 / 2,250 TFLOPS) | Ampere 이후 GPU·TPU. 학습·추론 기본 형식 |
| FP16 | 2 | 약 54GB | 1× / 1× | 모든 최신 GPU. 손실 스케일링을 쓰는 구형 학습, pre-Ampere GPU 추론 |
| FP8 E4M3 | 1 | 약 27GB | 2× / 2× (1,979 / 4,500 TFLOPS) | Ada·Hopper·Blackwell, AMD MI300 이후. W8A8 추론, FP8 순전파, KV 캐시 |
| FP8 E5M2 | 1 | 약 27GB | 2× / 2× | E4M3와 같은 GPU. 학습에서 기울기 계산, 보정 스케일이 없는 KV 캐시 |
| INT8 | 1 | 약 27GB | 2× / 2× | 최신 GPU. FP8 미지원 GPU의 W8A8 추론, 보정 필요(예: SmoothQuant) |
| INT4 (AWQ, W4A16) | 약 0.52 | 약 14GB | 16비트로 역양자화해 계산하면 1×, 메모리 제한 디코드의 선형층에서는 최대 약 4× | 최신 GPU. Marlin 커널은 Ampere 이상 필요. 낮은 배치 지연시간, 작은 GPU에 대형 모델 탑재 |
| NVFP4 | 약 0.56 | 약 15.2GB | Hopper에서 미지원 / B200에서 4× (9,000 TFLOPS) | Blackwell 전용. 높은 처리량의 추론 |
| MXFP4 | 약 0.53(4.25비트) | 약 14.3GB | H100은 네이티브 미지원으로 가중치를 확장하므로 약 1×. B200은 NVFP4와 같은 FP4 텐서 경로로 4×. MI355X는 4× | Blackwell, AMD MI350/MI355X 네이티브 지원. 구형 GPU(H100, A100)는 가중치 전용 대체 경로. 개방형 크로스벤더 4비트 가중치, 특히 MoE 전문가 가중치 |
표의 가중치 크기는 매개변수 27B에 값당 바이트를 곱한 이론치다. 실제 체크포인트는 더 크다. Qwen3.8-27B 체크포인트에서는 lm_head, 비전 인코더, MTP 헤드와 선형 어텐션 층 일부가 16비트로 남고, NVFP4 체크포인트는 어텐션 투영을 FP8로 유지한다. 그룹별 스케일과 제로포인트도 추가되므로 INT4 AWQ와 NVFP4 체크포인트는 약 19GB다.
| 형식 | 표현 구조 | 최댓값·범위 | 정밀도 |
|---|---|---|---|
| FP32 | 부호 1·지수 8·가수 23비트 | 약 3.4 × 10³⁸, 약 10⁻³⁸~10³⁸ | 약 7자리 십진수 |
| BF16 | 1·8·7비트 | FP32와 같은 범위 | 가수 7비트(약 0.4% 간격) |
| FP16 | 1·5·10비트 | 최댓값 65,504, 최솟값 약 6 × 10⁻⁸ | 가수 10비트 |
| FP8 E4M3 | 1·4·3비트 | 최댓값 448(MI300의 FNUZ 변형은 240), 약 18개의 2의 거듭제곱 범위 | 가수 3비트(약 6% 간격) |
| FP8 E5M2 | 1·5·2비트 | 최댓값 57,344, 약 32개의 2의 거듭제곱 범위 | 가수 2비트(약 12% 간격) |
| INT8 | 8비트 정수와 스케일 | 스케일 × 균일 간격 255개 | 균일 간격 |
| INT4 (AWQ, W4A16) | 4비트 정수, 그룹별 스케일·제로포인트 | 그룹 스케일 × 16개 값 | 그룹마다 균일 간격 15개 |
| NVFP4 | 1·2·1비트와 값 16개당 FP8 스케일, 텐서별 FP32 스케일 | 범위는 주로 두 단계의 스케일로 확보 | 가수 1비트 |
| MXFP4 | 1·2·1비트(E2M1), 값 32개당 2의 거듭제곱 스케일(E8M0) | 값은 ±6까지, 블록 스케일은 2⁻¹²⁷~2¹²⁷ | 가수 1비트. 2의 거듭제곱 스케일은 블록 최댓값에서 반올림 오차를 더함 |
양자화 대상은 가중치, 활성값, KV 캐시, 하이브리드 트랜스포머의 상태공간 층에 있는 순환 상태다. 가중치는 학습된 매개변수이고, 활성값은 계산 중간값이다. KV 캐시는 이전 토큰의 어텐션 정보를 저장해 재사용한다. 순환 상태는 크기가 작고 반복 갱신돼 정밀도가 필요하므로 보통 FP32로 둔다.
| 대상 | 저장 내용 | 가능한 이점 |
|---|---|---|
| 가중치 | 요청 간 공유되는 모델 매개변수 | 캐시 메모리 여유 증가, 가중치 이동 감소 |
| 활성값 | 계산 중간값 | 임시 메모리 감소, 지원되는 계산 가속 |
| 어텐션 KV 캐시 | 이전 토큰의 키와 값 | 캐시 토큰 증가, 어텐션 메모리 이동 감소 |
| 순환 상태 | 선형 어텐션·상태공간 모델(SSM) 층의 상태 | 상태 페이지 축소, 캐시 구조 변경 가능 |
평가 조건
실험에는 Qwen3.8-27B와 GLM5.3-Flash를 사용했다. Qwen 체크포인트는 BF16 Qwen/Qwen3.8-27B, FP8 Qwen/Qwen3.8-27B-FP8, INT4 AWQ cyankiwi/Qwen3.8-27B-AWQ-INT4, NVFP4 nvidia/Qwen3.8-27B-NVFP4다. GLM 체크포인트는 FP8 unsloth/GLM-5.3-Flash-FP8, INT4 AWQ wtdcode/GLM-5.3-Flash-AWQ-W4A16다.
vLLM은 Qwen에 vllm/vllm-openai:v0.29.0, GLM5.3-Flash에는 공식 day-zero 이미지를 사용했다. 하네스는 Qwen에 Codex, GLM5.3-Flash에 Claude Code를 썼다. Qwen 측정은 1×H200과 2×H200 NVL(TP2), GLM은 4×H200 NVL(TP4)에서 진행했다. Qwen NVFP4는 1×B200에서 측정했다. 두 모델 모두 vLLM의 기본 권장 설정을 사용했다. NVFP4는 하드웨어가 달라 다른 정밀도와 성능을 비교하지 않았고, GLM5.3-Flash의 BF16 가중치는 4×H200 NVL 메모리보다 커 BF16 측정값이 없다.
두 모델의 기본 vLLM 설정은 다음과 같다.
Qwen3.8-27B: 텐서 병렬 크기 2, GPU 메모리 사용률 0.9, 추론 파서 qwen3, 자동 도구 선택 활성화, 도구 호출 파서 qwen3_coder, 프리픽스 캐싱과 청크 단위 프리필 활성화, 추측 설정 {"method":"qwen3_next_mtp","num_speculative_tokens":3}, 언어 모델만 사용.
GLM5.3-Flash: 텐서 병렬 크기 4, GPU 메모리 사용률 0.92, 추론 파서 glm45, 자동 도구 선택과 프리픽스 캐싱·청크 단위 프리필 활성화, 도구 호출 파서 glm47, 언어 모델만 사용, FlashInfer 자동 튜닝 비활성화, 추측 설정 {"method":"mtp","num_speculative_tokens":5}.
가중치 양자화와 코딩 작업 결과
평가는 DeepSWE 110개 작업과 SWE-Bench-Pro의 선별된 64개 작업에서 진행했다. 한 번의 코드 생성을 보는 pass@1 벤치마크와 달리, 실제 에이전트 작업은 저장소를 살펴보고 도구를 쓰며 컴파일러·테스트 결과를 확인하고 수정하는 다중 턴 과정이다. 따라서 한 번의 생성 결과만으로 에이전트 성능을 판단하기 어렵다고 aistack은 설명한다.
| 모델 | 정밀도 | 가중치 메모리 |
|---|---|---|
| Qwen3.8-27B | BF16 | 54GB |
| Qwen3.8-27B | FP8 | 27GB |
| Qwen3.8-27B | INT4 AWQ | 약 19GB |
| Qwen3.8-27B | NVFP4 | 약 19GB |
| GLM5.3-Flash | BF16 | 642GB |
| GLM5.3-Flash | FP8 | 321GB |
| GLM5.3-Flash | INT4 AWQ | 180GB |
Qwen3.8-27B의 DeepSWE 처리량에서 BF16은 초당 출력 토큰 857개, 초당 요청 0.905건, 시간당 작업 21.7개, 시간당 해결 작업 8.1개였다. FP8은 각각 985개(+14.8%), 1.061건(+17.3%), 25.6개(+17.9%), 11.7개(+45.6%)였다. INT4 AWQ는 808개(−5.8%), 0.864건(−4.5%), 20.1개(−7.6%), 7.2개(−11.1%)였다.
BF16·FP8·INT4 AWQ 순으로 첫 토큰 생성 시간(TTFT) 평균은 930.2·749.6·1,039.5ms였고, 중앙값은 531.9·498.0·656.9ms, 90백분위는 914.7·878.7·1,533.9ms, 99백분위는 17,473.1·11,430.7·13,792.0ms였다. FP8은 평균 TTFT를 19.4% 낮췄고, INT4는 평균을 11.7%, 90백분위를 67.7% 높였지만 99백분위는 21.1% 낮췄다.
토큰 간 지연(ITL) 평균은 39.7·33.5·43.8ms, 중앙값은 35.0·24.8·35.5ms, 90백분위는 48.6·47.4·48.6ms, 99백분위는 253.6·197.6·297.6ms였다. 출력 토큰당 시간(TPOT) 평균은 13.2·11.1·14.5ms, 중앙값은 15.4·11.9·16.5ms, 90백분위는 23.4·22.6·23.7ms, 99백분위는 43.8·25.4·45.0ms였다. FP8은 대부분의 지연 지표에서 BF16보다 낮았고, INT4는 일부 꼬리 지표를 제외하면 대체로 높았다.
KV 캐시 사용률은 BF16·FP8·INT4 순으로 평균 0.477·0.396·0.411, 중앙값 0.468·0.391·0.412, 90백분위 0.634·0.546·0.530, 최댓값 0.999·0.828·0.766이었다. 선점(preemption)은 BF16에서 2회였고 두 양자화 설정에서는 0회였다.
이 결과에서 낮은 정밀도가 자동으로 처리량을 높이지는 않았다. FP8은 H200을 포함한 최신 가속기의 전용 텐서 코어가 FP8 행렬 곱을 직접 처리해 메모리 트래픽 감소와 연산 속도 향상을 함께 얻는다. 엔비디아의 H200 NVL 측정에서도 숨은 크기 4096, 24개 층 조건에서 FP8이 사전 양자화 모드의 층별 GEMM을 BF16보다 1.92배 빠르게 실행했다.
INT4 AWQ는 BF16보다 가중치 메모리를 60% 넘게 줄였지만 처리량은 6% 낮았다. AWQ는 보통 W4A16 방식으로 가중치는 4비트, 활성값은 BF16/FP16으로 둔다. 행렬 곱 전에 커널이 스케일과 제로포인트를 이용해 INT4 가중치 타일을 풀고 역양자화한다. 전체 가중치를 16비트로 만들지 않고 GEMM 안에서 역양자화를 합치는 최적화도 있지만, 추가 명령과 스케줄링 부담이 남는다. 따라서 이 설정에서는 INT4가 주로 메모리를 절약하고, FP8은 메모리와 계산을 모두 최적화한다. FP4 형식을 지원하지 않고 FP8을 쓸 메모리도 부족한 경우에는 INT4가 적합할 수 있다.
정확도 결과는 정밀도만 낮추면 에이전트 성능이 반드시 떨어진다는 단순한 예상과 달랐다. SWE-Bench-Pro의 64개 작업에서 Qwen BF16은 33개를 해결했고 FP8은 30개, INT4 AWQ는 32개를 해결했다. 이 실험에서는 INT4의 측정 가능한 저하가 없었고 FP8의 차이는 비교적 작았다. DeepSWE에서는 BF16과 FP8이 각각 43개, INT4 AWQ가 39개를 해결했다. NVFP4는 51개였지만 B200에서 한 번만 실행했으므로 성능 향상으로 해석하지 않았다.
GLM5.3-Flash에서는 SWE-Bench-Pro에서 FP8이 33개, INT4 AWQ가 35개를 해결했고, DeepSWE에서는 각각 9개와 6개였다. 이 두 커뮤니티 체크포인트의 결과는 INT4 AWQ가 FP8보다 정확도를 떨어뜨리지 않는다는 관찰과 일치한다고 업체는 설명했다.
DeepSWE에서는 같은 설정과 하네스 생성 매개변수를 사용하고 인프라 장애도 없었지만 실행 간 변동이 컸다. 원인을 파악하면 글을 갱신하겠다고 aistack은 밝혔다. 온도를 0으로 설정해도 에이전트 SWE 평가는 실행마다 크게 달라질 수 있다. 이는 양자화가 모델을 더 유능하게 만든다는 뜻이 아니다. 양자화는 로짓을 바꾸고, 자기회귀 에이전트는 작은 변화만으로도 다른 파일을 살피거나 다른 도구를 호출하고, 가설을 수정하거나 다른 패치를 만들 수 있다. 긴 작업에서는 이런 경로 차이가 누적된다. 관련 연구에서도 생성 토큰의 앞부분부터 실행 경로가 갈라지고, 일부 코딩 벤치마크에서 양자화 모델이 BF16보다 나은 결과를 내는 사례가 보고됐다. 다만 정밀도를 더 공격적으로 낮추는 전반적 효과는 중립적이거나 부정적일 수 있으며, PTQ 모델의 품질은 보정 데이터셋에도 좌우된다.
KV 캐시 양자화의 조건별 효과
Qwen3.8-27B의 KV 캐시 풀은 BF16에서 3,114,393토큰, FP8에서 5,967,803토큰이었다. 이 측정에서는 FP8 캐시의 스케일을 1.0으로 둔 비보정 텐서별 양자화를 사용했다. FP8은 풀 용량을 거의 두 배로 늘리지만, 여유 메모리가 있는 낮은 동시성에서는 오히려 느렸다.
1×H200에서 동시 요청 16개를 둔 낮은 동시성 실험은 Qwen3.8-27B-FP8 모델의 BF16 캐시와 FP8 캐시를 비교했다. FP8 캐시에서 출력 처리량은 초당 985토큰에서 677토큰으로 31.3% 감소했고, 요청 처리량은 1.061에서 0.709로 33.2% 감소했다. 평균 KV 사용률은 0.396에서 0.240으로 39.3% 감소했으며 최댓값은 0.828에서 0.416으로 49.7% 감소했다. 선점은 두 설정 모두 0회였다. 평균 TTFT는 749.6ms에서 1,035.8ms로 38.2% 늘었고, 평균 ITL은 33.5ms에서 53.9ms로 60.8%, 평균 TPOT은 11.1ms에서 18.3ms로 64.5% 늘었다.
이 실험에서는 KV 메모리 사용량은 줄었지만 메모리 압박이 없어서 속도 이점으로 이어지지 않았다. 어텐션 커널은 양자화된 KV 값을 읽고 스케일을 적용해야 하며, 백엔드에 따라 쿼리 양자화나 추가 변환도 필요하다. FP8 어텐션 커널은 헤드 차원, 시퀀스 길이 분포, GPU 구조에 따라 효율이 낮을 수 있다.
프로파일링에서 FA3는 FP8 KV를 쓸 때 bfloat16 / 128x80 커널 대신 float_e4m3_t / 128x128 커널을 선택했다. 시험한 배치 크기와 문맥 길이 전체에서 호출 한 번의 시간이 24~58% 늘었다.
| 조건 | 층별 어텐션 시간(BF16 → FP8) | 메모리 대역폭(BF16 → FP8) |
|---|---|---|
| 배치 1, 문맥 128k | 137 → 192µs (+40%) | 3.8 → 1.4TB/s |
| 배치 8, 문맥 32k | 252 → 340µs (+35%) | 4.2 → 1.55TB/s |
측정은 KV 헤드 4개, 헤드 차원 256 조건이며 vLLM 로그의 KV 캐시 크기에 맞췄다. BF16 커널은 H200 메모리 대역폭의 약 80~87%를 달성했지만 FP8 커널은 그 3분의 1에도 미치지 못했다. 읽는 데이터가 절반으로 줄어도 FP8 커널이 메모리 대역폭이 아니라 계산에 묶여 예상한 2배 속도 향상이 나오지 않았다. 전체 디코드 단계도 0.5~10% 느려졌다. 예를 들어 배치 1·128k 문맥에서는 12.99ms에서 13.87ms로, 배치 8·32k에서는 15.9ms에서 17.4ms로 늘었다. 증가분은 대부분 느려진 어텐션 커널에서 비롯됐다.
vLLM 팀도 유사한 현상을 관찰했다. KV 트래픽을 절반으로 줄이면 메모리 병목이 있는 긴 문맥 디코딩을 크게 가속할 수 있지만, 이점은 커널과 아키텍처에 따라 달라진다. FP8 오버헤드를 상쇄하지 못하는 설정도 있었고, 하이브리드 모델에서는 일부 층을 양자화하면 오히려 느려져 BF16으로 두는 편을 권했다.
반대로 메모리 압박이 큰 실험에서는 FP8 캐시가 이점을 보였다. Qwen3.8-27B-FP8을 1×H200에서 동시 요청 32개로 실행했을 때 BF16 캐시는 사용률 100%에 도달해 153회 선점이 발생했다. FP8 캐시는 선점을 20회로 86.9% 줄였고 출력 처리량을 초당 233토큰에서 373토큰으로 60.2% 높였다. 평균 TTFT도 25,371.6ms에서 7,039.2ms로 72.3% 줄었다. 하지만 디코딩 단계에서는 FP8이 느렸다. 평균 TPOT은 75.5ms에서 85.2ms로 12.9% 늘었고, 평균 ITL은 264.7ms에서 268.8ms로 1.6% 늘었다. 처리량 향상은 더 많은 유용한 작업을 빠른 HBM에 상주시키고, 캐시 부족에 따른 선점과 재계산을 줄인 데서 나왔다.
따라서 KV 캐시 양자화는 우선 용량 최적화다. 캐시 여유가 있으면 어텐션 커널의 추가 부담만 생길 수 있고, 메모리가 포화에 가까우면 압축으로 실효 처리량을 크게 높일 수 있다. GLM5.3-Flash는 day-zero GLM 이미지의 vLLM에서 KV 캐시 dtype을 FP8로 설정할 때 문제가 있어 비교를 진행하지 못했다. 문제가 해결되면 글을 갱신할 예정이라고 업체는 밝혔다.
KV 캐시 정확도 평가에서 Qwen3.8-27B-FP8은 SWE-Bench-Pro 64개 작업에서 BF16 30개, FP8 31개를 해결했다. DeepSWE 110개 작업에서는 각각 43개와 41개였으며, 표준편차는 각각 2.12와 1.41이었다. aistack은 DeepSWE에서 작은 정확도 차이가 있었지만 SWE-Bench-Pro 결과는 표준편차가 작고 대체로 비슷했다고 설명했다.
결론과 활용 기준
시험한 가중치 형식에서 뚜렷하고 큰 정확도 손실은 관찰되지 않았다. 두 벤치마크에서 BF16·FP8·INT4 AWQ·NVFP4 결과는 대체로 몇 개 작업 차이 안에 있었다. 가장 큰 차이는 DeepSWE의 NVFP4 51개와 BF16 43개였지만 NVFP4는 다른 GPU에서 한 번만 측정했다. GLM5.3-Flash는 FP8과 INT4 AWQ만 비교했다.
하드웨어가 FP8을 네이티브 지원하고 속도와 메모리 절약을 함께 원한다면 FP8을 우선 고려할 수 있다. 이번 실험에서는 BF16 대비 정확도 손실이 관찰되지 않았고, 새 모델 중에는 처음부터 FP8로 양자화된 것도 많다. 모델을 메모리에 넣는 일이 우선이면 INT4 AWQ가 가중치 메모리를 60% 넘게 절약할 수 있지만, 이번 설정에서는 처리량이 6% 낮았다. KV 캐시가 부족할 때 FP8 캐시를 고려하되, 비트 수가 적다는 이유만으로 적용할 필요는 없다. 메모리 여유가 있던 실험에서는 처리량이 31% 줄었고, 메모리 병목이 있던 실험에서는 선점이 87% 감소하고 처리량이 60% 늘었다. 최선의 형식은 하나로 정해져 있지 않으며 하드웨어, 병목, 작업 부하에 맞춰야 한다.
주요 용어: W8A8은 가중치와 활성값을 8비트로 저장하며, W4A16은 가중치를 4비트로 저장하고 활성값은 16비트로 유지해 행렬 곱 안에서 가중치를 역양자화한다. 제로포인트는 어파인 양자화에서 실수 0에 대응하는 정수 코드다. 그룹 스케일은 보통 가중치 32~128개가 스케일과 제로포인트를 공유하는 방식이다. E2M1은 지수 2비트와 가수 1비트의 4비트 부동소수점이며, NVFP4·MXFP4 같은 마이크로스케일 형식은 작은 값 블록마다 스케일을 붙여 표현 범위를 보완한다. Marlin은 AWQ·GPTQ 체크포인트의 4비트 가중치와 16비트 활성값 행렬 곱을 효율적으로 처리하는 융합 GPU 커널 계열이다. vLLM은 KV 캐시 블록이 부족하면 실행 중 요청을 내보내고 나중에 처음부터 다시 계산하는데, 이를 선점이라고 한다. TTFT는 첫 토큰까지 걸리는 시간, ITL은 연속 토큰 사이의 간격, TPOT은 요청 하나에서 출력 토큰당 평균 디코드 시간이다. 추측 디코딩(MTP)은 작은 초안 헤드가 여러 토큰을 제안하고 전체 모델이 한 번에 검증하는 방식이다. TP2·TP4는 각각 GPU 2개·4개의 텐서 병렬 실행을, c32는 벤치마크 중 동시 요청 32개를 뜻한다.
참고 자료: 정수 양자화, FP8 형식, GPTQ, AWQ, QAT, Marlin, 양자화와 추론 평가, FP8 성능 문서, 에이전트 평가의 무작위성, 양자화 KV 캐시 문서, vLLM의 FP8 KV 캐시 분석.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요