# Internal Draft: Evaluating High-Context Reasoning Models on Mid-Tier Home-Lab Hardware

**Document Status:** Private Draft / Technical Working Paper
**Target Audience:** Home-lab Engineers, LLM Self-Hoster Community
**Subject:** Performance Analysis of Qwen3.6-35B-A3B-APEX-MTP-I-Balanced.gguf via Local Observability Layer

---

# Thesis

The current trajectory of open-weight Large Language Models (LLMs) has shifted from a pursuit of raw parameter count toward "reasoning efficiency"—the ability of a model to utilize internal "thinking" cycles (Chain-of-Thought) to solve complex problems before committing to a final answer. For the home-lab enthusiast, the challenge is no longer just "will it fit in VRAM?" but "can the hardware sustain the throughput required for extended reasoning budgets without collapsing under context pressure?"

This article explores the capabilities of a 32GB-class R9700 server acting as a local inference node. By deploying the **Qwen3.6-35B-A3B-APEX-MTP-I-Balanced.gguf** model through **llama.cpp** (utilizing Vulkan acceleration and Multi-Token Prediction), and routing all traffic through a local **AI Flight Recorder**, we aim to quantify the boundary between "usable" and "performant." 

The core thesis is that with a sufficiently large reasoning budget (8192 tokens) and a high-context window (262,144 tokens), a mid-tier server can transition from a simple chatbot to a legitimate agentic workstation, provided the observability layer is used to identify and eliminate the "token-cutoff" failures common in early-stage reasoning model deployments.

---

# Hardware And Runtime

To understand the results, we must first define the execution environment. The "32GB-class" designation refers to the available system/video memory pool utilized for model weights and KV cache. In this architecture, we are leveraging the R9700's throughput capabilities, which provide a balanced mix of compute and memory bandwidth necessary for GGUF-based inference.

### The Runtime Stack: llama.cpp & Vulkan
We have opted for **llama.cpp** as the primary inference engine. While CUDA is the industry standard for NVIDIA hardware, the use of the **Vulkan backend** provides a critical layer of abstraction and stability for this specific hardware profile. Vulkan allows for efficient GPU memory mapping and parallelization across the compute units, ensuring that the 35B model—quantized to a "Balanced" GGUF format—can reside primarily in memory while maintaining acceptable tokens-per-second (TPS).

### The Model: Qwen3.6-35B-A3B-APEX-MTP-I-Balanced
The choice of **Qwen3.6-35B-A3B-APEX-MTP-I-Balanced** is intentional. This model represents a sophisticated balance of parameter density and reasoning capability. The "MTP" (Multi-Token Prediction) aspect is a game-changer for home-lab setups; by predicting multiple tokens in a single forward pass, the model can significantly reduce the wall-clock time required for long-form reasoning, effectively masking some of the latency inherent in 32GB-class hardware.

### Configuration Parameters
The server is launched with the following critical flags:
- **Context Window:** `262,144` tokens. This allows the model to ingest massive documentation sets or entire codebases without truncation.
- **Reasoning Budget:** `--reasoning-budget 8192`. This allocates a specific ceiling for the model's internal "thinking" process, preventing it from looping infinitely while giving it enough room to solve non-trivial logic puzzles.
- **MTP Draft Decoding:** Enabled. This leverages the model's ability to speculate on future tokens, increasing the effective TPS during the "thinking" phase.

---

# Why Thinking Budgets Matter

Traditional LLMs operate on a "next-token" basis where the first word of the answer is generated immediately after the prompt is processed. Reasoning models (like the Qwen3.6 series) introduce a hidden or explicit "thinking" phase. 

### The "Hidden" Monologue
When a reasoning model receives a complex prompt, it doesn't just answer; it deliberates. It may outline a plan, check its own logic, realize a mistake, and correct it—all before the user sees the first token of the final response. This process is computationally expensive. If the hardware is slow, the "thinking" phase can feel like a hang or a crash.

### The Budgetary Ceiling
The `--reasoning-budget 8192` flag is not merely a limit; it is a permission slip. By granting the model up to 8,192 tokens of internal deliberation, we are allowing it to:
1. **Decompose Complex Tasks:** Break a server-admin request into five sub-steps.
2. **Simulate Code Execution:** Mentally "run" a Python script to see if it will throw an `IndexError` before writing the code.
3. **Cross-Reference Context:** Scan the 262k context window multiple times to ensure consistency.

Without a sufficient budget, the model is forced to "rush" to the answer, which leads to the "shallow-reasoning" phenomenon where the model behaves like a standard 35B model rather than a reasoning-class model.

---

# Why Toy Benchmarks Failed

In the initial phase of this project, we ran "toy tests"—short prompts with standard `max_tokens` settings (e.g., 512 or 1024). The results were disappointing: the model appeared to hallucinate, gave overly brief answers, or failed at basic logic.

### The `max_tokens` Trap
The failure was not in the model, but in the API configuration. In reasoning models, the `max_tokens` parameter often applies to the *total* output, which includes the internal thinking process. 

If a model needs 1,000 tokens to "think" through a complex Bash script and 200 tokens to write the script, a `max_tokens=512` limit will cut the model off while it is still in the middle of its internal deliberation. The user receives a truncated, nonsensical fragment of a thought process, or the model, sensing the limit, skips the thinking phase entirely to fit the answer into the remaining window.

### The Lesson for Home-Labbers
We discovered that for reasoning models, the `max_tokens` setting must be decoupled from the expected answer length. It must be:
$$\text{max\_tokens} \ge \text{Reasoning Budget} + \text{Expected Answer Length}$$

This realization shifted our focus toward the **AI Flight Recorder**, as we needed a way to see exactly where the tokens were being spent—how many were "thinking" tokens and how many were "answer" tokens.

---

# The Real-World Test Suite

To move beyond toy tests, we have designed a comprehensive benchmark suite. This suite is designed to push the 32GB R9700 server to its limits, testing not just speed, but the reliability of the reasoning process across different domains.

### 1. Coding & Software Engineering
Instead of "Write a Hello World," we test:
- **Refactoring:** Providing a 2,000-line legacy C++ file and asking for a migration to modern C++20 standards.
- **Bug Hunting:** Injecting a subtle race condition into a multi-threaded Go program and asking the model to find and fix it.
- **Architecture:** Designing a microservices schema for a local home-lab monitoring system.

### 2. RAG (Retrieval-Augmented Generation)
Leveraging the 262k context, we feed the model:
- **Manual Ingestion:** Uploading three full PDF manuals for different networking switches and asking for a comparative configuration guide.
- **Log Analysis:** Feeding 50,000 lines of syslog data and asking the model to correlate a series of timestamps to find the root cause of a kernel panic.

### 3. Agentic Workflow Simulation
We test the model's ability to act as a "controller":
- **Tool Use:** Providing a set of hypothetical API tools (e.g., `get_system_load`, `restart_service`, `check_disk_space`) and asking it to resolve a "Server Slow" ticket.
- **Multi-Step Planning:** Asking it to plan a full OS migration for a cluster, including backup verification and rollback steps.

### 4. Server-Admin & DevOps
Focusing on the "Home-Lab" niche:
- **YAML/JSON Validation:** Creating complex Kubernetes manifests and asking the model to find indentation errors or deprecated API versions.
- **Security Auditing:** Providing an `ssh_config` or `iptables` rule set and asking for a vulnerability assessment.

### 5. Chat Assistant & Creative Writing
Testing the "human" side of the model:
- **Nuance & Tone:** Asking the model to explain a complex technical concept (like MTP) to a non-technical spouse.
- **Long-Form Narrative:** Generating a 5,000-word technical whitepaper to test the reliability of output over long durations.

### 6. Context Fit & Saturation
We incrementally increase the prompt size (1k $\rightarrow$ 10k $\rightarrow$ 100k $\rightarrow$ 200k) to find the "performance cliff"—the point where the KV cache consumes too much memory and the TPS drops precipitously.

### 7. MTP vs. Non-MTP Behavior
Running the same prompts with MTP enabled and disabled to quantify the actual speedup in the "thinking" phase versus the "generation" phase.

---

# What To Measure

The **AI Flight Recorder** is the centerpiece of our measurement strategy. Because it sits as an OpenAI-compatible proxy, it captures every byte of the exchange without modifying the model's behavior.

### Primary Metrics
1. **TTFT (Time to First Token):** The delay between the request and the first token of the *thinking* process. This measures prompt processing speed (prefill).
2. **TBT (Time Between Tokens):** The average latency between tokens during the reasoning phase.
3. **Reasoning-to-Answer Ratio:** The number of thinking tokens versus the number of final answer tokens. A high ratio usually correlates with higher accuracy on complex tasks.
4. **Effective TPS (Tokens Per Second):** The total tokens generated (thinking + answer) divided by total time.
5. **Context Latency Scaling:** How much the TBT increases as the context window fills from 0 to 262,144.

### Secondary Metadata
- **VRAM Pressure:** Monitoring the peak memory usage during the reasoning phase.
- **MTP Hit Rate:** (If available via llama.cpp logs) how often the multi-token prediction was accepted versus rejected.
- **Token Efficiency:** The amount of "waste" (repetitive thinking) the model engages in before reaching a conclusion.

---

# How To Read The Charts

Once the data is collected, we will present it using three specific visualization styles to avoid the "average TPS" fallacy.

### The "Reasoning Gap" Histogram
We will plot the duration of the "thinking" phase against the complexity of the task. If we see a flat line, the model is not utilizing its reasoning budget. If we see a bell curve that shifts right as tasks get harder, the reasoning budget is working as intended.

### The Context Decay Curve
A line graph showing TPS on the Y-axis and Context Window (tokens) on the X-axis. We expect a linear decline followed by a sharp "cliff" where the system begins swapping to disk or hitting VRAM limits. This identifies the *practical* maximum context for the R9700.

### MTP Speedup Heatmap
A comparison chart showing:
- **Standard Decoding:** [Task Complexity] $\rightarrow$ [Time]
- **MTP Decoding:** [Task Complexity] $\rightarrow$ [Time]
This will highlight whether MTP is more effective during the "thinking" phase (which is often more predictable) or the "creative" phase.

---

# Privacy Boundaries

A critical component of this home-lab setup is the **Privacy Perimeter**. Because we are using open-weight GGUF models and a local proxy, the data flow is entirely air-gapped from external AI providers.

### The Flight Recorder's Role
The AI Flight Recorder captures everything: the prompts, the internal thinking, the final answers, and the system timings. This is highly sensitive data, as it may contain local IP addresses, server names, and private code.

### Sanitization Protocol
To ensure this research can be shared with the community without compromising security, we will implement a **Sanitization Pipeline**:
1. **Raw Data:** Stays on the R9700 server in an encrypted volume.
2. **Aggregation:** The Flight Recorder will export aggregate statistics (e.g., "Average TPS for Coding Tasks") rather than raw logs.
3. **Anonymization:** Any shared "example" prompts will be scrubbed of specific home-lab identifiers (e.g., `192.168.1.50` $\rightarrow$ `[LOCAL_IP]`).

---

# Expected Model Categories

Based on the "Balanced" quantization of the Qwen3.6-35B model, we expect the performance to fall into these categories:

### The "Sweet Spot" (High Performance)
- **Short-to-Mid Context (< 32k):** Fast response times, high MTP efficiency, and near-instant reasoning.
- **Structured Data Tasks:** JSON/YAML generation where the model can "think" through the schema before writing.

### The "Tolerable" (Moderate Performance)
- **Deep Reasoning Tasks:** When the model utilizes the full 8,192 reasoning budget, we expect a noticeable "pause" before the answer, but the quality should be significantly higher than non-reasoning models.
- **Mid-Range Context (32k - 128k):** A slight dip in TPS, but still usable for RAG.

### The "Edge Case" (Low Performance)
- **Extreme Context (> 200k):** We expect the R9700 to struggle here. The TBT will likely increase, and the risk of "context drift" (where the model forgets the beginning of the prompt) increases.
- **Highly Stochastic Creative Writing:** MTP may have a lower hit rate here, as creative text is less predictable than code or logic.

---

# Limits And Caveats

No home-lab setup is without its bottlenecks. We must be honest about the limitations of a 32GB-class server.

### Memory Bandwidth Bottleneck
While Vulkan acceleration helps, the primary bottleneck for GGUF models is memory bandwidth. The R9700 is powerful, but it cannot match the HBM (High Bandwidth Memory) of an A100 or H100. This means that while we can *fit* the model, the speed will always be limited by how fast weights can be moved from RAM to the GPU cores.

### Thermal Throttling
Extended reasoning tasks (where the GPU is pinned for minutes while the model "thinks") can lead to thermal throttling. Our benchmarks will monitor clock speeds to ensure that "slowdown" is a result of model complexity, not a cooling failure.

### Quantization Loss
The "Balanced" GGUF is a compromise. While it allows the 35B model to fit in 32GB, there is an inherent loss of precision compared to FP16. We must be aware that some "reasoning failures" may be due to quantization artifacts rather than hardware or budget limits.

---

# Next Experiments

Once the baseline for Qwen3.6-35B is established, the following experiments are planned:

1. **Quantization Comparison:** Testing the "Small" vs. "Balanced" vs. "Large" GGUF quants to find the exact point where reasoning capability collapses.
2. **Multi-Model Routing:** Using the Flight Recorder to route simple queries to a smaller 7B model and complex queries to the 35B reasoning model, measuring the impact on total system throughput.
3. **Reasoning Budget Optimization:** Testing if a smaller budget (e.g., 2048) is sufficient for 80% of home-lab tasks, thereby reducing latency without sacrificing quality.
4. **MTP Tuning:** Experimenting with different draft model sizes to see if a dedicated small draft model outperforms the built-in MTP of the Qwen3.6 architecture.

By treating the home-lab not just as a place to "run" a model, but as a laboratory for "measuring" a model, we can move toward a more scientific approach to local AI deployment. The combination of a high-context reasoning model, a robust runtime, and a dedicated observability layer transforms the R9700 from a simple server into a powerful engine for local intelligence.