{"id":1109,"date":"2026-10-26T09:30:00","date_gmt":"2026-10-25T22:30:00","guid":{"rendered":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/"},"modified":"2026-11-03T20:53:10","modified_gmt":"2026-11-03T09:53:10","slug":"private-ai-lab-lessons-and-whats-next","status":"publish","type":"post","link":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/","title":{"rendered":"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11)"},"content":{"rendered":"\n<p class=\"has-pale-cyan-blue-background-color has-background wp-block-paragraph\">The last post in the series: what our private AI lab set out to prove, the platform we ended up with, ten lessons that started as real failures, where one local server falls short, and a checklist for planning your own.<\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<p class=\"wp-block-paragraph\"><strong>Where this fits \u00b7 Running Local AI in Production \u00b7 Part 11 of 11<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:17px\">You are reading Part 11 of 11 in a series where we built a private AI server in our lab and ran realistic test workloads on it for seven weeks. Each part stands on its own. The previous part covered document, email and knowledge-base workflows that keep data on the server; this one covers the lessons from seven weeks, the honest limits and what comes next.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:16px\"><a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-business-workflows\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u2190 Part 10: Can AI Automate Business Workflows Without Sending Data Out?<\/a> &nbsp;\u00b7&nbsp; <a href=\"https:\/\/catharsis.net.au\/blog\/running-local-ai-in-production-series-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Series guide<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:16px\">Just want it working? Follow the <a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-litellm-setup-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">step-by-step setup guide<\/a>: local AI with Ollama and LiteLLM, from a bare server to a secure gateway.<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>See all 11 parts of the series<\/summary>\n\n<ol class=\"wp-block-list\">\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/why-run-ai-on-your-own-hardware\/\" target=\"_blank\" rel=\"noreferrer noopener\">Local AI or Cloud AI? Why We Built a Private AI Server<\/a>: why we built the lab on our own hardware, what ran on it and what that choice cost<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/llm-gateway-one-door-for-every-model\/\" target=\"_blank\" rel=\"noreferrer noopener\">How Do You Control Access to Local AI Models? Use a Gateway<\/a>: one LLM gateway as the only way to reach a model: keys, budgets and tracing<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-server-freezes-unified-memory\/\" target=\"_blank\" rel=\"noreferrer noopener\">Why Does a Local AI Server Freeze? Sizing Memory for LLMs<\/a>: five hard freezes and the memory budget that ended them<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/local-llm-context-budget\/\" target=\"_blank\" rel=\"noreferrer noopener\">What Happens When a Prompt Is Too Big for a Local LLM?<\/a>: fitting every prompt to a local model&#8217;s context window<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/smart-routing-single-gpu-local-llm\/\" target=\"_blank\" rel=\"noreferrer noopener\">How Do You Run Several AI Models on One GPU Without Slowdowns?<\/a>: routing requests across models on a single GPU without constant model swaps<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/gitops-for-a-gpu-ai-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">How Do You Keep an AI Server Stable? GitOps for Local AI<\/a>: running the server from a Git repository: deploys, drift, pinning and safe AI agents<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/observability-for-local-ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">What Is Your Local AI Server Actually Doing? Observability Basics<\/a>: making the server observable: traces, dashboards, usage and heat<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/multi-agent-stock-analysis-local-llm\/\" target=\"_blank\" rel=\"noreferrer noopener\">Can Local AI Agents Analyse Stocks? How We Tested and Scored Them<\/a>: a multi-agent stock-analysis experiment and how we scored the agents<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/telegram-ai-agent-local-llms\/\" target=\"_blank\" rel=\"noreferrer noopener\">Why Was Our Telegram AI Agent So Slow? The Hidden Prompt Cost<\/a>: a Telegram AI agent on local models, and why its fixed prompt became the budget<\/li>\n\n\n<li><a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-business-workflows\/\" target=\"_blank\" rel=\"noreferrer noopener\">Can AI Automate Business Workflows Without Sending Data Out?<\/a>: document, email and knowledge-base workflows that keep data on the server<\/li>\n\n\n<li><strong>Is Private AI Worth It? Lessons From Seven Weeks in Our Lab<\/strong> (you are here): the lessons from seven weeks, the honest limits and what comes next<\/li>\n\n<\/ol>\n\n<\/details>\n\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:16px\"><em>This series documents a private AI server we built and stress-tested in our lab. Workloads and data are synthetic or generalised; the problems, measurements and fixes are real.<\/em><\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<h3 class=\"wp-block-heading\">TL;DR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>For the workloads we tested, yes, within honest limits. One compact server ran private AI work reliably once we ran it like production, at the price of queueing, cold starts and smaller models than the cloud offers.<\/li>\n\n\n<li>We set out to learn whether one compact server could run the everyday AI work businesses ask for, privately and reliably. For seven weeks it ran test workflows, a chat agent, document OCR, knowledge bases and a multi-agent experiment on sample data.<\/li>\n\n\n<li>We treated it like production. Every model call goes through one gateway, every limit is measured and enforced by the machine, and everything is deployed from git.<\/li>\n\n\n<li>The server stopped freezing, prompts stopped being silently cut, and the warm models fit in 37.8 GB.<\/li>\n\n\n<li>Most lessons came from real failures, and the biggest is that on unified memory the danger is reserved memory, not the model&#8217;s weights. The checklist at the end puts the whole series in order for planning your own server.<\/li>\n\n<\/ul>\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Jargon buster: 15 terms used in this post, explained in plain English<\/summary>\n\n<ul class=\"wp-block-list\">\n\n<li><strong>KV cache<\/strong>: Working memory a model keeps while it reads a prompt. It grows with the length of the context, so long contexts need a lot of memory.<\/li>\n\n\n<li><strong>Unified memory<\/strong>: A design where the CPU and GPU share one pool of memory instead of the GPU having its own. Flexible, but both compete for the same space.<\/li>\n\n\n<li><strong>Slot (parallel requests)<\/strong>: One request a model server can work on at the same time. More slots serve more people at once but reserve more memory.<\/li>\n\n\n<li><strong>Model swap<\/strong>: Unloading one model from memory and loading another. It takes seconds to minutes, so frequent swapping makes everything slow.<\/li>\n\n\n<li><strong>Ollama<\/strong>: Free, open-source software that downloads and runs AI models on your own machine and answers requests over a local API.<\/li>\n\n\n<li><strong>LLM gateway<\/strong>: A single service every AI request must pass through, so access, budgets and logging are controlled in one place.<\/li>\n\n\n<li><strong>API key \/ virtual key<\/strong>: A secret string that identifies the program making a request. Giving each program its own key lets you limit and track it separately.<\/li>\n\n\n<li><strong>Trace<\/strong>: A detailed record of one request as it passes through each part of a system, used to find where time or errors come from.<\/li>\n\n\n<li><strong>OCR<\/strong>: Optical character recognition: turning scanned documents or images of text into machine-readable text.<\/li>\n\n\n<li><strong>Telegram bot<\/strong>: An automated account on the Telegram messaging app that people chat with; here, the front end for an AI agent.<\/li>\n\n\n<li><strong>Docker \/ container<\/strong>: A way of packaging an application with everything it needs so it runs the same anywhere; each packaged application runs in its own container.<\/li>\n\n\n<li><strong>Git repository<\/strong>: A folder of files tracked with Git, which records every change, who made it and when.<\/li>\n\n\n<li><strong>Pinning<\/strong>: Locking software to an exact version so it can&#8217;t change unexpectedly during an update.<\/li>\n\n\n<li><strong>Heartbeat<\/strong>: A regular &#8216;I&#8217;m alive&#8217; signal sent to an outside monitor; if it stops, the monitor raises an alarm.<\/li>\n\n\n<li><strong>Compaction<\/strong>: Shortening a long conversation (for example by summarising older messages) so it fits the model&#8217;s context window.<\/li>\n\n<\/ul>\n\n<\/details>\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<h3 class=\"wp-block-heading\">In this post<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><a href=\"#the-problem-can-one-private-server-do-real-ai-work\">The problem: can one private server do real AI work?<\/a><\/li>\n\n\n<li><a href=\"#what-we-were-aiming-for\">What we were aiming for<\/a><\/li>\n\n\n<li><a href=\"#how-we-approached-it\">How we approached it<\/a><\/li>\n\n\n<li><a href=\"#what-we-built-the-whole-platform-in-one-view\">What we built: the whole platform in one view<\/a><\/li>\n\n\n<li><a href=\"#challenges-we-hit-ten-lessons-from-real-failures\">Challenges we hit: ten lessons from real failures<\/a><\/li>\n\n\n<li><a href=\"#the-result-it-works-within-honest-limits\">The result: it works, within honest limits<\/a><\/li>\n\n\n<li><a href=\"#do-it-yourself-plan-your-own-private-ai-server\">Do it yourself: plan your own private AI server<\/a><\/li>\n\n\n<li><a href=\"#key-takeaways\">Key takeaways<\/a><\/li>\n\n<\/ul>\n\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-problem-can-one-private-server-do-real-ai-work\">The problem: can one private server do real AI work?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Many organisations would like to use AI on emails, invoices, documents and internal knowledge, but are uneasy about sending that data to a cloud provider. The obvious alternative is to run models on hardware you own. The question this series set out to answer was whether that is practical on a single compact server, and what it takes to keep it reliable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The answer wasn&#8217;t obvious at the start. In seven weeks the lab server had five hard freezes, a monitoring sensor that was blind for more than a day, an agent prompt too big to say &quot;hi&quot;, and two power-offs most likely caused by heat. Each of those would be an outage, a silent failure or a risk to data in a real deployment.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-we-were-aiming-for\">What we were aiming for<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Business-style data stays on the server, with no silent route to a cloud service.<\/li>\n\n\n<li>A server that doesn&#8217;t freeze, with limits that are measured rather than guessed.<\/li>\n\n\n<li>Every model call traceable to a named client, and every rule enforced by the machine, not by memory or good intentions.<\/li>\n\n\n<li>A clear-eyed view of what local AI can&#8217;t do, so the choice between local and cloud is an informed one.<\/li>\n\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-we-approached-it\">How we approached it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We built a lab rather than writing a paper, and ran realistic test workloads on synthetic and sample data. We could have bought more hardware or used cloud APIs for the hard parts. Instead we kept to an NVIDIA DGX Spark, a compact desktop AI system built on the GB10 Grace Blackwell Superchip with <strong>128 GB of unified memory<\/strong> (roughly 120 GB usable) shared by the CPU and GPU, and ran it the way you would run a production system. That meant one gateway, measured budgets, git-based deployment, monitoring and written rules, as covered in <a href=\"https:\/\/catharsis.net.au\/blog\/why-run-ai-on-your-own-hardware\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 1<\/a> onwards. When something broke, we found the cause, fixed it and turned the fix into a rule.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-we-built-the-whole-platform-in-one-view\">What we built: the whole platform in one view<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every client (workflows, a chat window, a Telegram agent, lab devices and a stock-analysis experiment) calls one gateway with its own key. The gateway checks the key and the input budget, compacts long conversations, routes <code>auto<\/code> requests, queues work and records a trace. Behind it, Ollama serves the local models, two knowledge-base workers answer from documentation, and an OCR service loads on demand. Monitoring watches memory, heat and refusals, with an external heartbeat.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th>What<\/th>\n<th>Where it ended up<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Containers<\/td>\n<td>About 30 running, plus a few stopped on purpose, because we disable things rather than delete them<\/td>\n<\/tr>\n<tr>\n<td>Models behind the gateway<\/td>\n<td>About two dozen names: local models, two knowledge bases, a small router model, a sandboxed experimental model, and three free cloud models granted only to the stock-analysis experiment, which uses public market data<\/td>\n<\/tr>\n<tr>\n<td>Resident set<\/td>\n<td><code>qwen3-coder<\/code> (20.3 GB) and <code>gemma4<\/code> (17.5 GB) stay warm together, <strong>37.8 GB<\/strong> measured. Everything else is &quot;cold&quot;, callable by name but never routed to automatically<\/td>\n<\/tr>\n<tr>\n<td>Per-request budget<\/td>\n<td>32,768 tokens of context per model and one slot per model. The gateway admits up to <strong>26,000<\/strong> prompt tokens on the main models, leaving at least 6,768 for the answer<\/td>\n<\/tr>\n<tr>\n<td>Memory kept free<\/td>\n<td><strong>At least 40 GB<\/strong>, for OCR, the containers and prompt processing<\/td>\n<\/tr>\n<tr>\n<td>Test workflows<\/td>\n<td>A few dozen active n8n workflows, plus drafts, all exported to git<\/td>\n<\/tr>\n<tr>\n<td>Keys<\/td>\n<td>One per service and one per lab device. The admin key is never handed to a client<\/td>\n<\/tr>\n<tr>\n<td>Backups<\/td>\n<td>Nightly to a separate target; we recommend alerting on any failed run and testing a restore on a spare machine before relying on it<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Almost all of it lives in one git repository and is deployed by script. The few exceptions, such as the agent&#8217;s own settings, are copied before each change, logged and watched by an alert.<\/p>\n\n\n\n<div class=\"wp-block-group has-pale-cyan-blue-background-color has-background\" style=\"padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px;margin-top:32px;margin-bottom:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<p class=\"wp-block-paragraph\"><strong>Not sure whether local or cloud AI is right for you?<\/strong> We give independent AI advice from a cyber security company: what to run, where to run it, and how to keep it secure.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/ai-consulting\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=local-ai-series&amp;utm_content=part-11-mid\" target=\"_blank\" rel=\"noreferrer noopener\">Explore AI Consulting<\/a><\/div>\n\n<\/div>\n\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"challenges-we-hit-ten-lessons-from-real-failures\">Challenges we hit: ten lessons from real failures<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. Reserved memory freezes the server, not the weights<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The worst failure was a hard freeze that needed a power cycle, with no kernel, GPU or out-of-memory error. A stock analysis&#8217;s transcript had grown to 65,007 tokens. The model serving it, <code>qwen3-coder<\/code>, had a 64k context built in, and Ollama gives every parallel slot the full context and reserves KV cache, the model&#8217;s working memory, for each. Four slots took that one model to about 33 GB, roughly 19 GB of weights plus roughly 14 GB of KV cache. The next 65k prompt began processing, and 28 seconds later the server stopped. Monitoring on the same host hung with it, and a hardware watchdog didn&#8217;t fire, so we added an external heartbeat on a separate device. With 32k contexts and one slot, the same model takes 20.3 GB (<a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-server-freezes-unified-memory\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 3<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Measure, don&#8217;t calculate<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Three budgets were wrong in one week because someone worked them out instead of observing them. The embedding model clamps at 2,048 tokens, not the 4,096 we assumed, so a 9,071-token request came back &quot;successful&quot; having read 2,048. Dense data runs closer to 2 characters per token than 3. Doubling context cost 3.22 GB on one model and 0.80 GB on another. Load the model, read what it took, and check the arithmetic against that.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. One door for every model<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Early freezes came partly from test clients calling Ollama directly, loading models nobody planned for with no record of which client asked. Now every call goes through LiteLLM, and everything except the gateway listens on the server itself. No local model may fall back to a cloud model, because a fallback is set per model and would send anyone&#8217;s request off the server (<a href=\"https:\/\/catharsis.net.au\/blog\/llm-gateway-one-door-for-every-model\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 2<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Refuse loudly rather than truncate quietly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ollama silently cuts a prompt that is too long. We wrote our own admission check, because LiteLLM only enforces context limits with pre-call checks on. Then we found it admitting prompts up to 322 times larger than it counted. Tool definitions weren&#8217;t counted, so a short message with twelve tool schemas counted 11 tokens and cost 3,540, and digits were counted in threes when these models spend one token per digit. Of 76 test samples, 59 were unsafe, and none after the fix. Compaction at the gateway now keeps the system prompt, recent turns and every tool call with its result, and stores anything trimmed (<a href=\"https:\/\/catharsis.net.au\/blog\/local-llm-context-budget\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 4<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. An agent&#8217;s fixed prompt is a budget<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Telegram agent once refused &quot;hi&quot; at 26,484 tokens against a 26,000 budget, because it loaded its framework&#8217;s developer guide from the wrong working directory. Earlier, about 90 admin tool schemas had pushed its fixed prompt to 32\u201335k. Cutting tools from 37 to 24 brought it to 14.9k (<a href=\"https:\/\/catharsis.net.au\/blog\/telegram-ai-agent-local-llms\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 9<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Sensors must fail loudly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The per-minute capacity probe was blind for more than a day because it ran <code>curl<\/code> in a container image that doesn&#8217;t include it, and swallowed the error, reporting &quot;nothing loaded&quot;. A probe that can&#8217;t get an answer now publishes unknown (<code>null<\/code>), never <code>0<\/code>. A swap warning that fired every minute for a day now judges swap by how fast it grows (<a href=\"https:\/\/catharsis.net.au\/blog\/observability-for-local-ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 7<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. Pin everything and deploy from git<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The freezes began when a container management UI recreated Ollama from a <code>:latest<\/code> tag and quietly upgraded it, and the same tool later pruned the OCR image. Every image is now pinned, <code>:latest<\/code> is blocked at commit, and that UI is view-only. The deploy script detects drift and restores GPU access afterwards, because a service-manager reload can strip it, and updates run only in a maintenance window (<a href=\"https:\/\/catharsis.net.au\/blog\/gitops-for-a-gpu-ai-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 6<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8. AI agents need guardrails the machine enforces<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">AI coding agents helped build the lab, but an instruction file only works for a session that opens it. This is how the lab runs now. Agents get scoped, unprivileged accounts, and their changes go through the repository and review. Secrets stay out of any file an agent can read, files agents tend to edit are immutable between deploys, and local-to-cloud fallbacks are refused at commit time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">9. &quot;Off&quot; switches can lie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent&#8217;s simulated sensor feed, set to <code>enabled: false<\/code>, was still sending 442 events an hour, each a 15k-token turn, and replies took up to two minutes. The integration switches itself on when configured. Parking its watch lists brought replies back to 3\u20137 seconds. Check &quot;off&quot; by watching traffic.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">10. Heat is a capacity limit too<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The server switched itself off twice with about 100 GB of memory free, most likely from heat, though we didn&#8217;t prove it. Sampling every 2 seconds after the restart, an ordinary stock analysis took the hottest zone from 48 \u00b0C to 95 \u00b0C in four minutes, which the one-minute average had hidden. Better ventilation took idle from about 50 \u00b0C to about 37 \u00b0C, and the stock-analysis tool now sends its deep calls to a free cloud model when the server runs hot, which is allowed only because its data is public (<a href=\"https:\/\/catharsis.net.au\/blog\/multi-agent-stock-analysis-local-llm\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 8<\/a>).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-result-it-works-within-honest-limits\">The result: it works, within honest limits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The server stopped freezing. The warm pair fits in 37.8 GB with at least 40 GB kept free, oversized prompts are refused or compacted rather than cut, and every call is traced to a named client. The chat agent answers in 3\u20137 seconds, and documents never take a path off the server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The limits are real. One slot means a second caller waits, with a median of 18 seconds and a 90th percentile of 58 over seven days of test load. Only two models stay warm, and <code>auto<\/code> routing only got from 9 seconds to 0.4 once the router stopped forcing model swaps. The workhorses are 30B-class quantised models (weights stored at lower precision so they fit), good at routing, extraction, summaries and tool use but not frontier models. Scored by agreement with later price moves at five trading days, the stock-analysis agents agreed 30% of the time across their first ten calls, while always answering &quot;Buy&quot; agreed 40%. Ten calls prove nothing, but now we know instead of assuming. That was an evaluation of AI agents, not financial advice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cloud still has a place for public, non-sensitive work. The stock-analysis experiment may use free OpenRouter models for its two deep calls per run, on a $0 credit limit, compacted to the local budget, with a local fallback and every call logged. Nothing else goes there.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next, roughly in order, we plan to roll out a newer Ollama one instance at a time after its sandbox run, move to Langfuse v4 and replace the object store, as the upstream project is no longer maintained. We will load the agent&#8217;s tools per conversation, add scheduled smoke tests through every entry point and workflow, choose the deep-thinking model once each candidate has 20 scored calls, and turn event feeds into digests. More capacity starts with a measurement, and if demand keeps growing, a second server is the honest answer to the queue. A heat-aware gate that briefly holds batch work, never interactive traffic, is designed and waiting on the ventilation results.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Very little of what we learned was about the models themselves. It was about memory, measurement, plain operational habits and keeping agents inside sensible fences, and the failures taught us the most. That&#8217;s the end of the series, and thank you for reading it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"do-it-yourself-plan-your-own-private-ai-server\">Do it yourself: plan your own private AI server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What you need:<\/strong> a server with a GPU or unified memory large enough for your two busiest models plus generous headroom, Linux, Docker and Git, and time to work through the series. Each step links the part that covers it in depth.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>\n<p><strong>Decide what must stay private.<\/strong> List your workloads and mark which data may never leave your hardware (<a href=\"https:\/\/catharsis.net.au\/blog\/why-run-ai-on-your-own-hardware\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 1<\/a>).<\/p>\n<p>Check: every workload has a data class and a &quot;local only&quot; or &quot;cloud allowed&quot; label.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Size memory, not compute.<\/strong> For each model you&#8217;ll keep warm, add the weights to context \u00d7 slots of KV cache, then keep a large share free (<a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-server-freezes-unified-memory\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 3<\/a>).<\/p>\n<p>Check: after loading, <code>curl -s 127.0.0.1:11434\/api\/ps<\/code> reports sizes close to your estimate.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Cap Ollama.<\/strong> Bind it to loopback and set <code>OLLAMA_NUM_PARALLEL<\/code> and <code>OLLAMA_CONTEXT_LENGTH<\/code> deliberately, as in <a href=\"https:\/\/catharsis.net.au\/blog\/why-run-ai-on-your-own-hardware\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 1&#8217;s steps<\/a> and <a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-server-freezes-unified-memory\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 3<\/a>. Changing the service reloads systemd, which can strip GPU access from running GPU containers; see the GPU caveat in Part 3 first.<\/p>\n<p>Check: nothing outside the server can reach Ollama&#8217;s port.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Put one gateway in front<\/strong> with a virtual key per client and no shared admin key (<a href=\"https:\/\/catharsis.net.au\/blog\/llm-gateway-one-door-for-every-model\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 2<\/a>).<\/p>\n<p>Check: a request without a valid key is refused, and usage shows per key.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Set an input budget and compaction<\/strong> for each model, below its context (<a href=\"https:\/\/catharsis.net.au\/blog\/local-llm-context-budget\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 4<\/a>).<\/p>\n<p>Check: an oversized prompt is refused or compacted, never silently cut.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Add routing only when you have several models,<\/strong> keeping the classifier small (<a href=\"https:\/\/catharsis.net.au\/blog\/smart-routing-single-gpu-local-llm\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 5<\/a>).<\/p>\n<p>Check: <code>auto<\/code> answers quickly without evicting a warm model.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Run it from git.<\/strong> Pin every image by digest, block <code>:latest<\/code>, and deploy by script in maintenance windows (<a href=\"https:\/\/catharsis.net.au\/blog\/gitops-for-a-gpu-ai-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 6<\/a>).<\/p>\n<p>Check: every <code>image:<\/code> line in <code>docker compose config<\/code> contains <code>@sha256:<\/code>.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Watch it from outside.<\/strong> Trace every call, publish &quot;unknown&quot; when a sensor fails, and add an external heartbeat (<a href=\"https:\/\/catharsis.net.au\/blog\/observability-for-local-ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 7<\/a>).<\/p>\n<p>Check: switch the server off in a test window and confirm the alarm arrives.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Add workloads one at a time.<\/strong> Agents with measured prompts (<a href=\"https:\/\/catharsis.net.au\/blog\/telegram-ai-agent-local-llms\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 9<\/a>), workflows and knowledge bases (<a href=\"https:\/\/catharsis.net.au\/blog\/local-ai-business-workflows\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 10<\/a>), and multi-agent jobs (<a href=\"https:\/\/catharsis.net.au\/blog\/multi-agent-stock-analysis-local-llm\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 8<\/a>), with local-to-cloud fallbacks refused at commit.<\/p>\n<p>Check: each workload passes a smoke test, streamed and with tools, before the next one starts.<\/p>\n<\/li>\n\n\n<li>\n<p><strong>Back up nightly to a separate target<\/strong>, alert on any failed run, and test a restore before relying on it (<a href=\"https:\/\/catharsis.net.au\/blog\/gitops-for-a-gpu-ai-server\/\" target=\"_blank\" rel=\"noreferrer noopener\">Part 6<\/a>).<\/p>\n<p>Check: you have restored a backup onto a machine other than the server, and the restored services start and answer.<\/p>\n<\/li>\n\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"key-takeaways\">Key takeaways<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>On unified memory, budget for context \u00d7 slots on top of the weights, and let the machine enforce it.<\/li>\n\n\n<li>Measure every number the system depends on, and measure again whenever you change anything.<\/li>\n\n\n<li>Send every model call through one gateway, with per-client keys, budgets, tracing and no silent route to the cloud.<\/li>\n\n\n<li>Prefer a clear refusal to a quiet truncation, and make every sensor say &quot;unknown&quot; when it doesn&#8217;t know.<\/li>\n\n\n<li>Give AI agents scoped access, keep secrets out of their reach, and gate their changes through the repository.<\/li>\n\n\n<li>Local AI buys privacy, predictable cost and control, at the price of queueing, smaller models and real operations work.<\/li>\n\n<\/ul>\n\n\n\n<div class=\"wp-block-group has-light-green-cyan-background-color has-background\" style=\"padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px;margin-top:40px;margin-bottom:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<h2 class=\"wp-block-heading\">Planning private AI?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Catharsis Cyber Security is a Sydney cyber security company. We design, build and secure private AI platforms like the one in this lab, and help you decide where local or cloud AI fits.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/contact-us\/?type=contact&amp;service=ai-consulting&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=local-ai-series&amp;utm_content=part-11-contact\" target=\"_blank\" rel=\"noreferrer noopener\">Talk to us about AI<\/a><\/div>\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--1\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/secure-ai\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=local-ai-series&amp;utm_content=part-11-end\" target=\"_blank\" rel=\"noreferrer noopener\">Explore Secure AI<\/a><\/div>\n\n<\/div>\n\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f4f6f8;padding-top:28px;padding-right:32px;padding-bottom:28px;padding-left:32px\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-container-core-group-is-layout-40de7cf3 wp-block-group-is-layout-constrained\">\n\n<p class=\"wp-block-paragraph\"><strong>Keep reading the series<\/strong><\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n\n<div class=\"wp-block-button is-style-outline is-style-outline--2\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/blog\/local-ai-business-workflows\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u2190 Part 10<\/a><\/div>\n\n\n<div class=\"wp-block-button is-style-outline is-style-outline--3\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/catharsis.net.au\/blog\/running-local-ai-in-production-series-guide\/\" target=\"_blank\" rel=\"noreferrer noopener\">Series guide<\/a><\/div>\n\n<\/div>\n\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>The last post in the series: what our private AI lab set out to prove, the platform we ended up with, ten lessons that started as real failures, where one local server falls short, and a checklist for planning your own.<\/p>\n","protected":false},"author":2,"featured_media":1108,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69],"tags":[83,123,124,81,84,75,80,77,79],"class_list":["post-1109","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","tag-ai-lab","tag-ai-operations","tag-lessons-learned","tag-litellm","tag-llm-gateway","tag-local-llm","tag-ollama","tag-private-ai","tag-unified-memory"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11) - Catharsis | Blog<\/title>\n<meta name=\"description\" content=\"Is private AI worth it? Seven weeks on one lab server: ten lessons from real failures, the honest limits, and a checklist to plan your own server.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11) - Catharsis | Blog\" \/>\n<meta property=\"og:description\" content=\"Is private AI worth it? Seven weeks on one lab server: ten lessons from real failures, the honest limits, and a checklist to plan your own server.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/\" \/>\n<meta property=\"og:site_name\" content=\"Catharsis | Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T22:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-03T09:53:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/local-ai-series-part-11.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sajal Jain\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sajal Jain\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/\"},\"author\":{\"name\":\"Sajal Jain\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/person\\\/f0826efb92a7aaf8d46b24715990e099\"},\"headline\":\"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11)\",\"datePublished\":\"2026-10-25T22:30:00+00:00\",\"dateModified\":\"2026-11-03T09:53:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/\"},\"wordCount\":3437,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/local-ai-series-part-11.jpg\",\"keywords\":[\"AI lab\",\"AI operations\",\"lessons learned\",\"LiteLLM\",\"LLM gateway\",\"local LLM\",\"Ollama\",\"private AI\",\"unified memory\"],\"articleSection\":[\"Artificial Intelligence\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/\",\"name\":\"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11) - Catharsis | Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/local-ai-series-part-11.jpg\",\"datePublished\":\"2026-10-25T22:30:00+00:00\",\"dateModified\":\"2026-11-03T09:53:10+00:00\",\"description\":\"Is private AI worth it? Seven weeks on one lab server: ten lessons from real failures, the honest limits, and a checklist to plan your own server.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#primaryimage\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/local-ai-series-part-11.jpg\",\"contentUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/local-ai-series-part-11.jpg\",\"width\":1280,\"height\":720,\"caption\":\"A computer lab with workstations\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/private-ai-lab-lessons-and-whats-next\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/\",\"name\":\"Catharsis | Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#organization\",\"name\":\"Catharsis | Blog\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/catharsis_au.jpg\",\"contentUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/catharsis_au.jpg\",\"width\":215,\"height\":60,\"caption\":\"Catharsis | Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/#\\\/schema\\\/person\\\/f0826efb92a7aaf8d46b24715990e099\",\"name\":\"Sajal Jain\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/Sajal-copy-96x96.jpg\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/Sajal-copy-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/Sajal-copy-96x96.jpg\",\"caption\":\"Sajal Jain\"},\"description\":\"Cyber Security Enthusiast | OSCP | CEH | CHFI | CNSS | Master of IT Security &amp; Master of IT Management\",\"url\":\"https:\\\/\\\/catharsis.net.au\\\/blog\\\/author\\\/sajal-jain\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11) - Catharsis | Blog","description":"Is private AI worth it? Seven weeks on one lab server: ten lessons from real failures, the honest limits, and a checklist to plan your own server.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/","og_locale":"en_US","og_type":"article","og_title":"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11) - Catharsis | Blog","og_description":"Is private AI worth it? Seven weeks on one lab server: ten lessons from real failures, the honest limits, and a checklist to plan your own server.","og_url":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/","og_site_name":"Catharsis | Blog","article_published_time":"2026-10-25T22:30:00+00:00","article_modified_time":"2026-11-03T09:53:10+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/local-ai-series-part-11.jpg","type":"image\/jpeg"}],"author":"Sajal Jain","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Sajal Jain","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#article","isPartOf":{"@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/"},"author":{"name":"Sajal Jain","@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/person\/f0826efb92a7aaf8d46b24715990e099"},"headline":"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11)","datePublished":"2026-10-25T22:30:00+00:00","dateModified":"2026-11-03T09:53:10+00:00","mainEntityOfPage":{"@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/"},"wordCount":3437,"commentCount":0,"publisher":{"@id":"https:\/\/catharsis.net.au\/blog\/#organization"},"image":{"@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#primaryimage"},"thumbnailUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/local-ai-series-part-11.jpg","keywords":["AI lab","AI operations","lessons learned","LiteLLM","LLM gateway","local LLM","Ollama","private AI","unified memory"],"articleSection":["Artificial Intelligence"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/","url":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/","name":"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11) - Catharsis | Blog","isPartOf":{"@id":"https:\/\/catharsis.net.au\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#primaryimage"},"image":{"@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#primaryimage"},"thumbnailUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/local-ai-series-part-11.jpg","datePublished":"2026-10-25T22:30:00+00:00","dateModified":"2026-11-03T09:53:10+00:00","description":"Is private AI worth it? Seven weeks on one lab server: ten lessons from real failures, the honest limits, and a checklist to plan your own server.","breadcrumb":{"@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#primaryimage","url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/local-ai-series-part-11.jpg","contentUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2026\/11\/local-ai-series-part-11.jpg","width":1280,"height":720,"caption":"A computer lab with workstations"},{"@type":"BreadcrumbList","@id":"https:\/\/catharsis.net.au\/blog\/private-ai-lab-lessons-and-whats-next\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/catharsis.net.au\/blog\/"},{"@type":"ListItem","position":2,"name":"Is Private AI Worth It? Lessons From Seven Weeks in Our Lab (Part 11 of 11)"}]},{"@type":"WebSite","@id":"https:\/\/catharsis.net.au\/blog\/#website","url":"https:\/\/catharsis.net.au\/blog\/","name":"Catharsis | Blog","description":"","publisher":{"@id":"https:\/\/catharsis.net.au\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/catharsis.net.au\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/catharsis.net.au\/blog\/#organization","name":"Catharsis | Blog","url":"https:\/\/catharsis.net.au\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/catharsis_au.jpg","contentUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/catharsis_au.jpg","width":215,"height":60,"caption":"Catharsis | Blog"},"image":{"@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/catharsis.net.au\/blog\/#\/schema\/person\/f0826efb92a7aaf8d46b24715990e099","name":"Sajal Jain","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/Sajal-copy-96x96.jpg","url":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/Sajal-copy-96x96.jpg","contentUrl":"https:\/\/catharsis.net.au\/blog\/wp-content\/uploads\/2019\/01\/Sajal-copy-96x96.jpg","caption":"Sajal Jain"},"description":"Cyber Security Enthusiast | OSCP | CEH | CHFI | CNSS | Master of IT Security &amp; Master of IT Management","url":"https:\/\/catharsis.net.au\/blog\/author\/sajal-jain\/"}]}},"_links":{"self":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/1109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/comments?post=1109"}],"version-history":[{"count":4,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/1109\/revisions"}],"predecessor-version":[{"id":1222,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/posts\/1109\/revisions\/1222"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/media\/1108"}],"wp:attachment":[{"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/media?parent=1109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/categories?post=1109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/catharsis.net.au\/blog\/wp-json\/wp\/v2\/tags?post=1109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}