# Qwen 27B Ridge 3.7bpw on RX 6800M: ROCm vs Vulkan at 16K – VelsTech Lab

> Tested Qwen 27B Ridge at 3.7bpw on a 12GB RX 6800M – ROCm 18.1 tok/s vs Vulkan 21.8 tok/s decode at 16K, with prompt-eval tradeoffs and VRAM fit.

*Source: https://velstech.net/qwen-27b-ridge-rocm-vs-vulkan.hi (Hindi translation of https://velstech.net/qwen-27b-ridge-rocm-vs-vulkan) · Updated: 2026-08-27*

*Markdown version. [Read the interactive guide](https://velstech.net/qwen-27b-ridge-rocm-vs-vulkan.hi). English Markdown: https://velstech.net/qwen-27b-ridge-rocm-vs-vulkan.md.*

---

🧪 VelsTech Lab – Coming soon यह Lab format में पहली measured post है: exact hardware, software, command और raw `llama-server` timings – क्या टूटा, वह भी शामिल।

🔧 पहले अपना fit चेक करें

[LLM VRAM Calculator](https://velstech.net/llm-vram-calculator) – क्या 27B 3.7bpw + 16K आपके VRAM में fit होगा? · [GPU AI Performance Calculator](https://velstech.net/gpu-ai-calculator) – चलाने से पहले कितने tok/s की उम्मीद करें।

[Open calculators →](https://velstech.net/llm-vram-calculator)

## हमने क्या टेस्ट किया

- GPU: AMD RX 6800M 12GB (mobile, RDNA2, 12 GB VRAM, ~384 GB/s) – वही budget 12 GB card जिसे हम local AI के लिए recommend करते हैं

- Model: Qwen3.8-27B-Ridge-3.7bpw.gguf – Qwen 27B class पर 3.7 bits per weight (~12.3 GB weights)। Ridge quant, K-quants नहीं।

- Context: -c 16384 के साथ --cache-type-k q8_0 --cache-type-v q8_0 -fa on (q8 KV, flash attention on)

- Offload: -ngl 999 --fit on (सभी layers force कीं; नीचे warning देखें)

- Prompt: 373 tokens (दोनों runs में same prompt), n_slots=4, n_ctx_slot=16384, kv_unified=true, n_threads=8

- Builds: Run 1 – /home/user-name/llama.cpp/build/bin/llama-server (ROCm); Run 2 – /home/user-name/llama.cpp_vulkan/build-vulkan/bin/llama-server (Vulkan)

## हमने इसे कैसे चलाया

```
export LD_LIBRARY_PATH=/opt/rocm/lib:$LD_LIBRARY_PATH
llama-server \
 -m /home/user-name/models/Qwen3.8-27B-Ridge-3.7bpw.gguf \
 -ngl 999 \
 --cache-type-k q8_0 --cache-type-v q8_0 \
 -c 16384 -fa on --fit on --reasoning-preserve --jinja
```

दो backends, identical flags। Server `listening on http://127.0.0.1:8080` रिपोर्ट करता है फिर 373-token prompt को process करके ~228-243 tokens generate करता है (600 token budget, truncated 0)।

## हमने क्या मापा

```
Run            Prompt eval                Decode (tg)                Total
─────────────────────────────────────────────────────────────────────────────
ROCm  (build)  1713 ms / 373 tok = 4.60 ms/tok = 217.6 tok/s   100:18.42  155:18.12  210:18.08 → 18.12 tok/s   14.24s / 601 tok  graphs reused 226
Vulkan        2493 ms / 373 tok = 6.68 ms/tok = 149.6 tok/s   100:22.09  166:21.83  232:21.82 → 21.84 tok/s   13.57s / 616 tok  graphs reused 241
```

**Takeaway:** Vulkan **decode पर ~20% तेज़** है (21.84 vs 18.12 tok/s) – वही हिस्सा जो chatting के लिए मायने रखता है। ROCm prompt eval पर ~45% तेज़ है (217 vs 149 tok/s) – लंबे prompt पर time to first token। 615 tokens के लिए end-to-end, Vulkan 0.67s से जीतता है (13.57 vs 14.23) क्योंकि decode हावी है।

## Logs ने वास्तव में क्या कहा – और क्या टूटा

- W common_fit_params: failed to fit params to free device memory: n_gpu_layers already set by user to 999, abort – आपने -ngl 999 force किया इसलिए --fit on ignore हो गया। 12 GB card पर यह 27B q8-KV run आंशिक रूप से offload होना ही चाहिए; 999 force करने से छिप जाता है कि वास्तव में कितने layers fit हुए। अगले run के लिए fix: -ngl 999 हटाएँ और --fit on को चुनने दें, या -ngl 60 सेट करें और n_gpu_layers log करें।

- 14× W model has unused tensor blk.64.* (size ~20KB–73MB) – Model header 65 blocks (0-64) दिखाता है लेकिन block 64 Qwen3 का nextn speculative head है (eh_proj/enorm/hnorm/shared_head_norm)। llama.cpp इसे ignore करता है जब इस build में --jinja --reasoning-preserve के साथ drafting नहीं हो रहा। Error नहीं है, लेकिन आप ~300 MB dead weight load करते हैं।

- kv_unified=true, n_slots=4, n_ctx_slot=16384 – 4 slots एक ही KV pool share करते हैं। अगर आप 16K पर parallel requests मारेंगे, तो single-slot test से भी तेज़ OOM होगा।

## Calculators पर यह कैसे map होता है

Weights: `27B × 0.4625 bytes (3.7bpw/8) ≈ 12.5 GB`। KV q8 16K पर: हमारा [VRAM Calculator](https://velstech.net/llm-vram-calculator) 8K पर ~1.0 GB अनुमान लगाता है `2×layers×kv_heads×head_dim×2 bytes×context` से – 16K q8 पर यह ~2× है, तो ~2.2 GB। साथ में 6% overhead + 0.25 GB → कुल ~15.6 GB, 12 GB से काफी ऊपर। इसका चलना ही साबित करता है कि partial offload हुआ (system RAM के ज़रिए) – जो ~18-21 tok/s बनाम [GPU AI Performance Calculator](https://velstech.net/gpu-ai-calculator) की ~30 tok/s upper bound को समझाता है अगर fully resident होता। यही delta offload tax है।

हम कैसे calculate करते हैं – संख्याओं के पीछे के formulas

Calculators जैसा ही logic, ताकि आप verify कर सकें।

#### VRAM: LLM VRAM Calculator

```
weights = params × bytes_per_weight / GiB
kv_per_token = 2 × layers × kv_heads × head_dim × 2 bytes
kv_cache = kv_per_token × context × batch / GiB
```

#### Speed: GPU AI Performance Calculator

```
decode_tok/s ≈ (memory_BW × 0.8) / bytes_per_token
```

आपका measured 18-21 tok/s 30 tok/s bound से नीचे है क्योंकि bytes_per_token में VRAM BW के अलावा PCIe + RAM offload भी शामिल है।

## निष्कर्ष

12 GB RX 6800M पर 16K पर Qwen 27B Ridge 3.7bpw **चलता तो है, लेकिन fully resident नहीं है**। अगर आप chat करते हैं (decode-bound), तो Vulkan का +20% वास्तविक है। अगर आप लंबे documents feed करते हैं, तो ROCm का तेज़ prefill ज़्यादा मायने रखता है। Lab verdict के लिए: **usable लेकिन offloaded** – 16K q8 KV पर 18-21 tok/s की उम्मीद करें, 32K पर और धीमा। आराम से resident चाहिए? `c 8192` पर drop करें, `q8_0→f16` सिर्फ headroom हो तभी इस्तेमाल करें, या 16/24 GB पर step up करें।

🧪 और Lab

अगला: वही model `--fit on` के साथ बिना `-ngl 999` के (fitted layers दिखाएँ), और `q8_0 vs f16` KV 16K पर। फिर 70B range सिर्फ cloud पर।

[Back to VelsTech Lab →](https://velstech.net/index#lab)

---

*VelsTech – https://velstech.net/qwen-27b-ridge-rocm-vs-vulkan.hi.md*
