wmeddie's picture
Add model card and low-effort RYS evaluation results
0ae9e61 verified
|
Raw
History Blame Contribute Delete
6.82 kB
---
license: apache-2.0
base_model: Qwen/Qwen3.8-27B
tags:
- gguf
- qwen3.8
- rys
- layer-surgery
- reasoning
- bfcl
- function-calling
language:
- en
---
# Qwen3.8-27B β€” RYS Layer Surgery (GGUF)
An **experimental** modification of
[Qwen3.8-27B](https://huggingface.co/Qwen/Qwen3.8-27B), produced by RYS layer
duplication: no training and no weight changes, just running language layers
16–19 (zero-based) a second time during the forward pass.
The source quant is
[unsloth/Qwen3.8-27B-GGUF](https://huggingface.co/unsloth/Qwen3.8-27B-GGUF),
revision `f1bfb127c64f7072bdd2cad55f258b9c8b2910fe`. The method is based on
[David Ng's RYS work](https://dnhkng.github.io/posts/rys/).
## TL;DR
This variant is intended for **low-effort reasoning mode**. It improved a small
reasoning probe by **+11.76 percentage points** and a fixed 1,006-case BFCL v4
single-turn evaluation by **+0.60 pp micro accuracy**. The BFCL gain is small
and not statistically decisive (36 RYS-only wins versus 30 base-only wins,
two-sided exact McNemar p = 0.539), so treat this as an experimental rather
than universally superior release.
The larger EQ-140 result was effectively flat-to-slightly-down (βˆ’0.99). Math
also regressed in the search probe; math was recorded as a diagnostic, not used
as a release gate, because it is an expected and fine-tunable tradeoff here.
| Evaluation | Base | RYS 16–19 | Change |
|---|---:|---:|---:|
| Reasoning probe (17 prompts) | 58.82% | **70.59%** | **+11.76 pp** |
| EQ-140 (139 scored) | **82.65** | 81.66 | βˆ’0.99 |
| BFCL micro accuracy (1,006 cases) | 82.60% | **83.20%** | **+0.60 pp** |
| BFCL category macro mean | 80.54% | **81.81%** | **+1.28 pp** |
| Math probe (diagnostic only) | **1.000** | 0.750 | βˆ’0.250 |
## File
| File | Quant | Language layers | Size | SHA-256 |
|---|---|---:|---:|---|
| `Qwen3.8-27B-rys_16-19-UD-Q4_K_XL.gguf` | UD-Q4_K_XL | 68 | 18.9 GB | `a3013e582490a386d4b8fafbaad07bfec65e7727fb5dcf992914babdc2d65ed4` |
The terminal MTP block from the source GGUF is retained and shifted after the
four inserted language layers.
## BFCL results
The evaluation used a fixed 1,006-case manifest spanning 13 BFCL v4
single-turn categories. Categories with at least 100 entries used 100 cases;
smaller categories used all available entries. This is not the current full
3,641-case BFCL suite and excludes multi-turn, memory, and web-search tasks.
| Category | N | Base | RYS 16–19 | Change |
|---|---:|---:|---:|---:|
| irrelevance | 100 | 86.00% | **88.00%** | +2.00 |
| multiple | 100 | **94.00%** | 91.00% | βˆ’3.00 |
| parallel | 100 | 90.00% | **92.00%** | +2.00 |
| parallel_multiple | 100 | 82.00% | **84.00%** | +2.00 |
| simple_java | 100 | **54.00%** | 53.00% | βˆ’1.00 |
| simple_javascript | 50 | **64.00%** | 62.00% | βˆ’2.00 |
| simple_python | 100 | 94.00% | 94.00% | 0.00 |
| live_irrelevance | 100 | 95.00% | **99.00%** | +4.00 |
| live_multiple | 100 | **79.00%** | 77.00% | βˆ’2.00 |
| live_parallel | 16 | 87.50% | 87.50% | 0.00 |
| live_parallel_multiple | 24 | 62.50% | **70.83%** | +8.33 |
| live_relevance | 16 | 75.00% | **81.25%** | +6.25 |
| live_simple | 100 | 84.00% | 84.00% | 0.00 |
| **Micro accuracy** | **1,006** | **82.60%** | **83.20%** | **+0.60** |
| **Macro mean** | **13 categories** | **80.54%** | **81.81%** | **+1.28** |
Inference used llama.cpp's OpenAI-compatible chat-completions endpoint with
native tool use, the embedded Unsloth chat template, four slots, Q8 KV cache,
and these matched settings for both models:
```text
reasoning_effort = low
enable_thinking = true
preserve_thinking = true
temperature = 1.0
top_p = 0.95
top_k = 20
min_p = 0.0
seed = 3407
max_tokens = 2048
```
The RYS pass generated in 59:16. Normalizing the clean 991-case portion of the
resumed base pass to 1,006 cases gives about 59:41, so wall time was effectively
flat in this run. RYS produced about 2.0% more output tokens.
## What changed?
Qwen3.8-27B uses a repeating three-DeltaNet/one-full-attention hybrid. RYS
insertions therefore need to preserve four-layer blocks. This model duplicates
the half-open layer window `[16, 20)`:
```text
Base: 0 β†’ … β†’ 15 β†’ 16 β†’ 17 β†’ 18 β†’ 19 β†’ 20 β†’ … β†’ 63 β†’ MTP
RYS: 0 β†’ … β†’ 15 β†’ 16 β†’ 17 β†’ 18 β†’ 19
β†’ 16 β†’ 17 β†’ 18 β†’ 19 β†’ 20 β†’ … β†’ 63 β†’ MTP
```
The sweep covered every compatible four-layer window at stride four, followed
by neighboring starts around the strongest reasoning regions. Layers 16–19
were selected because they gave the best reasoning-first result while keeping
the small EQ change near zero. The full BFCL result points in the same positive
direction, though modestly.
## Usage
Use a recent llama.cpp build. Start the server with thinking support and the
embedded Jinja template:
```bash
./build/bin/llama-server \
-m Qwen3.8-27B-rys_16-19-UD-Q4_K_XL.gguf \
--port 8081 -np 4 -ngl all \
-b 2048 -ub 1024 --flash-attn on \
--jinja --no-host --reasoning on --reasoning-preserve \
--temp 1.0 --top-p 0.95 --top-k 20 --min-p 0.0
```
Request low-effort reasoning explicitly:
```json
{
"model": "qwen3.8-27b-rys",
"messages": [{"role": "user", "content": "Your prompt"}],
"temperature": 1.0,
"top_p": 0.95,
"top_k": 20,
"min_p": 0.0,
"chat_template_kwargs": {
"enable_thinking": true,
"reasoning_effort": "low",
"preserve_thinking": true
}
}
```
The embedded Unsloth template already supports low-effort and reasoning-off
modes. A quick comparison with `froggeric/Qwen-Fixed-Chat-Templates` v22 found
no material reasoning-quality difference, so this GGUF retains the source
template.
## When to use this
- You run Qwen3.8 with low-effort reasoning enabled.
- You value the directional gains on parallel/relevance tool-use tasks.
- You are comfortable evaluating an experimental layer-surgery variant for
your own workload.
## When not to use this
- You need a proven across-the-board improvement; the aggregate BFCL gain is
small and not statistically decisive.
- EQ or math performance must not regress at all.
- Your workload is dominated by `multiple`, `live_multiple`, or simple
JavaScript function calling, where the base model did slightly better here.
## Credits
- [Qwen](https://huggingface.co/Qwen/Qwen3.8-27B) for Qwen3.8-27B
- [Unsloth](https://huggingface.co/unsloth/Qwen3.8-27B-GGUF) for the source
UD-Q4_K_XL quant
- [David Ng](https://dnhkng.github.io/posts/rys/) for the RYS method
- [llama.cpp](https://github.com/ggml-org/llama.cpp) for local inference
- [Berkeley Function-Call Leaderboard](https://github.com/ShishirPatil/gorilla/tree/main/berkeley-function-call-leaderboard)
for the evaluation harness
## License
Apache 2.0, inherited from Qwen3.8-27B and the source GGUF.