MXFP8 시대의 INT8. 다양한 양자화 (Quantization) 유형의 품질 및 속도에 대한 조사
요약
본 기사는 다양한 양자화(Quantization) 유형(INT8, MXFP8, FP8 등)의 품질과 속도를 비교 분석한 연구입니다. 특히 INT8 ConvRot 방식이 Rel-RMSE, SNR dB, Cosine Similarity 세 가지 지표 모두에서 가장 우수한 성능을 보여주었습니다. 테스트 결과에 따르면 GGUF Q8 > INT8 ConvRot > MXFP8 > FP8 >= INT8 Row 순으로 양자화 품질의 대략적인 순위를 제시했습니다.
핵심 포인트
- INT8 ConvRot 방식은 Rel-RMSE, SNR dB, Cosine Similarity 등 주요 측정 지표에서 가장 높은 성능을 기록하며 우수성을 입증했다.
- 양자화된 잠재 변수의 품질 비교를 위해 ComfyUI 노드와 수정된 KSampler를 사용하여 추론 과정의 매 단계별 Latents를 캡처하고 BF16 기준 모델과 비교하는 방법론을 사용했다.
- 테스트 결과에 따른 양자화 품질 순위는 GGUF Q8 > INT8 ConvRot > MXFP8 > FP8 >= INT8 Row로 요약된다.
- INT8은 RTX 20 시리즈부터 하드웨어 가속이 지원되어 왔으며, INT8 Row-wise와 INT8 Tensor-Wise 방식의 차이점과 성능을 비교했다.
최근 MXFP8 관련 게시물들을 보면서, 이것이 다른 양자화 (Quantization) 유형들과 비교했을 때 어떠한지 궁금해졌습니다.
저에게 가장 흥미로운 점은 INT8과의 비교입니다. INT8은 MXFP8과 달리 RTX 20 시리즈부터 하드웨어 가속 (Hardware Accelerated)이 지원되어 왔습니다.
그래서 지난 일주일 동안 저의 ComfyUI 노드인 "INT8-Fast"를 통해 INT8이 어떻게 비교되는지 테스트하는 데 시간을 보냈습니다.
추신: 명확하게 표시된 단 하나의 문단을 제외하고, 여기의 모든 텍스트는 사람이 직접 작성하였으며 저의 개인적인 결론을 반영합니다.
요약 (TLDR): 테스트된 양자화 (Quantization) 품질의 대략적인 순위는 GGUF Q8 > INT8 ConvRot > MXFP8 > FP8 >= INT8 Row 입니다.
#간단 용어 사전:
INT8: -128부터 127까지의 숫자를 저장하는 데이터 타입 (Data Type). FP8과 유사하지만 정수 (Integer)를 사용합니다.
INT8 Row-wise: INT8 가중치 (Weights)와 활성화 (Activation)를 더 세밀한 입도 (Granularity)로 저장하는 약간 더 정교한 방식입니다.
INT8 Tensor-Wise: INT8을 수행하는 가장 쉽고 품질이 낮은 방식입니다.
INT8 ConvRot: Row-wise INT8 방식이지만, 양자화 (Quantization) 전에 모델과 활성화 (Activation)를 이상치 (Outliers)를 제거하는 방식으로 회전 (Rotate) 시킵니다. 참조 논문 링크
측정 항목에 대한 설명 (AI 작성):
SNR dB: "양자화 (Quantization)가 추가한 정적/노이즈에 비해 실제 신호가 얼마나 큰가?"
코사인 유사도 (Cosine Similarity, Cos-sim): "양자화된 잠재 변수 (Latents)가 크기는 약간 다르더라도 원본과 동일한 방향을 가리키고 있는가?"
Rel-RMSE: "평균적으로 각 값이 실제 값의 크기 대비 몇 퍼센트나 틀리는가?"
/AI 설명 종료
#방법론 (Methodology):
제가 수행한 작업은 수정된 KSampler 노드를 사용하여 추론 (Inference) 과정의 매 단계에서 cond/uncond 잠재 변수 (Latents)를 캡처하는 것이었습니다. 그런 다음 이를 양자화되지 않은 BF16 기준 모델 (Baseline Model)과 비교했습니다.
이 테스트는 RTX3090에서 최신 버전의 ComfyUI를 사용하여 실행되었습니다.
#결과:
Anima, 1MP 해상도에서 100개 샘플, 25단계 (Steps).
| 지표 | INT8 ConvRot | INT8 Row | INT8 Row Bedovyy | INT8 Tensor Silver | FP8 | GGUF_Q8 |
|---|---|---|---|---|---|---|
| Rel-RMSE ↓ | 0.09032 ±0.00626 ★ | 0.13396 ±0.00720 | 0.13084 ±0.00920 | 0.23802 ±0.01011 | 0.14523 ±0.00679 | 0.12124 ±0.00714 |
| SNR dB ↑ | 24.05 ±0.53 ★ | 19.68 ±0.39 | 20.24 ±0.52 | 14.48 ±0.36 | 19.66 ±0.35 | 21.98 ±0.46 |
| Cos-sim ↑ | 0.992165 ±0.001113 ★ | 0.984617 ±0.001780 | 0.984765 ±0.002368 | 0.957751 ±0.003461 | 0.981587 ±0.001878 | 0.985553 ±0.001704 |
Z-Image turbo, 64개 샘플, 0.5MP 해상도, 8단계 (Steps):
| 지표 | GGUF_Q8 | INT8 ConvRot | INT8 Row | MXFP8 |
|---|---|---|---|---|
| Rel-RMSE ↓ | 0.16740 ±0.00628 ★ | 0.19634 ±0.00660 | 0.35659 ±0.00968 | 0.30729 ±0.00645 |
| ... | --- |
HiDream O1, 16개 샘플, 0.5MP 해상도, 24단계 (Steps)
FP8 Naive는 데이터 타입 (dtype)을 FP8로 설정하고 BF16 체크포인트를 사용하여 대부분의 가중치를 FP8로 단순 형변환 (cast) 하는 것을 의미합니다.
| 지표 | FP8_Naive | FP8 Scaled | INT8 ConvRot | INT8 Row | MXFP8 |
|---|---|---|---|---|---|
| Rel-RMSE ↓ | 0.23140 ±0.03353 | 0.08793 ±0.01196 | 0.06738 ±0.00849 ★ | 0.40533 ±0.03865 | 0.09269 ±0.00912 |
| ... | --- |
Qwen Image 2512, 0.5MP, 16개 샘플, 25단계 (Steps):
| 지표 | FP8 | GGUF Q4 K M | GGUF Q8 | INT8 ConvRot | INT8 Row | Nunchaku BestQuality |
|---|---|---|---|---|---|---|
| Rel-RMSE ↓ | 0.22316 ±0.02186 | 0.25253 ±0.02143 | 0.13382 ±0.02853 ★ | 0.13795 ±0.02225 | 0.16354 ±0.02883 | 0.24947 ±0.02144 |
| ... | --- |
하드웨어에서 제대로 지원되지 않을 때 MXFP8의 성능이 단순히 더 떨어지는 것인지 확인하기 위해 5060에서 Anima를 테스트해 보았습니다:
16개 샘플, 0.5MP 해상도, 24단계 (Steps)
| 지표 | INT8ConvRot | MXFP8 |
|---|---|---|
| Rel-RMSE ↓ | 0.08546 ±0.00846 ★ | 0.14716 ±0.01107 |
| ... | --- |
더 많은 정보가 필요하시다면 제 GitHub에서 훨씬 더 상세한 전체 비교 결과를 확인하실 수 있습니다.
또한 이 노드를 사용하여 직접 품질 비교를 수행할 수도 있습니다.
#속도 (Speed):
여기에는 숫자가 아주 많지는 않습니다. 3090에서 모델에 따라 bf16 대비 1.5배에서 2배 정도의 속도 향상을 확인했습니다.
ConvRot은 약 1.15배의 추론 오버헤드 (Inference overhead)를 추가하므로, 사용자의 목적에 맞게 사용할 가치가 있는지 직접 판단하시면 됩니다.
GGUF는 오프로드 (Offload)가 발생하지 않는 시나리오에서는 항상 BF16과 거의 비슷한 속도를 보입니다. 여기에 LoRA를 추가하면 bf16보다 상당히 느려질 것입니다.
제가 보유한 8GB RTX5060에서는 대부분의 모델이 오프로드될 것이므로, 일단 사용 편의성을 위해 Anima를 기준으로 하겠습니다:
Anima, PyTorch 2.13.0.dev20260511+cu132, triton-windows, 1MP, 배치 크기 (Batch size) 1, 공정한 테스트를 위해 2회의 웜업 (Warmup) 라운드 이후 측정된 속도:
| 포맷 (Format) | 속도 (it/s) ↑ | 상대적 속도 향상 (Relative Speedup) |
|---|---|---|
| bf16 | 0.78 | 1.00× |
| INT8 ConvRot | 1.12 | 1.43× |
| INT8 Row | 1.24 | 1.58× |
| INT8 ConvRot Compile | 1.47 | 1.88× |
| MXFP8 | 0.89 | 1.14× |
| MXFP8 --fast | 0.93 | 1.19× |
| MXFP8 --fast with torch compile | 1.37 | 1.75× |
#결론 (Conclusion):
이렇게 창밖을 내다볼 필요는 없습니다.
ConvRot을 사용한 INT8이 MXFP8보다 더 빠른 것으로 보이며 품질 또한 더 높습니다. 또한 MXFP8과 달리 2019년 이후 출시된 거의 모든 Nvidia GPU에서 지원됩니다.
주의 사항 (Caveats): RTX 20 시리즈 GPU는 bf16 대비 INT8 연산 성능 (flops)이 4배에 불과하므로, 해당 기기에서는 이득이 적게 나타날 수 있습니다.
도움이 되었기를 바랍니다. 안녕히 계세요.
수정 (Edit):
여기에 몇 가지 INT8 ConvRot 모델을 업로드했습니다: https://huggingface.co/bertbobson/ComfyUI-INT8_ConvRot
하지만 변환할 BF16 모델만 있다면, int8 fast 노드를 통해 직접 수행하는 것이 매우 쉽고 빠르다는 점을 다시 한번 강조하고 싶습니다. ComfyUI에서 변환하는 예시 워크플로우 (Workflow)는 여기에서 확인할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/StableDiffusion의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기