uzins's picture
Card fixes 2026-11-02: full card audit โ€” benchmark notes and MMLU method, BF16 shares, requirements, GGUF/diffusion details
bc1afe2 verified
|
Raw History Blame Contribute Delete
10.7 kB
---
base_model: openbmb/MiniCPM5-2B
base_model_relation: quantized
library_name: transformers
license: apache-2.0
pipeline_tag: text-generation
tags:
- minicpm
- compressed-tensors
- vllm
- quantized
- fp8
---
# MiniCPM5-2B ยท FP8 (dynamic)
8-bit quantization of [`openbmb/MiniCPM5-2B`](https://huggingface.co/openbmb/MiniCPM5-2B) for **vLLM serving**. Quantized by **axteam**.
| | |
|---|---|
| **Base model** | [`openbmb/MiniCPM5-2B`](https://huggingface.co/openbmb/MiniCPM5-2B) |
| **Method** | FP8 (dynamic) |
| **Format** | compressed-tensors `float-quantized` (scheme `FP8_DYNAMIC`) |
| **Weights / activations** | W8A8 โ€” FP8 E4M3 weights (per-channel), dynamic per-token FP8 activations |
| **Architecture** | Dense (Llama-architecture) ยท text-only |
| **Size on disk** | ~3.1 GB |
| **Calibration** | None (data-free) |
| **License** | Apache-2.0 |
## Quantization details
- **Scheme** โ€” W8A8 โ€” FP8 E4M3 weights (per-channel), dynamic per-token FP8 activations, stored as compressed-tensors `float-quantized` (scheme `FP8_DYNAMIC`).
- **Kept in BF16** โ€” token embeddings, the LM head, and all RMSNorms (about 21% of all parameters in this build).
- Post-training quantization (no retraining). Tokenizer / `chat_template` identical to the original.
## Benchmarks (measured)
Every column was measured with the same harness and settings โ€” [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness) on vLLM, greedy, completion-style prompts without a chat template (0- or 5-shot, as listed in each row). MMLU here is lm-eval's generative variant (`mmlu_generative`: the model writes the answer letter and only an exact match on the first line counts), so it is not directly comparable with MMLU scores measured another way (e.g. log-likelihood scoring). Percentages are recovery vs. the BF16 original.
| Benchmark | BF16 (original) | **FP8-dynamic (this repo)** | AWQ-8bit | NVFP4A16 | NVFP4 | AWQ-4bit |
|---|---|---|---|---|---|---|
| MMLU (5-shot, generative) | 59.74 | **59.56 (99.7%)** | 59.86 (100.2%) | 56.81 (95.1%) | 53.50 (89.5%) | 56.31 (94.3%) |
| GSM8K (5-shot, strict) | 73.01 | **71.27 (97.6%)** | 73.01 (100.0%) | 65.20 (89.3%) | 55.04 (75.4%) | 65.96 (90.3%) |
| ARC-Challenge (0-shot) | 43.94 | **44.20 (100.6%)** | 43.86 (99.8%) | 43.43 (98.8%) | 40.10 (91.3%) | 44.88 (102.1%) |
| Winogrande (5-shot) | 64.40 | **63.22 (98.2%)** | 64.40 (100.0%) | 62.75 (97.4%) | 59.04 (91.7%) | 62.12 (96.4%) |
| KMMLU (5-shot, direct) | 37.65 | **38.38 (101.9%)** | 38.27 (101.7%) | 35.56 (94.4%) | 34.06 (90.5%) | 30.73 (81.6%) |
| HAE-RAE (0-shot) | 39.05 | **38.13 (97.7%)** | 39.14 (100.2%) | 35.38 (90.6%) | 30.16 (77.2%) | 36.94 (94.6%) |
| **Average** | **52.97** | **52.46 (99.0%)** | **53.09 (100.2%)** | **49.85 (94.1%)** | **45.32 (85.6%)** | **49.49 (93.4%)** |
## Evaluation (measured)
Fidelity to the BF16 original on an internal mixed EN/KO set (100 prompts, BF16 greedy answers scored under each build).
| Metric | This model | BF16 original |
|---|---|---|
| Perplexity (lower = closer) | 1.6494 | 1.5988 (**+3.2%**) |
| Top-1 next-token agreement | 92.9% | 98.9% |
## Requirements
| | |
|---|---|
| **Runtime** | vLLM โ€” the architecture is in vLLM; **tested here with vLLM 0.32.0**. |
| **vLLM install** | vLLM 0.32 itself needs Python 3.11โ€“3.14, torch 2.13 (CUDA 13.0 build, so an NVIDIA driver with CUDA 13 support), transformers โ‰ฅ5.16.1,<5.20 and compressed-tensors 0.17.0 (both pinned by vLLM; 0.17.0 reads this checkpoint, which was saved with 0.19.0 โ€” do not upgrade it separately). |
| **GPU** | NVIDIA Turing (sm75, e.g. T4) or newer. FP8 math runs on Ada / Hopper / Blackwell (sm89+); on Turing and Ampere vLLM switches to weight-only FP8 automatically. V100 (sm70) is not supported. (Kernel choice per GPU from vLLM 0.32's selection code; only B200 was run here.) |
| **Memory** | Weights: **3.1 GB**. Add KV cache (grows with context length ร— concurrent requests) and a few GB for activations / CUDA graphs; use `--tensor-parallel-size N` when the weights do not fit one GPU. |
| **Transformers (without vLLM)** | `transformers>=4.56.0` + `compressed-tensors>=0.15.0` (checked 4.56.2 / 4.57.6 with FP8, AWQ-4bit and NVFP4A16, and 4.56.0 with AWQ-4bit; on transformers 4.x the tokenizer also returns `token_type_ids`, which the model does not accept, so drop it from the tokenizer output before calling `generate`, as these checks did). |
| **trust_remote_code** | not needed |
## Usage (vLLM)
Start an OpenAI-compatible server:
```bash
vllm serve axteam/MiniCPM5-2B-FP8-dynamic --max-model-len 32768
```
Query it:
```bash
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "axteam/MiniCPM5-2B-FP8-dynamic",
"messages": [{"role": "user", "content": "๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ์ˆ˜๋„๋Š” ์–ด๋””์ธ๊ฐ€์š”?"}],
"temperature": 1.0, "top_p": 0.95, "max_tokens": 512
}'
```
Offline inference in Python:
```python
from vllm import LLM, SamplingParams
llm = LLM(model="axteam/MiniCPM5-2B-FP8-dynamic", max_model_len=32768)
params = SamplingParams(temperature=1.0, top_p=0.95, max_tokens=1024)
out = llm.chat([{"role": "user", "content": "Explain model quantization in two sentences."}], params)
print(out[0].outputs[0].text)
```
> Recommended sampling (from the original `generation_config.json`): `temperature=1.0`, `top_p=0.95`.
> Thinking mode is on by default in the chat template; to turn it off pass `chat_template_kwargs={"enable_thinking": False}` (Python `llm.chat(..., chat_template_kwargs=...)`, or `"chat_template_kwargs": {"enable_thinking": false}` in the request body).
## Reducing KV-cache memory (optional, serve-time)
The KV cache is kept in BF16 by default. KV-cache precision is a **runtime** choice, independent of the
weight quantization above; for long contexts or large batches FP8 roughly halves KV-cache memory:
```bash
vllm serve axteam/MiniCPM5-2B-FP8-dynamic --kv-cache-dtype fp8
```
## License
Quantized derivative of [`openbmb/MiniCPM5-2B`](https://huggingface.co/openbmb/MiniCPM5-2B) (Apache-2.0). Original weights & tokenizer belong to OpenBMB.
---
## ํ•œ๊ตญ์–ด ์š”์•ฝ
**[`openbmb/MiniCPM5-2B`](https://huggingface.co/openbmb/MiniCPM5-2B)์˜ FP8 (W8A8) ์–‘์žํ™” ๋นŒ๋“œ** ยท ์ œ์ž‘ axteam
### ๊ฐœ์š”
| ํ•ญ๋ชฉ | ๋‚ด์šฉ |
|---|---|
| ์›๋ณธ ๋ชจ๋ธ | [`openbmb/MiniCPM5-2B`](https://huggingface.co/openbmb/MiniCPM5-2B) |
| ์–‘์žํ™” ๋ฐฉ์‹ | FP8 ๋™์  ์–‘์žํ™” (W8A8) |
| ์ €์žฅ ํ˜•์‹ | compressed-tensors `float-quantized` (scheme `FP8_DYNAMIC`) |
| ๋ชจ๋ธ ๊ตฌ์กฐ | Dense (Llama ๊ตฌ์กฐ) ยท ํ…์ŠคํŠธ ์ „์šฉ |
| ์šฉ๋Ÿ‰ | ์•ฝ 3.1 GB |
| ๋ณด์ • ๋ฐ์ดํ„ฐ | ์—†์Œ (๊ฐ€์ค‘์น˜ ์Šค์ผ€์ผ์€ ๊ฐ€์ค‘์น˜๋งŒ์œผ๋กœ ๊ณ„์‚ฐ, ํ™œ์„ฑํ™” ์Šค์ผ€์ผ์€ ์‹คํ–‰ ์‹œ ๊ณ„์‚ฐ) |
### ์–‘์žํ™” ์ƒ์„ธ
- **๊ฐ€์ค‘์น˜**: FP8(E4M3), ์ถœ๋ ฅ ์ฑ„๋„๋ณ„ ์Šค์ผ€์ผ
- **ํ™œ์„ฑํ™”**: ์‹คํ–‰ ์‹œ ํ† ํฐ๋ณ„ ๋™์  FP8
- **์–‘์žํ™” ์ ˆ์ฐจ**: PTQ(ํ•™์Šต ํ›„ ์–‘์žํ™”, ์žฌํ•™์Šต ์—†์Œ), ๊ฐ€์ค‘์น˜ ์Šค์ผ€์ผ์€ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ณ  ํ™œ์„ฑํ™” ์Šค์ผ€์ผ์€ ์‹คํ–‰ ์‹œ ํ† ํฐ๋งˆ๋‹ค ๊ณ„์‚ฐ
- **BF16 ์œ ์ง€**: ํ† ํฐ ์ž„๋ฒ ๋”ฉ, LM ํ—ค๋“œ, ๋ชจ๋“  RMSNorm โ€” ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์•ฝ 21%
- **์›๋ณธ ํŒŒ์ผ**: ํ† ํฌ๋‚˜์ด์ €ยทchat template์€ ์›๋ณธ๊ณผ ๋™์ผ
### ํ’ˆ์งˆ (์‹ค์ธก)
- **์›๋ณธ ๋Œ€๋น„ ์ถฉ์‹ค๋„**: PPL 1.6494 (์›๋ณธ 1.5988, +3.2%, ๋‚ฎ์„์ˆ˜๋ก ์›๋ณธ์— ๊ฐ€๊นŒ์›€), ๋‹ค์Œ ํ† ํฐ top-1 ์ผ์น˜์œจ 92.9% (์›๋ณธ ์ž์ฒด ๊ธฐ์ค€๊ฐ’ 98.9%) โ€” ๋‚ด๋ถ€ ์˜์–ดยทํ•œ๊ตญ์–ด ํ˜ผํ•ฉ ํ”„๋กฌํ”„ํŠธ 100๊ฐœ, ์›๋ณธ(BF16)์˜ greedy ๋‹ต๋ณ€์„ ๊ธฐ์ค€ ํ…์ŠคํŠธ๋กœ ์ธก์ •
- **๋ฒค์น˜๋งˆํฌ ํ‰๊ท **: 52.46 (์›๋ณธ 52.97, 99.0%) โ€” MMLU(์ƒ์„ฑํ˜•)ยทGSM8KยทARC-ChallengeยทWinograndeยทKMMLUยทHAE-RAE 6์ข… ํ‰๊ท , lm-evaluation-harness + vLLM, chat template ์—†๋Š” ์™„์„ฑํ˜• ํ”„๋กฌํ”„ํŠธ(๊ณผ์ œ๋ณ„ 0ยท5-shot, ํ‘œ ์ฐธ๊ณ )ยทgreedy, ๋ชจ๋“  ๋นŒ๋“œ๋ฅผ ๊ฐ™์€ ์„ค์ •์œผ๋กœ ์ธก์ •
- **ํ•œ๊ตญ์–ด ๋ฒค์น˜๋งˆํฌ**: KMMLU 38.38 (์›๋ณธ 37.65, 101.9%) ยท HAE-RAE 38.13 (์›๋ณธ 39.05, 97.7%)
- **MMLU ๋ฐฉ์‹**: lm-eval ์ƒ์„ฑํ˜• ๋ณ€ํ˜•(`mmlu_generative`) โ€” ๋ชจ๋ธ์ด ๋‹ต ๊ธ€์ž๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฒซ ์ค„์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ์ •๋‹ต์œผ๋กœ ์ฑ„์ ํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋ฐฉ์‹(์˜ˆ: log-likelihood ์ฑ„์ )์œผ๋กœ ์žฐ MMLU ์ ์ˆ˜์™€ ์ง์ ‘ ๋น„๊ต ๋ถˆ๊ฐ€
### ์š”๊ตฌ์‚ฌํ•ญ
- **์‹คํ–‰ ์—”์ง„**: vLLM, ์ด ๋นŒ๋“œ๋Š” vLLM 0.32.0์—์„œ ์‹คํ–‰ ํ™•์ธ
- **vLLM 0.32 ์„ค์น˜ ์กฐ๊ฑด**: Python 3.11~3.14, torch 2.13(CUDA 13.0 ๋นŒ๋“œ, CUDA 13 ์ง€์› ๋“œ๋ผ์ด๋ฒ„ ํ•„์š”), transformers 5.16.1 ์ด์ƒ 5.20 ๋ฏธ๋งŒ, compressed-tensors 0.17.0 โ€” transformersยทcompressed-tensors๋Š” vLLM์ด ๋ฒ„์ „์„ ๊ณ ์ •ํ•˜๋ฏ€๋กœ compressed-tensors๋ฅผ ๋”ฐ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ๋ง ๊ฒƒ (์ด ์ฒดํฌํฌ์ธํŠธ๋Š” 0.19.0์œผ๋กœ ์ €์žฅ๋์ง€๋งŒ 0.17.0์—์„œ๋„ ๋กœ๋“œ๋จ)
- **GPU**: NVIDIA Turing(sm75, ์˜ˆ: T4) ์ด์ƒ, V100(sm70) ๋ฏธ์ง€์› โ€” FP8 ์—ฐ์‚ฐ์€ AdaยทHopperยทBlackwell(sm89 ์ด์ƒ)์—์„œ ์ˆ˜ํ–‰, TuringยทAmpere๋Š” vLLM์ด ๊ฐ€์ค‘์น˜ ์ „์šฉ FP8๋กœ ์ž๋™ ์ „ํ™˜ (GPU๋ณ„ ์ง€์› ์—ฌ๋ถ€๋Š” vLLM 0.32 ์ปค๋„ ์„ ํƒ ์ฝ”๋“œ ๊ธฐ์ค€, ์‹ค์ œ ์‹คํ–‰์€ B200์—์„œ๋งŒ ํ™•์ธ)
- **๋ฉ”๋ชจ๋ฆฌ**: ๊ฐ€์ค‘์น˜ 3.1 GB + KV ์บ์‹œ(์ปจํ…์ŠคํŠธ ๊ธธ์ด ร— ๋™์‹œ ์š”์ฒญ ์ˆ˜์— ๋น„๋ก€) + ํ™œ์„ฑํ™”ยทCUDA graph์šฉ ์ˆ˜ GB โ€” GPU ํ•œ ์žฅ์— ๋‹ค ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด `--tensor-parallel-size N`์œผ๋กœ ๋ถ„์‚ฐ
- **Transformers๋กœ ์ง์ ‘ ์‚ฌ์šฉ**: transformers 4.56.0 ์ด์ƒ + compressed-tensors 0.15.0 ์ด์ƒ (4.56.2ยท4.57.6์—์„œ FP8ยทAWQ-4bitยทNVFP4A16, 4.56.0์—์„œ AWQ-4bit ํ™•์ธ, transformers 4.x์—์„œ๋Š” ํ† ํฌ๋‚˜์ด์ €๊ฐ€ `token_type_ids`๋„ ๋Œ๋ ค์ฃผ๋Š”๋ฐ ๋ชจ๋ธ์ด ๋ฐ›์ง€ ์•Š์œผ๋ฏ€๋กœ `generate` ํ˜ธ์ถœ ์ „์— ํ† ํฌ๋‚˜์ด์ € ์ถœ๋ ฅ์—์„œ ๋นผ์•ผ ํ•จ โ€” ํ™•์ธ ๋•Œ๋„ ๋บŒ)
- **trust_remote_code**: ๋ถˆํ•„์š”
### ์‚ฌ์šฉ๋ฒ•
- **์„œ๋ฒ„ ์‹คํ–‰**: `vllm serve axteam/MiniCPM5-2B-FP8-dynamic --max-model-len 32768` โ€” OpenAI ํ˜ธํ™˜ API
- **Python**: `LLM(model="axteam/MiniCPM5-2B-FP8-dynamic", max_model_len=32768).chat(...)` โ€” ์ „์ฒด ์˜ˆ์‹œ๋Š” ์œ„ ์˜์–ด ๋ณธ๋ฌธ 'Usage (vLLM)' ์ ˆ ์ฐธ๊ณ 
- **๊ถŒ์žฅ ์ƒ˜ํ”Œ๋ง**: `temperature=1.0`, `top_p=0.95` (์›๋ณธ `generation_config.json` ๊ธฐ์ค€)
- **thinking ๋ชจ๋“œ**: ๊ธฐ๋ณธ ์ผœ์ง โ€” ๋„๋ ค๋ฉด `chat_template_kwargs={"enable_thinking": False}` ์ „๋‹ฌ(Python์€ `llm.chat()` ์ธ์ž, HTTP๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์˜ `"chat_template_kwargs": {"enable_thinking": false}`)
- **KV ์บ์‹œ ์ ˆ๊ฐ(์„ ํƒ)**: `vllm serve`์— `--kv-cache-dtype fp8` ์ถ”๊ฐ€ โ€” ๊ธฐ๋ณธ BF16์ธ KV ์บ์‹œ๋ฅผ FP8๋กœ ์ €์žฅํ•ด KV ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ฝ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ž„ (๊ธด ์ปจํ…์ŠคํŠธยท๋™์‹œ ์š”์ฒญ์ด ๋งŽ์„ ๋•Œ ์œ ๋ฆฌ, ๊ฐ€์ค‘์น˜ ์–‘์žํ™”์™€ ๋ณ„๊ฐœ์ธ ์‹คํ–‰ ์˜ต์…˜)
### ๋ผ์ด์„ ์Šค
- **๋ผ์ด์„ ์Šค**: Apache-2.0 โ€” ์›๋ณธ ๋ชจ๋ธ์˜ ๋ผ์ด์„ ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฆ„
- **๊ถŒ๋ฆฌ**: ์›๋ณธ ๊ฐ€์ค‘์น˜ยทํ† ํฌ๋‚˜์ด์ €๋Š” OpenBMB ์†Œ์œ , ์ด ๋ฆฌํฌ๋Š” ์–‘์žํ™” ํŒŒ์ƒ๋ฌผ