Views
No views yet
<tool_call> tags), compatible with vLLM's --tool-call-parser hermes.| Metric | Value |
|---|---|
| Narrative TPS (n=5) | 71.75 (CV 11.6%) |
| Code TPS (n=5) | 80.35 (CV 10.6%) |
| MTP acceptance length | 3.02-3.14 |
| Per-position accept | ~83% / 69% / 56% |
| TTFT | ~141ms |
| Max context | 262K tokens (fp8 KV) |
| Concurrent streams | 2 |
| VRAM per card | 22.25 GiB |
| Model load size | 9.19 GiB |
1services:
2 vllm-carnice:
3 image: vllm/vllm-openai:nightly-7a1eb8ac2ec4ea69338c51dc7afd4b15010abfa8
4 ports:
5 - "8070:8000"
6 volumes:
7 - ./models:/root/.cache/huggingface
8 shm_size: "16gb"
9 ipc: host
10 deploy:
11 resources:
12 reservations:
13 devices:
14 - driver: nvidia
15 count: all
16 capabilities: [gpu]
17 command:
18 - --model /root/.cache/huggingface/carnice-v2-27b-int4-bf16mtp
19 - --quantization auto_round --dtype float16
20 - --tensor-parallel-size 2
21 - --disable-custom-all-reduce
22 - --max-model-len 262144
23 - --gpu-memory-utilization 0.92
24 - --max-num-seqs 2
25 - --kv-cache-dtype fp8_e5m2
26 - --trust-remote-code
27 - --reasoning-parser qwen3
28 - --enable-auto-tool-choice
29 - --tool-call-parser hermes
30 - --speculative-config '{"method":"mtp","num_speculative_tokens":3}'--max-model-len to ~65K, set --tensor-parallel-size 1, --max-num-seqs 1.1from openai import OpenAI
2
3client = OpenAI(base_url="http://localhost:8070/v1", api_key="not-needed")
4
5response = client.chat.completions.create(
6 model="carnice-bf16mtp",
7 messages=[{"role": "user", "content": "Write a quicksort in Python."}],
8 max_tokens=800,
9 temperature=0.6,
10)
11print(response.choices[0].message.content)1response = client.chat.completions.create(
2 model="carnice-bf16mtp",
3 messages=[{"role": "user", "content": "What's the weather in Paris?"}],
4 tools=[{
5 "type": "function",
6 "function": {
7 "name": "get_weather",
8 "description": "Get weather for a city",
9 "parameters": {
10 "type": "object",
11 "properties": {"city": {"type": "string"}},
12 "required": ["city"],
13 },
14 },
15 }],
16 tool_choice="auto",
17)
18print(response.choices[0].message.tool_calls)| Setup | Min VRAM | Context | Throughput |
|---|---|---|---|
| 2× RTX 3090 (recommended) | 24 GB each | 262K | 72/80 TPS |
| 1× RTX 3090 | 24 GB | ~65K | ~50 TPS (estimated) |
| 1× RTX 4090 | 24 GB | ~65K | ~60 TPS (estimated) |
| 2× RTX 4090 | 24 GB each | 262K | ~85/100 TPS (estimated) |
--disable-custom-all-reduce on PCIe).reasoning field is shorter than base Qwen's verbose style. verify-full.sh's thinking test expects ≥50 chars; Carnice typically outputs ~5-10 chars. This is cosmetic — tool calls and generation quality are unaffected.carnice-autoround/ directory:recipe_d_delta_merge.py — Applies Lorbus's INT4 quant grid to Carnice's BF16 weightsrecipe_d_bf16mtp_overlay.py — Replaces INT4-packed MTP projections with BF16 weights from base Qwen