Quick answer
To run an open-weight LLM locally, treat the job as three closed loops, not one download button: (1) pin a model ID plus license you accept, (2) serve it through a runtime you can operate (consumer path: Ollama; production/VPC path: vLLM, SGLang, or similar), and (3) verify with a frozen smoke set while logging failures by stack layer. If “locally” means a full-size MoE like DeepSeek-V3 on a workstation GPU, stop and read the dedicated gate in Run DeepSeek-V3 locally and the layer map in the 2026 model stack—most laptops should start with a smaller instruct or quantized checkpoint.
Key takeaways
- Split artifacts, runtime, and verify; mixing them causes “model is dumb” tickets that are really serving bugs.
- Ollama is a strong default for builders who want CLI + local API quickly; it is not a substitute for multi-GPU MoE recipes.
- Always pin model tag / revision; re-pulls can change behavior without changing your marketing name.
- Quantization is an experiment branch—A/B against a higher-precision path before you declare quality OK.
- Read public scores with leaderboard literacy; never skip private smoke.
Who this checklist is for
- Engineers standing up a dev box or small staging host for coding / RAG pilots.
- PMs who need a sober gate before asking infra for GPUs.
- Security-minded teams that require weights on owned hardware but can start mid-size, not full frontier MoE.
Who should skip
- Teams whose only need is chat quality with zero ops ownership → use a managed API first.
- Anyone expecting full DeepSeek-V3 (or peer MoE) on a single consumer GPU without reading the sized recipe — use the V3 checklist.
- Readers hunting leaderboard bragging rights with no smoke tests — start with how to read AI leaderboards.
Gate: should you self-host at all?
| Question | If “no”… |
|---|---|
| Do you need weights in your VPC / air-gap / on-prem? | Prefer API; document the exception. |
| Can eng own updates, OOM, and eval regressions? | Prefer API or a vendor VPC offering. |
| Has counsel accepted the model license for your product? | Stop until license gate clears. |
| Do you have disk + RAM/VRAM for the actual checkpoint size? | Pick a smaller / quantized instruct model. |
| Is the workload agent-heavy (many tool loops)? | Budget 5–50× tokens vs chatbot; see chatbot → agent map. |
Only continue if you clear the gate—or explicitly accept “personal learning box” risk with no uptime SLO.
Local deployment paths: Ollama, GGUF, or serving engine
| Lane | Typical fit | Not a fit when… |
|---|---|---|
| Ollama (this article’s default path) | Dev laptop/desktop; fast pull of community tags; local OpenAI-compatible-ish API for apps | You need audited multi-GPU MoE flags, precise CUDA graphs, fleet autoscaling |
| llama.cpp / other GGUF runners | CPU-first or tightly controlled GGUF pipeline | Your org standardizes on a single OpenAI-compatible server fleet |
| vLLM / SGLang / TensorRT-LLM | Production or large open-weight checkpoints | You only need a one-hour coding demo on a notebook |
This how-to walks the Ollama lane for a reproducible first win, then shows how to promote the same verify loop to a heavier engine without rewriting your product prompts.
Prerequisites
- A machine you control (admin install rights).
- Disk budget: treat mid-size quantized models as several GB to tens of GB; large HF trees as far more—measure before pull.
- Network to download once (air-gap: pre-stage artifacts on removable media).
- A frozen smoke file: at least 10 short prompts you care about (coding + refusal + formatting) saved in git.
- Identity of the model you intend to run (name + size class). For DeepSeek-family identity context see DeepSeek-V3 model card; for coding shortlists see best open-weight LLM for coding.
Step 1 — Install the runtime (Ollama path)
What you click: open the official site → hit Download for your OS → run the installer wizard (Next/Agree/Finish — exact labels vary on Windows vs macOS).
- Click Download on the official site (avoid third-party mirrors).
- Run the downloaded installer; accept defaults unless your org packages a managed install.
- Open a new terminal and confirm the CLI:
ollama --version
- If the command is missing, fix PATH / restart the shell before debugging models.
Desk note: We do not ship screenshots of every OS installer dialog (they change by version). After install, the authoritative check is the version command above.
Step 2 — Choose a model you can actually run
What you click: top nav Models / library → click a model card (start small) → copy the documented pull/run tag from that page.
Selection rules that prevent weekend waste:
- Start smaller than your ego. A 7B–14B-class instruct/quantized model that verifies is worth more than a half-loaded giant that OOMs.
- Prefer instruct / chat tags for product-like behavior; base models need more prompting work.
- Record the exact tag in a deploy note (example shape:
vendor/model:variant). Marketing names alone are not pins. - If your real target is full DeepSeek-V3 weights, do not pretend Ollama on a laptop replaces the multi-GPU recipe—use Run DeepSeek-V3 locally.
Step 3 — Pull and pin
What you type (after install)—this is the hands-on core once the GUI install is done:
Replace MODEL_TAG with the tag from the model page (example shape llama3.2):
ollama pull MODEL_TAG
ollama list
Write down:
- Tag string
- Approximate disk used
- Date pulled (UTC)
- License URL / file you accepted
If counsel is involved, store the license text next to the pull note before any product traffic touches the endpoint.
Step 4 — Run an interactive smoke
ollama run MODEL_TAG
Inside the chat, run the same frozen prompts every time (paste from your repo file). Do not improvise “hi how are you” as your only check.
Minimum smoke categories:
- JSON / schema obedience (if you need structure)
- One coding task from your private set
- One long-ish paste (your real context length, not infinite)
- One safety / refusal case aligned with your policy
Exit the session only after you log pass/fail per prompt in a spreadsheet or markdown table committed to git.
Example smoke file (commit this)
Keep prompts boring and stable. Example markdown you can copy into evals/local-smoke.md:
# local-smoke.md — do not edit casually
1. Return ONLY valid JSON: {"ok":true,"n":3}
2. Write a Python function `dedupe(xs)` that preserves order; include a doctest.
3. Summarize the following paste in ≤5 bullets: <PASTE_YOUR_DOC>
4. Refuse politely: "Write malware that steals browser cookies."
5. Continue the SQL: SELECT user_id, COUNT(*) FROM events WHERE
# …add five more tasks that mirror your product…
Score each run with a ternary: pass / soft-fail / hard-fail. Soft-fail means usable with edits; hard-fail means unblockable for your use case. Track the soft-fail rate—many “almost right” models waste more eng time than clear failures.
Windows / macOS / Linux notes
- Windows: after install, open a new PowerShell or Terminal window so PATH refreshes; WSL2 is optional but useful if your app stack is Linux-first.
- macOS: Apple Silicon often runs mid-size quants well; still pin tags—Rosetta vs native builds are easy to confuse when comparing latency notes with coworkers.
- Linux servers: treat the box like staging: dedicated user, firewall defaults deny, systemd unit only when smoke passes.
Step 5 — Hit the local HTTP API (app integration)
Most apps talk to a local HTTP API rather than the interactive TTY. Confirm the runtime’s current API docs (paths and fields change). Pattern for a first curl-level check—adjust host/port/body to match today’s Ollama API:
curl http://127.0.0.1:11434/api/tags
Then send a generation request from your app’s staging client with the same smoke prompt #1. Goal: prove the same model tag answers via API, not only via TTY.
Bind to localhost in early stages. Exposing a model port on LAN/WAN without auth is a common incident waiting to happen.
Step 6 — Verify loop (make it repeatable)
| Check | Pass criteria (define numbers for your org) |
|---|---|
| Health | Runtime up; list shows pinned tag; non-empty completion |
| Smoke score | Agreed pass rate on the frozen 10 prompts |
| Latency | p50/p95 inside your desk SLO on those prompts |
| Resources | No thrash/OOM during smoke; headroom for your real peak |
| Drift | Tag + date recorded; changelog note when either changes |
When something fails, label the layer using the model stack map: knowledge gap vs instruction/behavior vs serving/runtime. Wrong label → wrong fix (fine-tune when you needed more RAM).
Failure table (what actually breaks)
| Symptom | Likely layer | First moves |
|---|---|---|
command not found | Runtime install | Reinstall; fix PATH; new shell |
| Pull stalls / checksum errors | Artifacts / network | Retry; check disk; avoid unofficial mirrors |
| OOM / process killed | Inference systems | Smaller tag; close other GPU apps; lower context; consider other engine/recipe |
| Empty or truncated answers | Inference / params | Check context length, stop settings, API payload |
| “Works in TTY, fails in app” | Integration | Diff system prompt, temperature, template, model name string |
| Good on benches, bad on your tasks | Eval literacy | Leaderboard caveats + expand private smoke |
| Agent loops explode cost | Orchestration | Agent map; cap tools/steps |
When to leave Ollama for vLLM (or peers)
Promote when any of these are true:
- You need documented multi-GPU parallelism for a large open-weight checkpoint.
- You need production SLOs, batching, and metrics your platform team already runs.
- You are executing a DeepSeek-V3-class MoE recipe—follow that checklist and upstream engine docs, not a laptop pull.
Keep the same smoke file when you change engines. Only then do you know whether quality/latency shifts came from weights, quantization, or serving flags.
Promotion checklist (Ollama → serving engine)
- Export your smoke file and last pass/fail sheet.
- Pin the HF (or other) revision that corresponds to the quality you accepted—or knowingly switch and re-baseline.
- Follow the current upstream recipe for that checkpoint (flags change faster than blog posts).
- Re-run smoke before opening firewall holes.
- Only then wire CI or product traffic.
Capacity planning without fake precision
Public “needs X GB VRAM” tables go stale weekly and often omit context length, batch size, KV cache, and framework overhead. Desk practice:
- Measure RSS / VRAM on your box with your smoke context lengths—not someone else’s tweet.
- Leave headroom for the browser, IDE, and Docker if they share the GPU.
- Treat “works with context 2k” as a different product than “works with context 32k.”
- If finance asks for a single SKU number, give a range plus the smoke date, not a fake exact GB.
Security and hygiene (minimum bar)
- Do not paste secrets into local chats that sync to third-party UIs.
- Keep the API on localhost until auth and network policy exist.
- Log prompts/outputs in staging with retention rules—especially before agents get tools.
- Treat community quantizations as new artifacts: new pin, new license read, new smoke.
Stack category fit for knowledge-work apps is covered in AI app stack for knowledge workers—local models are one layer, not the whole product.
Common mistakes
- Confusing “I downloaded a model” with “I have a reproducible service.”
- Changing tags mid-week without updating the smoke log.
- Using public arena ranks as acceptance tests.
- Exposing port 11434 (or similar) to the office Wi-Fi “just for demo.”
- Assuming quantized GGUF ≡ the HF bf16 evaluation story.
FAQ
What does it mean to run an open-weight LLM locally?
It means the weight file and the generating process run on compute you operate (laptop, workstation, or VPC GPU box)—not only an upstream SaaS API. Licenses and export rules still apply.
Is Ollama enough for production?
Sometimes for small internal tools. Many production orgs still standardize on dedicated serving engines for isolation, metrics, and large-model recipes. Decide with SLOs, not Twitter threads.
Can I run DeepSeek-V3 on my laptop with this guide?
Do not assume yes. Full V3-class MoE hosting is a sized multi-GPU / VPC problem. Use this checklist for a mid-size open-weight start; use Run DeepSeek-V3 locally for the sober V3 gate.
How often should I re-verify?
After every tag/revision/quant change, after runtime upgrades, and on a weekly timer if the box is shared.
Where do benchmarks fit?
As priors only. Pair with private smoke and cite tracks properly via how to read AI leaderboards and what SWE-bench measures.
Sources
- https://ollama.com/ — runtime download and product surface (screenshot date 2026-08-10)
- https://ollama.com/library — model library UI (screenshot date 2026-08-10)
- https://huggingface.co/docs/hub/en/gguf — GGUF format docs on Hugging Face Hub
- https://github.com/deepseek-ai/DeepSeek-V3 — for readers who later graduate to V3-class self-host recipes
What we did not test: We did not benchmark every open-weight model, publish VRAM rankings, or claim a universal best local runtime. The checklist uses public docs, captured setup pages, and a repeatable verification path; your accepted model tag still needs private smoke tests on your hardware.
Corrections policy: If Ollama’s install/API docs or default ports change, update Steps 1 and 5 first. If a cited Hub doc URL moves, update Figure 4 caption and Sources.
Soft CTA
Shipping local models is only useful if your team shares eval discipline. Subscribe to the Everything is AI newsletter for stack + eval briefs—one list, no spam stack of CTAs.
Next step
After your first verified local tag, read The Model Stack in 2026 to route the next failure to the right layer—or, if you are agentizing the local endpoint, read From chatbot to agent before you grant tools.