Tool

Benchmark local LLMs with reproducible GPU diagnostics

Picchio is a single-file, stdlib-only tool that tells you whether your local LLM is actually running on the GPU or has fallen back to CPU.

Works with ollamallama.cpphuggingface

91
Spark score
out of 100
Updated 27 days ago
Source checked Sep 10, 2026
Version 1.0.0
Models
llama 3qwen 2 5

Add to Favorites

Why it matters

Verify that your local LLM deployment is actually using the GPU and performing at expected speeds by measuring prefill, decode, and wallclock times across multiple passes, then producing a reproducible verdict that explains whether the GPU did the work and why.

Outcomes

What it gets done

01

Detect silent CPU fallback by comparing engine logs against OS-level GPU telemetry

02

Measure quantization accuracy by reading actual bits-per-weight from GGUF files

03

Split prefill and decode performance to catch partial GPU offload issues

04

Monitor running LLM servers and flag performance degradation in real-time

Source

Get it from source

Spark does not host a copy of it.

Open source

Reports

Agent outcome reports

No reports yet

Overview

Picchio

Picchio is a single-file, dependency-free Python tool that checks whether a local LLM is actually running on the GPU or has fallen back to the CPU. It reports per-layer GPU placement, prefill/decode/wall-clock speeds, and power or energy per token, across llama.cpp, Ollama, macOS, NVIDIA, and AMD. Use it when a local model feels too slow and you need to know if it's CPU fallback, partial offload, or a real bottleneck, or before downloading a model to check it fits your memory and context length. Not a model-quality benchmark - it only measures GPU placement and throughput.

What it does

Picchio is a single-file, stdlib-only Python tool that tells you whether a local LLM is actually running on the GPU, or has silently fallen back to the CPU. Run with no arguments, it discovers Ollama tags, local GGUF files, and models cached by Hugging Face or LM Studio, picks one, and runs three measurement passes; you can also point it directly at a model file, an Ollama tag, or a running llama-server URL. In the project's own demo, it catches a 66-layer model with 28 layers stuck on the CPU and reports the resulting 14x decode slowdown.

When to use - and when NOT to

Use it when a local model feels slower than it should and you need to know whether that's CPU fallback, partial GPU offload, or just a genuinely slow setup - or before downloading a model at all, to check whether it fits in your machine's memory at your intended context length and KV cache type. picchio guard watches something already running - your own command, a loaded model, or a server - and tells you the moment it leaves the GPU; picchio compare diffs two runs and names the first setting that changed between them. It is not a benchmarking suite for comparing model quality or accuracy - it only measures GPU placement, throughput, and power or energy per token.

Inputs and outputs

./picchio MODEL                              # catch CPU fallback and measure the run
./picchio plan MODEL --ctx 262144 --kv q8_0  # check whether it fits at this context and KV type

Output includes the exact number of model layers placed on the GPU, separate prefill, decode, and wall-clock speeds, GPU activity, memory, power, and energy per generated token, and a HEALTHY, CPU FALLBACK, or PARTIAL OFFLOAD verdict. --share bug-report turns one run into a paste-ready GitHub Issue for the Ollama or llama.cpp trackers, and --json gives machine-readable output for scripting.

Integrations

It reads per-layer placement and timing from llama.cpp, the CPU/GPU weight split from Ollama, Apple GPU activity and power on macOS, NVIDIA GPU stats on Linux and Windows through NVML, and AMD GPU activity through amdgpu sysfs on Linux. Install is one line, with no package manager involved:

curl -fsSL https://raw.githubusercontent.com/logxio/picchio/main/public/picchio.pyz -o picchio

Results from any machine can be submitted to a public comparison page (--share row), which already lists measured prefill, decode, and wall-clock numbers across Apple M5, RTX 4090/5090/4070 SUPER, and CPU-forced runs. It requires Python 3.9+, runs on macOS, Linux, and Windows, and is MIT-licensed.

Who it's for

Anyone running local LLMs through llama.cpp, Ollama, or LM Studio who wants a fast, dependency-free way to confirm the model is actually using the GPU, size a model before downloading it, or get an accurate bug report when it isn't behaving.

Source README
pixel woodpecker on a trunk

See whether your local LLM is actually using the GPU

selftest license: MIT python 3.9+, stdlib only

Run it · Browse results · Add your machine

Qwen3.8-27B completes while Picchio catches 28 of 66 layers running on the CPU and a 14 times decode slowdown

Run it

curl -fsSL https://raw.githubusercontent.com/logxio/picchio/main/public/picchio.pyz -o picchio
chmod +x picchio
./picchio

On Windows, in PowerShell:

curl.exe -fsSL https://raw.githubusercontent.com/logxio/picchio/main/public/picchio.pyz -o picchio.pyz
python picchio.pyz

With no arguments, Picchio finds Ollama tags, local GGUF files and models in
the Hugging Face and LM Studio caches. Pick one and it runs three passes.

You can also point it straight at a model or a running server:

./picchio model.gguf
./picchio qwen3.5:9b
./picchio http://127.0.0.1:8080

It runs on macOS, Linux and Windows with Python 3.9+. The download is one
file and uses only the standard library.

Use the result

I want to… Run
catch CPU fallback and measure the run ./picchio MODEL
know whether a model fits here before I download it ./picchio plan https://huggingface.co/.../model-Q4_K_M.gguf · ./picchio plan qwen3.5:9b
check that fit at my own context and KV type ./picchio plan MODEL --ctx 262144 --kv q8_0
guard something already running and get told the moment it leaves the GPU: your own command, a loaded model, a server ./picchio guard -- COMMAND · ./picchio guard ollama · ./picchio guard http://127.0.0.1:8080
compare two runs and show the first changed setting ./picchio compare before.txt after.txt
turn one run into a complete Ollama or llama.cpp Issue report ./picchio MODEL --share bug-report

Add --json when you want machine-readable output.
Add --ctx 262144 when the problem only appears at a larger context.

The fit check answers before the download, from the file header and the
registry manifest, and it answers in one word and one move. In the
browser: will it fit?

FITS. The whole model fits in this machine's memory.
  5.3 GiB to download

What it gives you

  • the exact number of model layers on the GPU
  • separate prefill, decode and wall-clock speeds
  • GPU activity, memory, power and energy per generated token
  • the first setting that changed when you compare two runs
  • a clear HEALTHY, CPU FALLBACK or PARTIAL OFFLOAD result
  • a paste-ready GitHub Issue with your machine, model, GPU placement and measured rates

Compare machines

I measured these with Picchio:

machine model and engine placement prefill decode wall-clock
Apple M5 Qwen3.5-9B, llama.cpp Metal 33/33 588.0 21.1 15.5
Apple M5 same file, forced CPU 0/33 26.8 12.2 3.0
RTX 4090 same file, llama.cpp CUDA 33/33 6763.3 138.0 25.2
RTX 5090 same file, llama.cpp CUDA 33/33 9135.9 226.4 57.3
RTX 5090 same file, llama.cpp Vulkan 33/33 6206.3 198.4 51.0
RTX 5090 qwen3.5:9b, Ollama 100% GPU 8614.7 193.5 153.9
RTX 4070 SUPER same file, llama.cpp CUDA 33/33 4187.8 78.2 28.9
your machine

Open every result or compare the outputs
in examples/.

What Picchio reads

  • llama.cpp: per-layer placement, applied sampling settings and timing
  • Ollama: CPU/GPU weight split and timing
  • macOS: Apple GPU activity, memory, power and energy per token
  • NVIDIA on Linux and Windows: GPU activity, memory, power and energy per token through NVML
  • AMD on Linux: GPU activity and memory through amdgpu sysfs

Point Picchio at a GGUF path, an Ollama tag or a running llama-server URL.
The result tells you where the model ran and which number is safe to compare.

Send me your machine

./picchio MODEL --share row > result.md 2> picchio.txt

Add your result.
If Picchio calls your run wrong, send me that one first.

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.