{"id":65,"date":"2026-06-29T15:32:03","date_gmt":"2026-06-29T20:32:03","guid":{"rendered":"https:\/\/www.stagnode.com\/?p=65"},"modified":"2026-06-22T16:29:38","modified_gmt":"2026-06-22T21:29:38","slug":"why-i-run-private-ai-on-moya-and-what-it-actually-does","status":"publish","type":"post","link":"https:\/\/www.stagnode.com\/?p=65","title":{"rendered":"Why I Run Private AI on Moya (and What It Actually Does)"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">When I teased &#8220;private AI workloads on Moya&#8221; in my first post, a few people asked me the same question: <em>why bother?<\/em> Cloud AI is one API call away, it&#8217;s cheap, and somebody else deals with the GPUs catching fire. Fair question. Here&#8217;s my honest answer, plus what&#8217;s actually running.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The &#8220;How Does That Work?&#8221; Problem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">My whole philosophy with StagNode is tearing things down to understand them. You can&#8217;t do that with a hosted model. You send a prompt, you get a response, and the actual mechanics \u2014 the weights, the context handling, the quantization tradeoffs \u2014 are somebody else&#8217;s black box. I wanted the black box on my own hardware, where I could open it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s also the boring practical stuff: I didn&#8217;t want my home automation, personal notes, or half-finished writing routed through a third party&#8217;s servers just to get a summary or a rewrite. Moya already handles my daily production traffic. Adding inference felt like the natural extension of &#8220;this is my data, on my infrastructure.&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Actually Running on Moya<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Moya is my production cluster \u2014 three mini PCs plus two desktop-class machines. The mini PCs handle the lightweight stuff: home automation, internal services, the usual Kubernetes day-to-day. The two desktops are where the real horsepower lives, and they&#8217;re the nodes doing all the AI work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Right now that means:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A local inference server (Ollama-compatible API) running quantized open-weight models, scheduled onto the GPU-equipped nodes via Kubernetes node affinity<\/li>\n\n\n\n<li>A small RAG setup pointed at a slice of Pilot&#8217;s 90TB \u2014 mostly my own notes and documentation, so I can ask questions against things I&#8217;ve actually written instead of the general internet<\/li>\n\n\n\n<li>A handful of smaller models for fast, low-latency tasks (classification, quick rewrites) running alongside the bigger general-purpose model<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s not trying to compete with frontier hosted models on raw capability. It&#8217;s optimized for &#8220;good enough, instant, and mine.&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Tradeoffs Nobody Tells You About Upfront<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Running this in Kubernetes instead of just SSHing into a box and running a model directly adds real overhead \u2014 scheduling GPU resources properly, making sure pods land on the right nodes, dealing with model files that are tens of gigabytes sitting on persistent volumes backed by Pilot. None of that is free, and there were a few weeks early on where I questioned whether the GitOps purity was worth the friction versus just running it bare-metal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It was. Mostly because when a node needs to be rebuilt or I want to replicate the setup on Talyn for testing, ArgoCD just handles it. I described this in the first post and it holds true for AI workloads more than almost anything else I run \u2014 model serving configs are exactly the kind of thing you do not want to hand-configure twice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s Next<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the next post I&#8217;ll get into the actual mechanics: how I&#8217;m handling GPU scheduling on bare-metal Kubernetes nodes, the quantization tradeoffs I landed on, and a few mistakes I made that cost me an entire weekend. If you&#8217;re trying to do something similar on your own cluster, that one&#8217;s for you.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>When I teased &#8220;private AI workloads on Moya&#8221; in my first post, a few people asked me the same question: why bother? Cloud AI is one API call away, it&#8217;s cheap, and somebody else deals with the GPUs catching fire. Fair question. Here&#8217;s my honest answer, plus what&#8217;s actually running. The &#8220;How Does That Work?&#8221; &#8230; <a title=\"Why I Run Private AI on Moya (and What It Actually Does)\" class=\"read-more\" href=\"https:\/\/www.stagnode.com\/?p=65\" aria-label=\"Read more about Why I Run Private AI on Moya (and What It Actually Does)\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,4,6],"tags":[],"class_list":["post-65","post","type-post","status-publish","format-standard","hentry","category-ai","category-home-lab","category-moya"],"_links":{"self":[{"href":"https:\/\/www.stagnode.com\/index.php?rest_route=\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.stagnode.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.stagnode.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.stagnode.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.stagnode.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=65"}],"version-history":[{"count":1,"href":"https:\/\/www.stagnode.com\/index.php?rest_route=\/wp\/v2\/posts\/65\/revisions"}],"predecessor-version":[{"id":72,"href":"https:\/\/www.stagnode.com\/index.php?rest_route=\/wp\/v2\/posts\/65\/revisions\/72"}],"wp:attachment":[{"href":"https:\/\/www.stagnode.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.stagnode.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.stagnode.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}