Hardware for local inference
Consumer GPUs, single-board computers and NPUs — what fits, what it costs, and which spec is the one that actually binds.
Buying hardware to run a model locally is a question with a numerical answer, and almost every page written about it gives a taste-based one instead. The reason is that the two figures people want — what fits, and how fast it goes — are not published by anyone. Vendors publish VRAM, bus width, memory clock, board power and lane count. Those are inputs. Nobody publishes the output, because the output depends on a runtime, a quantization format, a context length and a build.
So these pages do the arithmetic in the open. Capacity comes out of the parameter count and the bits per weight, and the bits per weight comes out of a published file size rather than out of the name of the format. Speed is given as a ceiling implied by memory bandwidth, which is a real and useful number precisely because nothing can exceed it — and every page that derives one also gives the command that measures what your own machine actually does. Where a figure is a vendor’s and can change next quarter, it is dated and marked.
What Fits on an RTX 4090's 24GB, by the Numbers
The VRAM budget of a 24GB card worked out line by line: weights from published GGUF sizes, KV cache from the model's own layer and head counts, and what is left.
10 min read
Local LLMs on a 12GB RTX 3060, by the Numbers
The realistic model ceiling for 12GB, derived from published file sizes — and the partial-offload cliff that decides whether a configuration is usable or unusable.
10 min read
Buying a Used GPU for Local LLM Inference
What to check on a second-hand card when the workload is inference rather than gaming — and why the usual used-GPU advice checks the wrong things.
9 min read
Running Two Consumer GPUs Without NVLink for Local Inference
How layer-split inference works when the only path between two cards is the PCIe bus, and why that is enough for single-stream generation.
10 min read
PCIe Lane Bandwidth in a Multi-GPU Local Setup, Derived
What a x4 slot costs compared with a x16 one, derived from the PCIe generation bandwidth tables — for model loading, for layer-split generation, and for prompt processing.
9 min read
Sizing a Power Supply for a Local LLM GPU Rig
Wattage headroom derived from published board power, the ATX 3.0 transient excursion limits, and the rest of the system — with every input named.
9 min read
Running a GPU Headless for Local Inference
Why a GPU with no monitor attached fails to initialise or runs slowly, starting from the exact error strings, and what to change.
9 min read
Local LLM Inference on a Laptop's Mobile GPU
Why a mobile GPU with the same name as a desktop card performs differently, derived from the two specs that actually diverge: memory bandwidth and the power envelope.
9 min read
Running a Local LLM on an eGPU Over Thunderbolt
What the Thunderbolt link costs for local inference: a slower model load, and almost nothing once the weights are resident in the enclosure's card.
9 min read
Picking a GPU by VRAM per Dollar for Local Inference
A dollars-per-gigabyte figure computed from dated launch prices and published memory sizes, plus the second axis that the ratio hides.
9 min read
Local LLM Tokens per Second on a Raspberry Pi 5, Derived
A token-rate ceiling for the Pi 5 derived from its published memory speed and a small model's byte count, with the command to measure the real figure.
9 min read
Jetson Orin Nano Memory Budget for Local Models, Derived
Which models fit the module's shared 8GB, derived from NVIDIA's published specification — and why the operating system is inside the budget on this device.
9 min read
Running Inference on the RK3588's NPU
What the RK3588's 6 TOPS neural engine will and will not execute, and the conversion toolchain every model has to survive before it touches the NPU.
10 min read
Setting Up a Coral USB Accelerator for TFLite Inference
Runtime, compiler and Python library for the Edge TPU, ending with a compiled model running through the USB stick and a compiler log you can read.
10 min read
Running a Small Chat Model on a Raspberry Pi
Build llama.cpp on a Pi, run a sub-2B GGUF model, and get a real tokens-per-second figure from llama-bench rather than from somebody's screenshot.
10 min read
AI Accelerator HATs for the Raspberry Pi
What an M.2 or HAT accelerator takes off the Pi's CPU, what stays on it, and which of the boards can run a language model at all.
9 min read
Local Inference on an Orange Pi 5, by the Numbers
What model sizes fit each Orange Pi 5 memory configuration, derived from published specifications, and why the board's 6 TOPS figure is not the limit you will hit.
10 min read
Running Larger Local Models on a Jetson AGX Orin
The model-size ceiling for both AGX Orin memory configurations, derived from NVIDIA's published capacity and 204.8 GB/s bandwidth figures.
10 min read
Running Ollama on a Raspberry Pi
Install Ollama on a 64-bit Pi, move the model store off the SD card, size the swap file, and configure the daemon so it survives a long generation.
10 min read
What Storing Model Files Does to an SBC's SD Card Over Time
Where the writes come from when a single-board computer runs local models, how write amplification multiplies them, and why the fix is moving the model store rather than buying a bigger card.
9 min read
Quantizing a Model for TFLite
Convert a float model to a fully integer-quantized .tflite file with a representative dataset, then verify the result against the original's outputs before you ship it.
10 min read
ONNX Runtime Mobile, Start to First Inference
Convert an ONNX model to ORT format, add the runtime to an Android or iOS project, run one inference, and then cut the binary down with a reduced build.
10 min read
Model Size Limits for WebGPU Inference in the Browser, Derived
The three separate ceilings on a browser-hosted model — buffer limits, device memory and the download — derived from the WebGPU specification's own default values.
10 min read
WebLLM: Start to First Response in the Browser
Load a quantized model into the browser's GPU with WebLLM and stream a completion, with the download cost stated up front.
9 min read
Running Inference on a Ryzen AI NPU
What the XDNA NPU in a Ryzen AI part actually accepts, which toolchain reaches it, and which half of an LLM it speeds up.
9 min read
Running Inference on an Intel Core Ultra's NPU
The OpenVINO path to the Core Ultra NPU, the static-shape constraint that shapes everything you can run on it, and where the TOPS figure comes from.
9 min read
On-Device Inference on Qualcomm's Hexagon NPU
Why the Hexagon HTP backend refuses a floating-point model outright, what a conforming model looks like, and where Qualcomm's 45 TOPS figure comes from.
9 min read
Quantizing a Core ML Model for iOS
Palettize a Core ML model with coremltools to cut its on-device footprint, then verify the compressed model against the fp16 original before you ship it.
9 min read
Bundling a Quantized Model Inside a Mobile App
What a bundled model actually costs in app-bundle bytes, and which App Store and Google Play limits it runs into first.
10 min read
Quantizing a Model for ONNX Edge Deployment
Take an ONNX model through onnxruntime's quantization toolchain to an int8 model, with the size compared before and after and the saturation trap avoided.
10 min read
What Happens When a Browser Doesn't Support WebGPU
Diagnose a browser that silently dropped WebGPU and ran your model on WebAssembly instead, and decide what to do about it deliberately.
10 min read
Why NPUs Use So Much Less Power Than GPUs for On-Device Inference
What TOPS-per-watt can and cannot be derived from published figures, and why it is the wrong number for single-stream LLM decode anyway.
11 min read
Running Inference on Windows With DirectML
Get an ONNX model running on any DirectX 12 GPU in Windows through the DirectML execution provider, without a vendor SDK — and know what Microsoft has moved to instead.
9 min read
ExecuTorch for On-Device PyTorch Inference
Export a PyTorch model to a .pte file with ExecuTorch, lower it to a mobile backend, and run it — with the export step that actually fails explained.
10 min read
Other topics
- LLM fundamentals & architecture
- Tokens, tokenization & context windows
- Prompt engineering
- Reasoning models & test-time compute
- Multimodal AI: vision, audio, video
- RAG & retrieval
- Embeddings & vector search
- AI agents & tool use
- Structured output & function calling
- Fine-tuning & post-training
- Local inference errors, string by string
- Running local models day to day
- Testing code that calls an LLM
- Snapshot and property testing for model output
- Regression suites for prompts
- Eval gates in CI
- Flaky tests against a model
- Determinism and the cost of testing
- Contract and streaming tests
- Testing tool calls and retrieval
- Inference, serving & latency
- Rolling out a prompt change
- Testing AI systems in practice
- Forecasting a time series
- Machine learning on tabular data
- Geospatial data and models
- Understanding audio that is not speech
- Understanding video
- Core computer vision tasks
- Machine learning on graphs
- Point clouds and 3D
- Evaluation, benchmarks & LLM-as-judge
- Sensor and IoT data
- Logs and event streams
- Models over biological sequences
- Machine learning on molecules
- Embedding and searching code
- Extracting invoices and purchase orders
- Receipts, statements and tax forms
- Insurance policies and contracts
- Deeds, court filings and patents
- Extracting from medical records
- Observability & LLMOps
- CVs, certificates and identity documents
- Shipping, customs and technical documents
- Meetings, email, chat and filled-in forms
- Building an extraction pipeline
- Business, property and inspection documents
- Contract clauses and insurance claims
- Regulated and compliance documents
- Consumer, travel and closing documents
- Mapping one chat API onto another
- SDK and framework migrations
- Hallucination & failure modes
- Re-embedding and model deprecation
- Cutting over between providers
- Parity gaps, shims and legacy endpoints
- Moving between model versions
- Migrating vector stores and caches
- Mapping capabilities and parameters
- Migrating pipelines and agents
- Contracts, runbooks and rollback
- Auditing a codebase before a cutover
- Compliance and fine-tune migration
- LLM cost engineering
- Routing, cost tracking and multi-tenancy
- What a migration does to your prompts
- AI security & prompt injection
- Privacy, compliance & data residency
- AI governance, policy & society
- Building reliable AI applications
- AI hardware, GPUs & compute
- Open-weight models & local inference
- AI for developers & coding agents
- AI in industry: vertical playbooks
- AGI, superintelligence, alignment & the long future
- Machine learning foundations
- NLP fundamentals & classical tasks
- Data engineering for AI
- Synthetic data & dataset curation
- AI product design & UX
- Search, ranking & recommendation
- Enterprise adoption & change management
- AI careers, skills & teams
- Reading AI research
- AI in science & discovery
- Robotics & embodied AI
- AI economics, markets & business models
- AI myths, hype & media literacy
- Context engineering
- Shipping AI features: patterns & anti-patterns
- Build it: end-to-end AI tutorials
- Python for AI: hands-on recipes
- TypeScript, React and the web
- Frameworks and SDKs
- Errors and troubleshooting
- AI facts, numbers and statistics
- The history of AI
- The maths behind AI
- Architectures beyond the transformer
- Reinforcement learning
- Diffusion and generative media
- Speech, audio and voice engineering
- Benchmarks, one at a time
- AI search visibility
- Infrastructure and operations
- Databases and storage for AI
- Knowledge graphs and structured knowledge
- Classical ML in production
- Regulation, jurisdiction by jurisdiction
- Prompt recipes and pattern library
- AI for people who do not write code
- Writing, media and creative work
- Edge and on-device AI
- Interpretability and model internals
- Field notes
- OpenAI model behaviour
- Claude model behaviour
- Gemini model behaviour
- Llama model behaviour
- Mistral model behaviour
- Qwen model behaviour
- DeepSeek model behaviour
- Cohere model behaviour
- Grok model behaviour
- Small model behaviour
- Hybrid model architectures
- Token cost by language and script
- Transliteration, romanization and script handling
- Locale-correct output
- Multilingual generation quality
- Multilingual pipelines
- The EU AI Act, article by article
- AI under the GDPR and EU data law
- US AI regulation, state and sector
- International AI governance and standards
- AI litigation and enforcement
- Running AI workloads on AWS
- Running AI workloads on Google Cloud
- Running AI workloads on Azure
- AI at the edge: Workers, Vercel and Netlify
- Serving models on Kubernetes
- Operating AI infrastructure
- Quantization formats and what they cost
- llama.cpp, flag by flag
- Ollama and the desktop local-model runtimes
- Local models on Apple Silicon
- Running speech and embedding models locally
- Model files, adapters and conversion
- VRAM arithmetic for local models