← Home

MPDev Tech Stack — How a 2016 Tesla P100 Runs a 35-Billion Parameter Model

MPDev Tech Stack — How a 2016 Tesla P100 Runs a 35-Billion Parameter Model

> Why a personal learning project needs local inference, and how I set everything up.

---

Introduction

This blog is, essentially, a personal learning project. The idea is twofold: produce technical content about technology with real depth — minimum of six articles per edition, three verifiable sources per article, texts of at least 500 words per language — and, at the same time, learn in practice how to run large language models locally, on consumer hardware, without depending on paid APIs or cloud services.

The choice was deliberate. Services like ChatGPT, Claude, and Gemini are convenient, but operate under third-party control: variable network latency, rate limits, geopolitical restrictions, and, in some cases, systematic prompt logging. For a project that depends on AI as an editorial production tool — headline collection, drafting, translation, validation — having the model run locally means total control over privacy, availability, and cost.

In a scenario of increasingly frequent commercial restrictions (sanctions against DeepSeek in March 2026, the DHS ban on Chinese models for federal agents in the United States), this autonomy ceases to be a luxury and becomes an operational requirement.

The hardware is simple, almost artisanal: a server with a 16 GB NVIDIA Tesla P100 GPU, 15 GB of DDR4 RAM, and a SATA SSD. No datacenter, no multi-GPU setup. And yet it is perfectly capable of executing a language model with 35 billion parameters, generating fluent text in real time, with a 128K token context window.

In this article, I explain each component of this stack, the real usage numbers, and the reasoning behind every decision.

---

The GPU: Tesla P100 — a classic that still works

The NVIDIA Tesla P100 was released in June 2016, based on the Pascal architecture (GP100). To get a sense of how much the market has advanced since then: in 2026, it lacks RT cores (for ray tracing), lacks tensor cores (for accelerated low-precision operations), and does not support sm_80 or sm_90 — the resource sets of the Ampere generation and later. Alone, without context, it would be an obsolete GPU.

But context is everything.

The P100 uses HBM2 (High Bandwidth Memory 2), the same type of memory found in modern datacenters. The bandwidth is 724 GB/s — more than double that of the GTX 1080, which uses GDDR5X (346 GB/s). The latency of HBM2 is approximately 60 nanoseconds, compared to more than 100 nanoseconds for system DDR4. In language model inference, the bottleneck is almost never computational throughput; it is the speed with which model weights reach the CUDA cores. And here HBM2 makes all the difference.

The data measured on the server:

- Driver: 580.178.04 (October 2026) - CUDA: 13.0 - TDP: 250 W (but measured actual consumption: 48 W idle when not processing requests) - Temperature: 53 °C (passive cooling through server chassis airflow) - VRAM used: 15,446 MiB of 16,384 MiB (94.4%)

Why is 16 GB enough?

The model running here is the Qwen3.6-35B-A3B, quantized to 3 bits. The file weighs approximately 12.7 GB. About 3.3 GB remain for the KV cache (the memory where the model stores conversation context) and for llama.cpp's internal buffers.

If the model were quantized to 4 bits — the Q4_K_M quantization, the community standard — the file would be between 18 and 20 GB, exceeding the available VRAM. If in BF16 (weights in 16-bit floating point), it would be about 66 GB, requiring two A100s of 80 GB each. And only then would you need a datacenter.

Quantization is what makes all of this possible.

---

The Model: Qwen3.6-35B-A3B — real intelligence, not marketing

The Qwen3.6-35B-A3B is a language model developed by the Qwen team (Alibaba Group) and published under the QwenLM foundation license. What makes the model interesting is not the total number of parameters, but its architecture: Mixture-of-Experts (MoE).

In a traditional transformer model, all layers process every input token. The Qwen3.6-35B-A3B has 35 billion parameters distributed across "experts" — sub-networks trained for specific types of task. At each forward pass, only about 3.6 billion parameters are activated. The model dynamically selects which experts are relevant to the current context.

The result: reasoning and knowledge capability comparable to a dense model of 35 billion parameters, with computational cost equivalent to a 3.6-billion-parameter model. It is the equivalent of having a senior engineer who, rather than knowing everything superficially, knows each area deeply and focuses only on what is relevant for each task.

The UD-IQ3_S quantization

The UD-IQ3_S quantization (unsloth-Distilled, Improved Quantization 3-bit Split) reduces each weight to 3 bits, with group splitting for better information distribution. The UD version optimizes the order of weights in the GGUF file to minimize precision loss.

In benchmarks, IQ3_S loses only about 0.5 to 1% in quality compared to the original BF16 model — versus 2 to 3% that a traditional Q4_K_M would lose. And it fits in 16 GB of VRAM.

The available sizes on the Hugging Face repository:

| Quantization | Size | Estimated VRAM | |---|---|---| | UD-IQ1_M | 9.4 GB | 10 GB | | UD-IQ2_M | 10.7 GB | 12 GB | | UD-IQ3_S | 12.7 GB | 14–15 GB | | UD-IQ4_NL | 16.6 GB | 18–19 GB (exceeds P100) | | Q8_0 | 34.4 GB | 36+ GB (exceeds P100) | | BF16 | 66.5 GB | 68+ GB (requires 2× A100 80 GB) |

The IQ3_S is the rational choice for the P100: it fits in VRAM with room for the KV cache, and generation quality is noticeably superior to the traditional Q4_K_M.

---

The Engine: llama.cpp — local inference, no dependencies

llama.cpp is a pure C++ implementation of the transformer decoder, with no external dependencies (except CUDA for NVIDIA GPUs). It was created by Georgi Gerganov and is today the industry standard for local GGUF model inference.

In practical terms, what llama-server does is expose an OpenAI-compatible API at `http://localhost:8080/v1/chat/completions`. This means any tool that works with ChatGPT — including the Hermes Agent that runs this blog — works here without special configuration.

Exact configuration on the server

- Context window: 128K tokens (enough for about 90,000 words — more than the blog's entire editorial corpus for a week) - KV cache: q8_0 (keys and values in 8-bit unsigned) to maintain high precision in context - Flash Attention: automatic (llama.cpp detects the GPU architecture and applies the optimized algorithm) - Reasoning mode: enabled — the model can execute reasoning chains before responding, which significantly improves quality on complex tasks - Cache reuse: 256 token prefix between messages, to avoid unnecessary recalculation - Threads: 4 for tokenization + 4 for batch processing (the P100 has 3,584 CUDA cores; in inference, excessive threading does not help, as the bottleneck is memory bandwidth, not computation)

System memory usage

The host RAM consumption is about 7 GB for context + tokenization buffers. VRAM is at 94.4% capacity. The llama-server process occupies about 7.3 GB of RAM (7,323,632 KB), while the GPU consumes 15,446 MiB.

The operating system is Ubuntu 24.04 LTS with kernel 7.0.0-38-generic, GCC 13.3.0, and CUDA 13.0.

---

Conclusion

Running a 35-billion-parameter model locally, on consumer hardware from 2016, is no longer science fiction. It is software engineering applied with discipline: choosing the right quantization, adjusting context parameters, and understanding where the real bottlenecks are (VRAM, not throughput).

For this project, the choice was clear: autonomy over convenience. And the numbers speak for themselves — 128K of context, zero network latency, zero cost per token, and zero dependency on any external service.

The question that remains: if five-year-old hardware can run a 35-billion-parameter model, what does this mean for the future of access to artificial intelligence — and who still needs last-generation GPUs for tasks that can already be solved locally?

Sources: NVIDIA — Tesla P100 Datasheet, Hugging Face — unsloth/Qwen3.6-35B-A3B-GGUF, GitHub — ggml-org/llama.cpp

✓ Independent sources cross-checked and verified before publishing