LLMsAICPURAMGPUDemocratization

Running LLMs on CPU RAM: Ending the GPU Tax

Explore a revolutionary shift in how Large Language Models operate. This post delves into recent advancements that enable LLMs to run efficiently on standard CPU RAM, potentially eliminating the high cost associated with GPU reliance. Discover how this innovation could democratize AI, making

·19 min read
blog cover image
Table of Contents

RAM-first inference removes the GPU tax for many workloads, but only if you design around bandwidth, latency, and context growth.

01 THE PROBLEM

Running LLMs on RAM is the operating pattern where model weights live primarily in system memory instead of GPU VRAM, and inference is executed on CPU or with partial offload to a smaller GPU.

The failure mode is simple: teams assume “fits in RAM” means “runs well enough in production.” It does not. The model loads. The demo works. Then prompt ingestion stalls, first-token latency spikes, throughput collapses under concurrency, and the economics turn ugly within a sprint.

This gap matters right now because the cost delta is material. A single high-end inference GPU can cost more than an entire CPU server with 128–256 GB RAM, and scarce GPU capacity still distorts roadmaps. For a Series A–C startup trying to ship internal copilots, support agents, document QA, or retrieval-heavy workflows this quarter, the choice is not abstract. It is budget, lead time, and whether the team can deploy useful AI features without waiting on GPU procurement.

The hard truth is that the “GPU tax” is real, but so is the “RAM tax.” GPU-first teams overpay in capital or cloud spend. RAM-first teams underprice latency, context growth, and operational complexity. The teams that win do not ask, “Can we run this on CPU?” They ask, “Which parts of this workload are bandwidth-bound, context-bound, and user-visible?”

That distinction determines whether RAM-first inference is a pragmatic architecture or a self-inflicted outage.

02 WHY IT HAPPENS

The root cause is not that CPUs are bad at AI. The root cause is that transformer inference is a memory movement problem before it becomes a raw compute problem.

For most modern decoder-only LLMs, every generated token requires repeatedly reading model weights and updating the KV cache. GPUs dominate because they offer extreme memory bandwidth. An NVIDIA H100 has bandwidth measured in terabytes per second. A typical dual-channel DDR5 workstation delivers bandwidth measured in tens of gigabytes per second. Even strong server-class DDR5 or LPDDR systems are still operating in a different class.

That gap changes everything.

If your model is 7B parameters quantized to 4 bits, the weight footprint may be only a few gigabytes. That sounds friendly to RAM. But inference still means traversing those weights token after token. The limiting factor is often not storage capacity. It is how fast the system can repeatedly move those bytes through the memory hierarchy.

This is why teams get misled by model-card sizes and disk download sizes. Runtime is dominated by:

  • model weights in active memory
  • KV cache growth with context length
  • memory bandwidth
  • prompt processing cost, not just generation cost
  • concurrency contention across threads and requests

The KV cache is where many implementations fall apart. Context length does not just increase latency a bit. It creates a second memory bill that grows with sequence length, layer count, hidden size, and number of concurrent sessions. Consumer setups that feel fine at 4K context often degrade badly at 32K. That is the pattern described repeatedly by local inference practitioners using llama.cpp and Ollama: prompt ingestion is the hidden bill, and CPU/RAM setups pay it first.

The structure of most startup workloads makes this worse. They are not purely chat. They are chat plus retrieval, tool calls, PDFs, logs, long support tickets, code files, or CRM records. That means large prompts and repetitive context replay. Once you move from “answer a 200-token prompt” to “digest 40 pages and maintain state,” RAM-only deployments stop being cheap in practice unless you aggressively shape the workload.

There is also an incentive misalignment at the vendor layer. Cloud providers and model APIs sell the convenience of abstraction; hardware vendors sell benchmark narratives around peak throughput; developer tools often optimize for first-run simplicity. None of these incentives force teams to think about first-token latency at p95, prompt-token throughput, or the marginal memory cost per active session.

Cloudflare’s public writing on inference at the edge is useful here because it emphasizes deployment constraints rather than benchmark theater. Edge environments force ruthless choices around model size, placement, and latency budgets. The same logic applies on-prem or in startup infra: if the environment is constrained, architecture matters more than nominal model capability.

The strategic shift is not “CPU replaces GPU.” It is that quantization, better CPU kernels, and smarter serving stacks have made RAM-first inference viable for a larger class of workloads than most teams realized two years ago.

Viable is not the same as free.

03 WHAT MOST GET WRONG

The most common mistake is treating RAM as a cheaper VRAM substitute.

It is not. RAM changes the economics and the performance envelope. If you do not redesign around that, you get the worst of both worlds: lower throughput than a GPU system and more engineering complexity than an API call.

Misdiagnosis #1: “If the model fits in memory, we’re done.”

This is the consumer hardware fallacy. Teams download a quantized 7B or 14B model, see it answer questions on a laptop, and infer that production deployment is now solved. What they have validated is functional correctness, not service quality. They have not tested:

  • prompt ingestion speed at realistic context lengths
  • p95 first-token latency
  • throughput under 5–20 concurrent sessions
  • degradation under retrieval-heavy prompts
  • memory fragmentation and model reload behavior
  • tail latency when the CPU is shared with other services

Misdiagnosis #2: “We can just spill what doesn’t fit to CPU memory.”

This is the inverse GPU fallacy. Teams put part of the model or KV cache on the GPU, let overflow spill to system RAM, and assume the slowdown will be tolerable. In practice, once active inference starts bouncing across the PCIe bus, performance can collapse. This is exactly the pattern local LLM operators report when context pressure exceeds VRAM budgets: token rates can fall from tens of tokens per second to low single digits because the architecture is now waiting on memory movement, not doing useful generation.

Misdiagnosis #3: “Bigger context windows solve product limitations.”

They often mask product design laziness. If your assistant needs to replay entire histories or stuff full documents into every call, your architecture is compensating for weak retrieval, weak state management, or a missing summarization layer. On RAM-first systems, that laziness becomes expensive immediately.

Misdiagnosis #4: “CPU-only is for hobbyists.”

That was more true in 2023 than it is now. It is no longer accurate. A well-quantized 7B model on a modern desktop CPU or reasonably provisioned server can be perfectly adequate for:

  • background classification
  • internal semantic search with short answers
  • low-QPS support triage
  • batch extraction
  • agentic workflows where model latency is hidden behind I/O
  • code review summaries and post-processing tasks

The teams dismissing CPU inference entirely often have not broken down their own workload shape. They assume every AI feature is interactive chat with strict sub-second UX requirements. Most are not.

Misdiagnosis #5: “Use the largest model we can squeeze in.”

This is a classic engineering prestige trap. The result is often lower quality at the system level because users prefer a smaller model that starts quickly and finishes reliably over a larger model that stalls, times out, or forces aggressive queueing.

Stripe has written repeatedly about reliability and simplifying system behavior in production engineering. The lesson carries here: systems that are theoretically more capable but operationally brittle create a worse product. LLM serving should be evaluated by user-visible reliability and throughput, not just benchmark quality.

A useful adjacent cautionary example comes from Netflix’s engineering culture: optimize for the production bottleneck you actually have, not the one that is easiest to talk about. In recommender systems, data movement and service architecture matter as much as model quality. LLM inference has reached the same point. The bottleneck is often not “intelligence.” It is memory, context, and tail latency.

04 THE FRAMEWORK

The approach that works is to treat RAM-first inference as a workload-partitioning problem, not a model-hosting trick.

Here is the framework.

1. Start with workload classes, not hardware shopping

Do not begin by asking whether to buy GPUs. Start by classifying every AI feature you plan to support in the next two quarters.

Use four buckets:

  1. Interactive, user-facing, low-latency
- Examples: chat UX, copilot autocomplete, incident assistant in the critical path - Budget: p95 first token under 1.5–2.5 seconds for most business apps - Default: GPU or high-performance API
  1. Interactive, moderate-latency
- Examples: support draft replies, internal document Q&A, analyst copilots - Budget: p95 first token under 3–5 seconds - Candidate: RAM-first if prompts are bounded and QPS is low
  1. Background, asynchronous
- Examples: extraction, labeling, summarization, enrichment, classification - Budget: seconds to minutes - Strong candidate: CPU/RAM-first
  1. Burst batch workloads
- Examples: nightly backfills, migration passes, large-scale indexing - Budget: throughput and cost dominate - Candidate: mixed approach, often CPU fleet plus limited GPU burst capacity

Most teams discover 50–80% of proposed AI tasks do not require GPU-grade interactivity. That is where the GPU tax is optional.

2. Measure prompt tokens separately from generation tokens

This is the metric mistake that keeps showing up.

A model that generates 15 tokens/sec on CPU can still feel awful if it only ingests prompts at a few hundred tokens/sec and every request includes 20K tokens of context. Users perceive total latency, not generation speed.

Track at least these metrics:

  • prompt tokens/sec
  • generation tokens/sec
  • first-token latency, p50/p95
  • end-to-end latency, p50/p95
  • RAM used per loaded model
  • KV cache memory per active session
  • requests per minute at target SLO
  • cost per 1M prompt tokens and cost per 1M generated tokens on your own infra

The SRE framing from Google’s SRE book applies directly: define SLOs around what users actually feel. For LLM systems, that is usually first-token latency and completion success rate, not average tokens/sec.

A concrete threshold: if p95 first-token latency exceeds 5 seconds for a user-facing internal tool, adoption usually drops unless the task is high-value and users expect waiting. For support tooling or code review assistance, 2–3 seconds feels materially better. You do not need a named published standard for that; it is a practitioner observation that shows up quickly in pilot rollouts.

3. Quantize aggressively, but benchmark quality on your own tasks

Quantization is the practical reason RAM-first inference works at all.

Running 4-bit GGUF or equivalent quantized variants in llama.cpp-class runtimes can shrink memory requirements dramatically. A 7B model in 4-bit form may require only a few gigabytes for weights, while larger 13B or 14B class models remain feasible on machines with 32–64 GB RAM. But every quantization choice is a quality trade.

The right move is not “always pick Q4.” The right move is:

  • pick 2–3 candidate models
  • test Q4, Q5, and if needed Q6 variants
  • run them on your real prompts
  • compare answer quality and total latency
  • decide where quality drops enough to matter

Do not evaluate this with generic benchmarks alone. A 10-point MMLU difference is less important than whether the model can consistently extract entities from your support tickets or draft usable SQL against your schema.

GitHub’s engineering and product writing around Copilot has repeatedly emphasized task-specific usefulness over abstract model capability. That lens matters here. A slightly weaker model that returns in 1.8 seconds and fits your budget often creates a better product than a stronger model that takes 9 seconds and forces queueing.

4. Design for bounded context, or RAM will punish you

Context is the silent cost center.

If you want RAM-first systems to behave, you must constrain prompt size through architecture:

  • retrieval over full stuffing
  • chunking with relevance thresholds
  • rolling summaries for conversation memory
  • state extraction into structured slots
  • tool outputs filtered to minimal payloads
  • precomputed embeddings and document indexes
  • prompt templates that cap historical replay

This is where product and infra meet. If your team says, “Let’s just send the entire document,” what they are really saying is, “We are willing to spend memory bandwidth instead of fixing retrieval quality.” On CPU-serving, that trade becomes visibly expensive.

Notion and Linear both built product reputations on speed and tight interaction design. The lesson is relevant even if their public writing is not about local LLM hosting: constrained interfaces outperform bloated ones because they reduce work at every layer. LLM systems need the same discipline. Smaller prompts are not just a compute optimization. They are a product quality decision.

A practical threshold: if average prompt length crosses 8K–16K tokens for a workflow you hope to run on CPU, stop and redesign the prompt path first. That range is where many otherwise viable RAM-first deployments begin to degrade sharply in user-visible ways, especially under concurrency.

5. Separate “single-user fast enough” from “multi-user production”

This is where pilots lie.

A staff engineer tests a quantized 8B model on a desktop with 64 GB RAM. It feels good. Then ten users hit the shared service Monday morning, each with long prompts, and latency triples.

Capacity planning for RAM-first systems should assume:

  • loaded weights are mostly shared
  • KV cache is per active request/session
  • long contexts consume disproportionate memory
  • CPU contention raises tail latency quickly
  • NUMA behavior on multi-socket systems can surprise you
  • background processes steal the exact resource your model needs most: memory bandwidth

Test at realistic concurrency.

As a first-pass operating rule:

  • if you need more than 5–10 concurrent interactive users per host with medium contexts, CPU-only inference becomes fragile fast
  • if you need more than 20–30 concurrent active sessions, a small GPU tier or API fallback usually becomes simpler than heroic CPU tuning

Those are not universal constants. They are useful tripwires. If your design is heading there, re-evaluate before you commit.

6. Use hybrid placement instead of ideological purity

The smartest architecture is often mixed:

  • CPU/RAM for background jobs and cheap steady-state tasks
  • one modest GPU for latency-sensitive paths
  • API fallback for spikes or premium use cases

This removes most of the GPU tax without imposing CPU latency on every workflow.

Cloudflare’s edge inference posture offers a useful mental model: put the right model in the right place according to latency and resource constraints, not ideology. The same principle works inside a startup stack.

A pragmatic deployment pattern looks like this:

  • Tier A: local/API large model for premium reasoning or high-stakes tasks
  • Tier B: self-hosted RAM-first 7B–14B model for internal tools and asynchronous workloads
  • Tier C: tiny classifier or rules engine for routing, guardrails, and low-value tasks

That architecture usually outperforms “one model to rule them all.”

7. Choose runtimes that expose the bottlenecks

Tooling matters because the wrong abstraction hides the failure mode.

Today’s practical options include:

  • llama.cpp for highly optimized CPU and mixed CPU/GPU local inference
  • Ollama for simpler packaging and developer ergonomics
  • vLLM primarily for GPU-serving, less useful if your goal is true CPU-first deployment
  • Text Generation Inference if you are standardizing on Hugging Face-style serving and have the hardware
  • MLX on Apple Silicon, which is relevant if your team is standardizing around M-series machines for local development
  • Open WebUI or lightweight internal frontends for controlled rollout

For RAM-first production pilots, llama.cpp remains the important reference point because it makes memory and threading behavior visible and tunable. Simpler wrappers are fine for developer adoption, but they can obscure the exact settings driving tail latency.

HashiCorp’s broader operator philosophy is relevant here even outside ML: choose tools that make system behavior legible. If your runtime hides thread affinity, mmap behavior, KV cache settings, and offload choices, you lose the ability to reason about production performance.

8. Benchmark economics per workload, not per machine

The argument for RAM-first inference is economic. So make the math explicit.

Compare three numbers for each workload:

  1. API cost at current usage
  2. GPU-hosted self-serve cost
  3. CPU/RAM-hosted self-serve cost

Include:

  • hardware amortization over 24–36 months
  • engineer setup and maintenance time
  • power and hosting if on-prem
  • queueing and user time cost for slower interactions
  • reliability overhead and incident burden

For asynchronous extraction, CPU/RAM often wins easily.

For user-facing copilots, slower latency may erase the savings because people stop using the feature or retry excessively.

DORA’s framing on throughput and stability is useful here. A cheaper system that causes more user-facing failures or operational toil is not actually higher-performing. Cost must be evaluated together with adoption and reliability.

9. Put hard guardrails on context and session lifetime

This is the policy layer most teams skip until costs explode.

Implement:

  • max prompt token limits by endpoint
  • automatic summarization after N turns
  • idle session eviction
  • retrieval caps per query
  • separate quotas for premium long-context jobs
  • observability for top 10 prompts by memory and latency cost

Without these controls, one enthusiastic user with a 200-page PDF and a “just paste it in” habit can degrade service for everyone.

PostHog’s product engineering style is instructive here: expose real usage and cost data early so teams can make sane decisions. LLM systems need the same transparency. If users and PMs cannot see that one workflow is 20x more expensive than another, they will optimize for convenience and the platform team will pay for it.

10. Decide what quarter you are in

This is the leadership question.

If your company is in:

  • exploration quarter: optimize for speed of learning; APIs and small local models are fine
  • cost-control quarter: move asynchronous and internal AI tasks to RAM-first where quality holds
  • productization quarter: reserve GPU/API budget for user-facing paths with strict SLOs
  • scale quarter: invest in routing, workload segmentation, and observability before buying more hardware

CTOs get into trouble when they apply one quarter’s architecture to the next quarter’s constraints.

05 STRATEGIC TAKEAWAY

RAM-first inference is a cost-control and autonomy strategy, not a universal serving strategy. If you apply it selectively, you can remove a meaningful portion of GPU spend this quarter, keep sensitive data on infrastructure you control, and stop blocking internal AI features on accelerator access. If you apply it indiscriminately, you will ship slow products, misread pilot success, and spend the next 90 days debugging context-induced latency instead of improving the product. The CTO decision is not “CPU or GPU.” It is whether you have the discipline to segment workloads, cap context, and hold user-facing paths to explicit latency SLOs.

06 IMPLEMENTATION ANGLE

The practical rollout is straightforward.

Start with one internal, asynchronous workflow that currently uses a paid model API: ticket summarization, call note extraction, CRM enrichment, or document classification. Stand up a single RAM-first service using llama.cpp or Ollama on a 64–128 GB machine, quantize two candidate models, and benchmark on 500–1,000 real samples. Measure task accuracy, prompt tokens/sec, generation tokens/sec, and p95 latency. If the service clears your acceptance bar at less than half the API cost, keep it.

Next, add guardrails before adding users. Set endpoint-specific token caps, log prompt sizes, and create a simple dashboard showing p50/p95 first-token latency, memory use, and top expensive prompts. This is the moment most teams skip, then regret. If you cannot see which workflows are bloating context, you cannot keep RAM-first systems healthy.

If your engineering org is scaling quickly, this is also where a platform-minded team helps. The companies that operationalize AI features well treat model serving like any other shared infra surface: observability, quotas, rollout discipline, and clear ownership. Amplify can help engineering teams scale that operating model, but only after you decide which workloads deserve the complexity of self-hosting.

07 FAQ

Q: Can you run large language models entirely on RAM without a GPU? A: Yes. Tools like llama.cpp and Ollama can run quantized LLMs entirely from system RAM on CPUs, and this is now practical for 7B to 14B-class models on machines with 32–64 GB RAM. The tradeoff is speed: prompt processing and generation are much slower than on modern GPUs because system RAM bandwidth is far lower than GPU VRAM bandwidth. Q: Is running LLMs on RAM cheaper than using GPUs? A: For asynchronous and low-concurrency workloads, yes. A CPU server with 64–256 GB RAM is often materially cheaper than provisioning a dedicated inference GPU, especially when GPU cloud pricing or procurement delays are high. It is not cheaper if slow first-token latency reduces adoption or forces retries on user-facing features, because then the operational cost shifts from hardware to product friction. Q: What is the biggest performance problem when running LLMs on CPU and RAM? A: Memory bandwidth is the main bottleneck. Transformer inference repeatedly reads model weights and updates the KV cache, and CPUs with DDR memory cannot match GPU-class bandwidth. In practice, long prompts often hurt more than token generation because prompt ingestion and KV cache growth drive large latency increases. Q: Which workloads are best for RAM-first LLM inference? A: Background summarization, extraction, classification, document enrichment, and low-QPS internal tools are the best fit. These workloads tolerate seconds of latency and benefit most from lower infrastructure cost and data locality. User-facing chat, autocomplete, and high-concurrency copilots usually still need a GPU or an external API to hit reliable latency targets. Q: How much RAM do you need to run a local LLM well? A: A quantized 7B model can run on systems with 16–32 GB RAM, but 32–64 GB is a more practical floor if you want stable performance and room for context. Once you move to larger models, multiple loaded models, or longer contexts, 64–128 GB becomes the more realistic operating range. The hidden requirement is not just model size; it is model size plus KV cache plus concurrency headroom.

Enjoyed this article?

Share it with your network

LatAm Engineering Insights

Stay ahead of the curve

Weekly insights on hiring LatAm developers, salary trends, tech stack analysis, and exclusive job opportunities.

No spam, unsubscribe anytime. We respect your privacy.

Salary Insights

Real market data on LatAm developer salaries

Hiring Tips

Best practices for remote LatAm teams

Exclusive Roles

Early access to new job opportunities

Join 2,500+ CTOs, Engineering Managers, and Developers