1<!DOCTYPE html><html lang="en" class="" style="scroll-padding:60px"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Sizing and TCO - Chris Snow</title><meta property="og:title" content="Sizing and TCO - Chris Snow"/><meta name="generator" content="mystmd"/><meta name="description" content="Data & AI Engineer with 25+ years in IT. Author of books on embeddings, ML, and data platforms. Creator of open source projects."/><meta property="og:description" content="Data & AI Engineer with 25+ years in IT. Author of books on embeddings, ML, and data platforms. Creator of open source projects."/><meta name="keywords" content="data engineering, machine learning, artificial intelligence, digital design"/><link rel="stylesheet" href="/build/_assets/app-TIOB6ZNY.css"/><link rel="stylesheet" href="/build/_assets/thebe-core-VKVHG5VY.css"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/mpl_widget.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" integrity="sha384-MlJdn/WNKDGXveldHDdyRP1R4CTHr3FeuDNfhsLPYrq2t0UBkUdK2jyTnXPEK1NQ" crossorigin="anonymous"/>
vendor: 66 bytes, line 1
1<script async="" src="https://www.googletagmanager.com/gtag/js?id=
1G-7E3VJX5MQJ
vendor: 11 bytes, line 1
1"></script>
1<script>
vendor: 127 bytes, line 1
1window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', '
1G-7E3VJX5MQJ
vendor: 3 bytes, line 1
1');
1</script>
1<link rel="icon" href="/favicon.ico"/><link rel="stylesheet" href="/myst-theme.css"/>
1<script> 2 const savedTheme = localStorage.getItem("myst:theme"); 3 const theme = window.matchMedia("(prefers-color-scheme: light)").matches ? 'light' : 'dark'; 4 const classes = document.documentElement.classList; 5 const hasAnyTheme = classes.contains('light') || classes.contains('dark'); 6 if (!hasAnyTheme) classes.add(savedTheme ?? theme); 7</script>
7<script>(function(){var p=window.location.pathname;if(p.endsWith('/index.html'))window.location.replace((p.slice(0,-10)||'/')+window.location.search+window.location.hash);})();</script>
7 8<!-- Cookie Consent & Google Consent Mode --> 9<style> 10/* Cookie Consent Banner Styles */ 11.cookie-consent-banner { 12 position: fixed; 13 bottom: 0; 14 left: 0; 15 right: 0; 16 background-color: #2c3e50; 17 color: #ecf0f1; 18 padding: 1.5rem; 19 box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); 20 z-index: 9999; 21 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 22 animation: slideUp 0.3s ease-out; 23} 24 25@keyframes slideUp { 26 from { 27 transform: translateY(100%); 28 opacity: 0; 29 } 30 to { 31 transform: translateY(0); 32 opacity: 1; 33 } 34} 35 36.cookie-consent-content { 37 max-width: 1200px; 38 margin: 0 auto; 39 display: flex; 40 align-items: center; 41 justify-content: space-between; 42 gap: 2rem; 43 flex-wrap: wrap; 44} 45 46.cookie-consent-text { 47 flex: 1; 48 min-width: 300px; 49} 50 51.cookie-consent-text p { 52 margin: 0 0 0.5rem 0; 53 font-size: 0.95rem; 54 line-height: 1.5; 55} 56 57.cookie-consent-text p:last-child { 58 margin-bottom: 0; 59} 60 61.cookie-consent-text strong { 62 font-size: 1.1rem; 63 color: #fff; 64} 65 66.cookie-consent-buttons { 67 display: flex; 68 gap: 1rem; 69 flex-wrap: wrap; 70} 71 72.cookie-btn { 73 padding: 0.75rem 1.5rem; 74 border: none; 75 border-radius: 4px; 76 font-size: 0.95rem; 77 font-weight: 600; 78 cursor: pointer; 79 transition: all 0.2s ease; 80 white-space: nowrap; 81} 82 83.cookie-btn-accept { 84 background-color: #27ae60; 85 color: white; 86} 87 88.cookie-btn-accept:hover { 89 background-color: #229954; 90 transform: translateY(-1px); 91 box-shadow: 0 2px 8px rgba(39, 174, 96, 0.3); 92} 93 94.cookie-btn-reject { 95 background-color: #95a5a6; 96 color: white; 97} 98 99.cookie-btn-reject:hover { 100 background-color: #7f8c8d; 101 transform: translateY(-1px); 102 box-shadow: 0 2px 8px rgba(149, 165, 166, 0.3); 103} 104 105/* Mobile responsive */ 106@media (max-width: 768px) { 107 .cookie-consent-banner { 108 padding: 1rem; 109 } 110 111 .cookie-consent-content { 112 flex-direction: column; 113 align-items: stretch; 114 gap: 1rem; 115 } 116 117 .cookie-consent-text { 118 min-width: auto; 119 } 120 121 .cookie-consent-buttons { 122 justify-content: stretch; 123 } 124 125 .cookie-btn { 126 flex: 1; 127 min-width: 120px; 128 } 129} 130 131/* Small mobile */ 132@media (max-width: 480px) { 133 .cookie-consent-buttons { 134 flex-direction: column; 135 } 136 137 .cookie-btn { 138 width: 100%; 139 } 140} 141 142</style>
143<script> 144// Google Consent Mode v2 Implementation 145// Initialize consent mode with default denied state (for UK/EU compliance) 146window.dataLayer = window.dataLayer || []; 147function gtag() { dataLayer.push(arguments); } 148 149// Set default consent to 'denied' before any tracking 150gtag('consent', 'default', { 151 'analytics_storage': 'denied', 152 'ad_storage': 'denied', 153 'ad_user_data': 'denied', 154 'ad_personalization': 'denied', 155 'wait_for_update': 500 156}); 157 158// Cookie consent banner functionality 159(function() { 160 'use strict'; 161 162 const COOKIE_NAME = 'cookie_consent'; 163 const COOKIE_EXPIRY_DAYS = 365; 164 165 // Check if consent has already been given 166 function getCookie(name) { 167 const value = `; ${document.cookie}`; 168 const parts = value.split(`; ${name}=`); 169 if (parts.length === 2) return parts.pop().split(';').shift(); 170 return null; 171 } 172 173 // Set cookie 174 function setCookie(name, value, days) { 175 const date = new Date(); 176 date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 177 const expires = `expires=${date.toUTCString()}`; 178 document.cookie = `${name}=${value};${expires};path=/;SameSite=Lax`; 179 } 180 181 // Update consent mode 182 function updateConsentMode(analyticsGranted) { 183 gtag('consent', 'update', { 184 'analytics_storage': analyticsGranted ? 'granted' : 'denied' 185 }); 186 } 187 188 // Handle accept 189 function acceptCookies() { 190 setCookie(COOKIE_NAME, 'accepted', COOKIE_EXPIRY_DAYS); 191 updateConsentMode(true); 192 hideBanner(); 193 } 194 195 // Handle reject 196 function rejectCookies() { 197 setCookie(COOKIE_NAME, 'rejected', COOKIE_EXPIRY_DAYS); 198 updateConsentMode(false); 199 hideBanner(); 200 } 201 202 // Hide banner 203 function hideBanner() { 204 const banner = document.getElementById('cookie-consent-banner'); 205 if (banner) { 206 banner.style.display = 'none'; 207 } 208 } 209 210 // Show banner 211 function showBanner() { 212 const banner = document.createElement('div'); 213 banner.id = 'cookie-consent-banner'; 214 banner.className = 'cookie-consent-banner'; 215 banner.innerHTML = ` 216 <div class="cookie-consent-content"> 217 <div class="cookie-consent-text"> 218 <p><strong>We use cookies</strong></p> 219 <p>This site uses Google Analytics cookies to help us understand how visitors use the site. These cookies collect information in an anonymous form. You can choose to accept or reject analytics cookies.</p> 220 </div> 221 <div class="cookie-consent-buttons"> 222 <button id="cookie-accept" class="cookie-btn cookie-btn-accept">Accept Analytics</button> 223 <button id="cookie-reject" class="cookie-btn cookie-btn-reject">Reject</button> 224 </div> 225 </div> 226 `; 227 228 document.body.appendChild(banner); 229 230 // Add event listeners 231 document.getElementById('cookie-accept').addEventListener('click', acceptCookies); 232 document.getElementById('cookie-reject').addEventListener('click', rejectCookies); 233 } 234 235 // Initialize on page load 236 function init() { 237 const consent = getCookie(COOKIE_NAME); 238 239 if (consent === 'accepted') { 240 // User previously accepted 241 updateConsentMode(true); 242 } else if (consent === 'rejected') { 243 // User previously rejected 244 updateConsentMode(false); 245 } else { 246 // No consent yet, show banner 247 showBanner(); 248 } 249 } 250 251 // Run when DOM is ready 252 if (document.readyState === 'loading') { 253 document.addEventListener('DOMContentLoaded', init); 254 } else { 255 init(); 256 } 257})(); 258 259</script>
259 260 261</head><body class="m-0 bg-white dark:bg-stone-900"><div class="myst-skip-to-article fixed top-1 left-1 h-[0px] w-[0px] focus-within:z-40 focus-within:h-auto focus-within:w-auto bg-white overflow-hidden focus-within:p-2 focus-within:ring-1" aria-label="skip to content options"><a href="#skip-to-frontmatter" class="myst-skip-to-link block px-2 py-1 text-black underline">Skip to article frontmatter</a><a href="#skip-to-article" class="myst-skip-to-link block px-2 py-1 text-black underline">Skip to article content</a></div><dialog id="myst-no-css" style="position:fixed;left:0px;top:0px;width:100%;height:100vh;font-size:4rem;padding:1rem;color:black;background:white"><strong>Site not loading correctly?</strong><p>This may be due to an incorrect <code>BASE_URL</code> configuration. See<!-- --> <a href="https://mystmd.org/guide/deployment#deploy-base-url">the MyST Documentation</a> <!-- -->for reference.</p>
261<script> 262 (() => { 263 // Test for has-styling variable set by the MyST stylesheet 264 const node = document.currentScript.parentNode; 265 const hasCSS = window.getComputedStyle(node).getPropertyValue("--has-styling"); 266 if (hasCSS === ""){ 267 node.showModal(); 268 } 269 270 })() 271</script>
271</dialog><div class="myst-top-nav bg-white/80 backdrop-blur dark:bg-stone-900/80 shadow dark:shadow-stone-700 p-3 md:px-8 sticky w-full top-0 z-30 min-h-[60px]"><nav class="myst-top-nav-bar flex items-center justify-between flex-nowrap max-w-[1440px] mx-auto"><div class="flex flex-row xl:min-w-[19.5rem] mr-2 sm:mr-7 justify-start items-center shrink-0"><div class="block xl:hidden"><button class="myst-top-nav-menu-button flex items-center justify-center border-stone-400 text-stone-800 hover:text-stone-900 dark:text-stone-200 hover:dark:text-stone-100 w-10 h-10"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" width="1.5rem" height="1.5rem"><path fill-rule="evenodd" d="M3 6.75A.75.75 0 0 1 3.75 6h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 6.75ZM3 12a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75A.75.75 0 0 1 3 12Zm0 5.25a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5H3.75a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd"></path></svg><span class="sr-only">Open Menu</span></button></div><a class="myst-home-link flex items-center ml-3 dark:text-white w-fit md:ml-5 xl:ml-7" href="/"><span class="text-md sm:text-xl tracking-tight sm:mr-5">Chris Snow</span></a></div><div class="flex items-center flex-grow w-auto"><div class="flex-grow hidden text-md lg:block"><div class="myst-top-nav-item relative inline-block mx-2 grow-0"><a href="https://github.com/snowch" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center w-full mx-2 py-1 text-md font-medium dark:text-white focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75">GitHub</a></div><div class="myst-top-nav-item relative inline-block mx-2 grow-0"><a href="https://www.linkedin.com/in/csnowuk/" target="_blank" rel="noopener noreferrer" class="inline-flex items-center justify-center w-full mx-2 py-1 text-md font-medium dark:text-white focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75">LinkedIn</a></div></div><div class="flex-grow block"></div><button type="button" aria-haspopup="dialog" aria-expanded="false" data-state="closed" class="myst-search-bar flex items-center h-10 aspect-square sm:w-64 text-left text-gray-600 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg bg-gray-50 dark:bg-gray-700 myst-search-bar-disabled hover:ring-blue-500 dark:hover:ring-blue-500 hover:border-blue-500 dark:hover:border-blue-500"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="p-2.5 h-10 w-10 aspect-square"><path fill-rule="evenodd" d="M10.5 3.75a6.75 6.75 0 1 0 0 13.5 6.75 6.75 0 0 0 0-13.5ZM2.25 10.5a8.25 8.25 0 1 1 14.59 5.28l4.69 4.69a.75.75 0 1 1-1.06 1.06l-4.69-4.69A8.25 8.25 0 0 1 2.25 10.5Z" clip-rule="evenodd"></path></svg><span class="myst-search-text-placeholder hidden sm:block grow">Search</span><div aria-hidden="true" class="myst-search-shortcut items-center hidden mx-1 font-mono text-sm text-gray-600 dark:text-gray-300 sm:flex gap-x-1"><kbd class="px-2 py-1 border border-gray-300 dark:border-gray-600 rounded-md shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)] dark:shadow-none hide-mac">CTRL</kbd><kbd class="px-2 py-1 border border-gray-300 dark:border-gray-600 rounded-md shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)] dark:shadow-none show-mac">â</kbd><kbd class="px-2 py-1 border border-gray-300 dark:border-gray-600 rounded-md shadow-[0px_2px_0px_0px_rgba(0,0,0,0.08)] dark:shadow-none ">K</kbd>
271<script> 272;(() => { 273const script = document.currentScript; 274const root = script.parentElement; 275 276const isMac = /mac/i.test( 277 window.navigator.userAgentData?.platform ?? window.navigator.userAgent, 278 ); 279root.querySelectorAll(".hide-mac").forEach(node => {node.classList.add(isMac ? "hidden" : "block")}); 280root.querySelectorAll(".show-mac").forEach(node => {node.classList.add(!isMac ? "hidden" : "block")}); 281})()</script>
281</div></button><button class="myst-theme-button theme shrink-0 rounded-full border border-stone-700 dark:border-white hover:bg-neutral-100 border-solid overflow-hidden text-stone-700 dark:text-white hover:text-stone-500 dark:hover:text-neutral-800 w-8 h-8 ml-3" title="Toggle theme between light and dark mode" aria-label="Toggle theme between light and dark mode"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="myst-theme-moon-icon h-full w-full p-[18%] hidden dark:block"><path fill-rule="evenodd" d="M9.528 1.718a.75.75 0 0 1 .162.819A8.97 8.97 0 0 0 9 6a9 9 0 0 0 9 9 8.97 8.97 0 0 0 3.463-.69.75.75 0 0 1 .981.98 10.503 10.503 0 0 1-9.694 6.46c-5.799 0-10.5-4.7-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 0 1 .818.162Z" clip-rule="evenodd"></path></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="myst-theme-sun-icon h-full w-full p-[18%] dark:hidden"><path d="M12 2.25a.75.75 0 0 1 .75.75v2.25a.75.75 0 0 1-1.5 0V3a.75.75 0 0 1 .75-.75ZM7.5 12a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0ZM18.894 6.166a.75.75 0 0 0-1.06-1.06l-1.591 1.59a.75.75 0 1 0 1.06 1.061l1.591-1.59ZM21.75 12a.75.75 0 0 1-.75.75h-2.25a.75.75 0 0 1 0-1.5H21a.75.75 0 0 1 .75.75ZM17.834 18.894a.75.75 0 0 0 1.06-1.06l-1.59-1.591a.75.75 0 1 0-1.061 1.06l1.59 1.591ZM12 18a.75.75 0 0 1 .75.75V21a.75.75 0 0 1-1.5 0v-2.25A.75.75 0 0 1 12 18ZM7.758 17.303a.75.75 0 0 0-1.061-1.06l-1.591 1.59a.75.75 0 0 0 1.06 1.061l1.591-1.59ZM6 12a.75.75 0 0 1-.75.75H3a.75.75 0 0 1 0-1.5h2.25A.75.75 0 0 1 6 12ZM6.697 7.757a.75.75 0 0 0 1.06-1.06l-1.59-1.591a.75.75 0 0 0-1.061 1.06l1.59 1.591Z"></path></svg></button><div class="block sm:hidden"></div><div class="hidden sm:block"></div></div></nav></div><div class="myst-primary-sidebar fixed xl:article-grid grid-gap xl:w-full xl:pointer-events-none overflow-auto max-xl:w-[75vw] max-xl:max-w-[350px] max-xl:!top-0 max-xl:h-screen hidden z-10" style="top:60px"><div class="myst-primary-sidebar-pointer pointer-events-auto xl:col-margin-left flex-col overflow-hidden max-xl:h-full hidden xl:flex"><div class="myst-primary-sidebar-nav flex-grow py-6 overflow-y-auto primary-scrollbar"><nav aria-label="Navigation" class="myst-primary-sidebar-topnav overflow-y-hidden transition-opacity lg:hidden ml-3 xl:ml-0 mr-3 max-w-[350px]"><div class="w-full px-1 dark:text-white font-medium"><a href="https://github.com/snowch" target="_blank" rel="noopener noreferrer" class="myst-primary-sidebar-item-short p-2 my-1 rounded-lg hover:bg-slate-300/30 block break-words focus:outline outline-blue-200 outline-2 rounded">GitHub</a><a href="https://www.linkedin.com/in/csnowuk/" target="_blank" rel="noopener noreferrer" class="myst-primary-sidebar-item-short p-2 my-1 rounded-lg hover:bg-slate-300/30 block break-words focus:outline outline-blue-200 outline-2 rounded">LinkedIn</a></div></nav><div class="my-3 border-b-2 lg:hidden"></div><nav aria-label="Table of Contents" class="myst-primary-sidebar-toc flex-grow overflow-y-hidden transition-opacity ml-3 xl:ml-0 mr-3 max-w-[350px]"><div class="myst-toc w-full px-1 dark:text-white"><a title="Chris Snow - Data & AI Engineering" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30 font-bold" href="/">Chris Snow - Data & AI Engineering</a><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-slate-300/30"><div title="AI Engineering Blog" class="block break-words rounded py-2 grow cursor-pointer">AI Engineering Blog</div>
281<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-slate-300/30 focus-visible:outline outline-blue-200 outline-2" aria-label="Open Folder" type="button" aria-controls="radix-:R18psp:" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-text-slate-700 dark:text-slate-100" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-:R18psp:" hidden="" class="pl-3 pr-[2px] collapsible-content"></div></div><a title="Embeddings at Scale Book" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/embeddings">Embeddings at Scale Book</a><a title="Observability Anomaly Detection" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/anomaly-detection">Observability Anomaly Detection</a><a title="Sizing and TCO" aria-current="page" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg myst-toc-item-exact bg-blue-300/30 active" href="/sizing">Sizing and TCO</a><a title="Probability Book" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/probability">Probability Book</a><a title="Matrix Calculus Book" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/matrix-calculus">Matrix Calculus Book</a><a title="Learn Linear Algebra Book" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/linear-algebra">Learn Linear Algebra Book</a><a title="Other Books & Guides" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/books">Other Books & Guides</a><a title="Open Source Work" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/opensource">Open Source Work</a><a title="External Articles" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/external-articles">External Articles</a><a title="Talks & Presentations" class="block break-words focus:outline outline-blue-200 outline-2 rounded myst-toc-item p-2 my-1 rounded-lg hover:bg-slate-300/30" href="/talks">Talks & Presentations</a><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-slate-300/30"><div title="Other Work" class="block break-words rounded py-2 grow cursor-pointer">Other Work</div>
281<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-slate-300/30 focus-visible:outline outline-blue-200 outline-2" aria-label="Open Folder" type="button" aria-controls="radix-:R6opsp:" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-text-slate-700 dark:text-slate-100" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-:R6opsp:" hidden="" class="pl-3 pr-[2px] collapsible-content"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-slate-300/30"><div title="Computer Architecture Notes" class="block break-words rounded py-2 grow cursor-pointer">Computer Architecture Notes</div>
281<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-slate-300/30 focus-visible:outline outline-blue-200 outline-2" aria-label="Open Folder" type="button" aria-controls="radix-:R78psp:" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-text-slate-700 dark:text-slate-100" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-:R78psp:" hidden="" class="pl-3 pr-[2px] collapsible-content"></div></div><div data-state="closed" class="w-full"><div class="myst-toc-item flex flex-row w-full gap-2 pl-2 my-1 text-left rounded-lg outline-none hover:bg-slate-300/30"><div title="Digital Design Notes" class="block break-words rounded py-2 grow cursor-pointer">Digital Design Notes</div>
281<button class="self-stretch flex items-center flex-none px-1 rounded-l-md group hover:bg-slate-300/30 focus-visible:outline outline-blue-200 outline-2" aria-label="Open Folder" type="button" aria-controls="radix-:R7opsp:" aria-expanded="false" data-state="closed"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-slot="icon" class="transition-transform duration-300 group-data-[state=open]:rotate-90 text-text-slate-700 dark:text-slate-100" height="1.5rem" width="1.5rem"><path fill-rule="evenodd" d="M16.28 11.47a.75.75 0 0 1 0 1.06l-7.5 7.5a.75.75 0 0 1-1.06-1.06L14.69 12 7.72 5.03a.75.75 0 0 1 1.06-1.06l7.5 7.5Z" clip-rule="evenodd"></path></svg></button></div><div data-state="closed" id="radix-:R7opsp:" hidden="" class="pl-3 pr-[2px] collapsible-content"></div></div></div></nav></div><div class="myst-primary-sidebar-footer flex-none py-6 transition-all duration-700 translate-y-6 opacity-0 ml-3 xl:ml-0 mr-3 max-w-[350px]"><a class="myst-made-with-myst flex mx-auto text-gray-700 w-fit hover:text-blue-700 dark:text-gray-200 dark:hover:text-blue-400" href="https://mystmd.org/made-with-myst" target="_blank" rel="noreferrer"><svg style="width:24px;height:24px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" stroke="none"><g id="icon"><path fill="currentColor" d="M23.8,54.8v-3.6l4.7-0.8V17.5l-4.7-0.8V13H36l13.4,31.7h0.2l13-31.7h12.6v3.6l-4.7,0.8v32.9l4.7,0.8v3.6h-15 282 v-3.6l4.9-0.8V20.8H65L51.4,53.3h-3.8l-14-32.5h-0.1l0.2,17.4v12.1l5,0.8v3.6H23.8z"></path><path fill="#F37726" d="M47,86.9c0-5.9-3.4-8.8-10.1-8.8h-8.4c-5.2,0-9.4-1.3-12.5-3.8c-3.1-2.5-5.4-6.2-6.8-11l4.8-1.6 283 c1.8,5.6,6.4,8.6,13.8,8.8h9.2c6.4,0,10.8,2.5,13.1,7.5c2.3-5,6.7-7.5,13.1-7.5h8.4c7.8,0,12.7-2.9,14.6-8.7l4.8,1.6 284 c-1.4,4.9-3.6,8.6-6.8,11.1c-3.1,2.5-7.3,3.7-12.4,3.8H63c-6.7,0-10,2.9-10,8.8"></path></g></svg>
284<span class="self-center ml-2 text-sm">Made with MyST</span></a></div></div></div><main class="article-grid grid-gap"><article class="article-grid subgrid-gap col-screen article content"><div class="hidden"></div><div id="skip-to-frontmatter" aria-label="article frontmatter" class="myst-fm-block mb-8 pt-9"><div class="myst-fm-block-header flex items-center mb-5 h-6 text-sm font-light"><div class="flex-grow"></div><div class="myst-fm-block-badges"><a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="noopener noreferrer" class="myst-fm-license-cc-badge opacity-50 hover:opacity-100 text-inherit hover:text-inherit myst-fm-license-content" aria-label="Content License: Creative Commons Attribution 4.0 International (CC-BY-4.0)"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="1.25rem" height="1.25rem" class="myst-fm-license-cc-icon myst-fm-license-cc-icon-main inline-block mx-1"><title>Content License: Creative Commons Attribution 4.0 International (CC-BY-4.0)</title><path d="M12 2.2c2.7 0 5 1 7 2.9.9.9 1.6 2 2.1 3.1.5 1.2.7 2.4.7 3.8 0 1.3-.2 2.6-.7 3.8-.5 1.2-1.2 2.2-2.1 3.1-1 .9-2 1.7-3.2 2.2-1.2.5-2.5.7-3.7.7s-2.6-.3-3.8-.8c-1.2-.5-2.2-1.2-3.2-2.1s-1.6-2-2.1-3.2-.8-2.4-.8-3.7c0-1.3.2-2.5.7-3.7S4.2 6 5.1 5.1C7 3.2 9.3 2.2 12 2.2zM12 4c-2.2 0-4.1.8-5.6 2.3C5.6 7.1 5 8 4.6 9c-.4 1-.6 2-.6 3s.2 2.1.6 3c.4 1 1 1.8 1.8 2.6S8 19 9 19.4c1 .4 2 .6 3 .6s2.1-.2 3-.6c1-.4 1.9-1 2.7-1.8 1.5-1.5 2.3-3.3 2.3-5.6 0-1.1-.2-2.1-.6-3.1-.4-1-1-1.8-1.7-2.6C16.1 4.8 14.2 4 12 4zm-.1 6.4l-1.3.7c-.1-.3-.3-.5-.5-.6-.2-.1-.4-.2-.6-.2-.9 0-1.3.6-1.3 1.7 0 .5.1.9.3 1.3.2.3.5.5 1 .5.6 0 1-.3 1.2-.8l1.2.6c-.3.5-.6.9-1.1 1.1-.5.3-1 .4-1.5.4-.9 0-1.6-.3-2.1-.8-.5-.6-.8-1.3-.8-2.3 0-.9.3-1.7.8-2.2.6-.6 1.3-.8 2.1-.8 1.2 0 2.1.4 2.6 1.4zm5.6 0l-1.3.7c-.1-.3-.3-.5-.5-.6-.2-.1-.4-.2-.6-.2-.9 0-1.3.6-1.3 1.7 0 .5.1.9.3 1.3.2.3.5.5 1 .5.6 0 1-.3 1.2-.8l1.2.6c-.3.5-.6.9-1.1 1.1-.4.2-.9.3-1.4.3-.9 0-1.6-.3-2.1-.8s-.8-1.3-.8-2.2c0-.9.3-1.7.8-2.2.5-.5 1.2-.8 2-.8 1.2 0 2.1.4 2.6 1.4z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="1.25rem" height="1.25rem" class="myst-fm-license-cc-icon myst-fm-license-cc-icon-by inline-block mr-1"><title>Credit must be given to the creator</title><path d="M12 2.2c2.7 0 5 .9 6.9 2.8 1.9 1.9 2.8 4.2 2.8 6.9s-.9 5-2.8 6.8c-2 1.9-4.3 2.9-7 2.9-2.6 0-4.9-1-6.9-2.9-1.8-1.7-2.8-4-2.8-6.7s1-5 2.9-6.9C7 3.2 9.3 2.2 12 2.2zM12 4c-2.2 0-4.1.8-5.6 2.3C4.8 8 4 9.9 4 12c0 2.2.8 4 2.4 5.6C8 19.2 9.8 20 12 20c2.2 0 4.1-.8 5.7-2.4 1.5-1.5 2.3-3.3 2.3-5.6 0-2.2-.8-4.1-2.3-5.7C16.1 4.8 14.2 4 12 4zm2.6 5.6v4h-1.1v4.7h-3v-4.7H9.4v-4c0-.2.1-.3.2-.4.1-.2.2-.2.4-.2h4c.2 0 .3.1.4.2.2.1.2.2.2.4zm-4-2.5c0-.9.5-1.4 1.4-1.4s1.4.5 1.4 1.4c0 .9-.5 1.4-1.4 1.4s-1.4-.5-1.4-1.4z"></path></svg></a><a href="https://github.com/snowch/snowch.github.io" title="GitHub Repository: snowch/snowch.github.io" target="_blank" rel="noopener noreferrer" class="myst-fm-github-link text-inherit hover:text-inherit"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" width="1.25rem" height="1.25rem" class="myst-fm-github-icon inline-block mr-1 opacity-60 hover:opacity-100"><path d="M12 2.5c-5.4 0-9.8 4.4-9.8 9.7 0 4.3 2.8 8 6.7 9.2.5.1.7-.2.7-.5v-1.8c-2.4.5-3.1-.6-3.3-1.1-.1-.3-.6-1.1-1-1.4-.3-.2-.8-.6 0-.6s1.3.7 1.5 1c.9 1.5 2.3 1.1 2.8.8.1-.6.3-1.1.6-1.3-2.2-.2-4.4-1.1-4.4-4.8 0-1.1.4-1.9 1-2.6-.1-.2-.4-1.2.1-2.6 0 0 .8-.3 2.7 1 .8-.2 1.6-.3 2.4-.3.8 0 1.7.1 2.4.3 1.9-1.3 2.7-1 2.7-1 .5 1.3.2 2.3.1 2.6.6.7 1 1.5 1 2.6 0 3.7-2.3 4.6-4.4 4.8.4.3.7.9.7 1.8V21c0 .3.2.6.7.5 3.9-1.3 6.6-4.9 6.6-9.2 0-5.4-4.4-9.8-9.8-9.8z"></path></svg></a></div><a href="https://github.com/snowch/snowch.github.io/edit/main/sizing.md" title="Edit This Page" target="_blank" rel="noopener noreferrer" class="myst-fm-edit-link text-inherit hover:text-inherit"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.25rem" height="1.25rem" class="myst-fm-edit-icon inline-block mr-1 opacity-60 hover:opacity-100"><path stroke-linecap="round" stroke-linejoin="round" d="m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10"></path></svg></a><div class="myst-fm-downloads-dropdown relative flex inline-block mx-1 grow-0" data-headlessui-state=""><button class="myst-fm-downloads-button relative ml-2 -mr-1" id="headlessui-menu-button-:Rs8ucp:" type="button" aria-haspopup="menu" aria-expanded="false" data-headlessui-state=""><span class="sr-only">Downloads</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.25rem" height="1.25rem" class="myst-fm-downloads-icon"><title>Download</title><path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"></path></svg></button></div></div><h1 class="myst-fm-block-title mb-0">Sizing and TCO</h1><header class="myst-fm-authors-affiliations mt-4 not-prose"><div class="myst-fm-authors-list"><span class="myst-fm-author font-semibold text-sm myst-fm-author-item inline-block"><button class="myst-fm-author-popover focus:shadow-[0_0_0_2px] focus:shadow-black outline-none hover:underline" aria-label="Author Details" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="radix-:R78ucp:" data-state="closed"><span class="myst-fm-author-name">Chris Snow</span></button></span></div></header></div><div class="block my-10 lg:sticky lg:z-10 lg:h-0 lg:pt-0 lg:my-0 lg:ml-10 lg:col-margin-right" style="top:60px"><nav></nav></div><div id="skip-to-article"></div><p>Capacity planning, sizing and total cost of ownership, modelled as code. A self
284-study book and toolkit built around one question â how big, how much, and how wrong could I be? â and one rule for answering it: every number says where it came from.</p><h2 id="topics-covered" class="relative group"><span class="heading-text">Topics Covered</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#topics-covered" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><ul><li><p><strong>What Youâre Sizing</strong>: point estimates, what a workload is, where the numbers come from, peak, mean and growth</p></li><li><p><strong>Ceilings</strong>: Littleâs Law, queueing and the knee, when adding servers stops helping, regime changes</p></li><li><p><strong>Sizing</strong>: capacity, bandwidth and the binding constraint, headroom and failure domains</p></li><li><p><strong>Uncertainty</strong>: Monte Carlo from first principles, correlation and convergence</p></li><li><p><strong>Cost</strong>: capex, opex and lifecycle, power first, unit economics, the five-year model</p></li><li><p><strong>Sensitivity</strong>: which input is really the answer, and the missing node</p></li><li><p><strong>Presenting It</strong>: a TCO for finance, and comparing two TCOs</p></li><li><p><strong>Appendices</strong>: DSL reference, the Monte Carlo module, distributions, units, two worked models, glossary</p></li></ul><h2 id="what-makes-it-different" class="relative group"><span class="heading-text">What Makes It Different</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#what-makes-it-different" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><ul><li><p><strong>Models are code</strong> â a model is a graph of named quantities in a YAML file, evaluated and version controlled like anything else</p></li><li><p><strong>Units fail the build</strong> â every node declares a unit, so a model that multiplies the wrong two things is rejected rather than published</p></li><li><p><strong>Provenance is mandatory</strong> â every input declares whether it is a measured fact, a vendorâs claim, or an assumption</p></li><li><p><strong>Gaps stay visible</strong> â a constant nobody has measured leaves the nodes below it empty instead of quietly filled in</p></li><li><p><strong>Monte Carlo from scratch</strong> â inverse-transform sampling, rank correlation and convergence written to be read, not called</p></li></ul><h2 id="access-the-full-book" class="relative group"><span class="heading-text">Access the Full Book</span><a class="no-underline text-inherit hover:text-inherit inline-block w-0 px-0 translate-x-[10px] font-normal select-none transition-opacity opacity-0 focus:opacity-100 group-hover:opacity-70" href="#access-the-full-book" title="Link to this Section" aria-label="Link to this Section">¶</a></h2><p><strong><a target="_blank" rel="noreferrer" href="https://snowch.github.io/sizing-and-tco/" class="link whitespace-nowrap"><span class="link-text whitespace-normal">Sizing and TCO â</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="link-icon"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"></path></svg></a></strong></p><p>The complete book is available as an interactive resource, with worked models you can adjust and re-run in the browser. Source and toolkit on <a target="_blank" rel="noreferrer" href="https://github.com/snowch/sizing-and-tco" class="link whitespace-nowrap"><span class="link-text whitespace-normal">GitHub</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" class="link-icon"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"></path></svg></a>.</p><div class="myst-backmatter-parts"></div><div class="myst-footer-links flex pt-10 mb-10 space-x-4"><a class="myst-footer-link flex-1 block p-4 font-normal text-gray-600 no-underline border border-gray-200 rounded shadow-sm group hover:border-blue-600 dar
284k:hover:border-blue-400 hover:text-blue-600 dark:hover:text-blue-400 dark:text-gray-100 dark:border-gray-500 hover:shadow-lg dark:shadow-neutral-700 myst-footer-link-prev" aria-label="Previous: Observability Anomaly Detection" href="/anomaly-detection"><div class="flex h-full align-middle"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.5rem" height="1.5rem" class="myst-footer-link-icon self-center transition-transform group-hover:-translate-x-1 shrink-0"><path stroke-linecap="round" stroke-linejoin="round" d="M10.5 19.5 3 12m0 0 7.5-7.5M3 12h18"></path></svg><div class="flex-grow text-right"><div class="myst-footer-link-group text-xs text-gray-500 dark:text-gray-400">ML/AI Algorithms</div>Observability Anomaly Detection</div></div></a><a class="myst-footer-link flex-1 block p-4 font-normal text-gray-600 no-underline border border-gray-200 rounded shadow-sm group hover:border-blue-600 dark:hover:border-blue-400 hover:text-blue-600 dark:hover:text-blue-400 dark:text-gray-100 dark:border-gray-500 hover:shadow-lg dark:shadow-neutral-700 myst-footer-link-next" aria-label="Next: Probability Book" href="/probability"><div class="flex h-full align-middle"><div class="flex-grow"><div class="myst-footer-link-group text-xs text-gray-500 dark:text-gray-400">ML/AI Algorithms</div>Probability Book</div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true" data-slot="icon" width="1.5rem" height="1.5rem" class="myst-footer-link-icon self-center transition-transform group-hover:translate-x-1 shrink-0"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3"></path></svg></div></a></div></article></main>
284<script>((a,l)=>{if(!window.history.state||!window.history.state.key){let u=Math.random().toString(32).slice(2);window.history.replaceState({key:u},"")}try{let d=JSON.parse(sessionStorage.getItem(a)||"{}")[l||window.history.state.key];typeof d=="number"&&window.scrollTo(0,d)}catch(u){console.error(u),sessionStorage.removeItem(a)}})("positions", null)</script>
284<link rel="modulepreload" href="/build/entry.client-PCJPW7TK.js"/><link rel="modulepreload" href="/build/_shared/chunk-AQ2CODAG.js"/><link rel="modulepreload" href="/build/_shared/chunk-JJXTQVMA.js"/><link rel="modulepreload" href="/build/_shared/chunk-OZE3FFNP.js"/><link rel="modulepreload" href="/build/_shared/chunk-RUUCG5OS.js"/><link rel="modulepreload" href="/build/_shared/chunk-C4DFGG5C.js"/><link rel="modulepreload" href="/build/_shared/chunk-J7TUH54J.js"/><link rel="modulepreload" href="/build/_shared/chunk-FZ2S7OYD.js"/><link rel="modulepreload" href="/build/_shared/chunk-JEM6JXYA.js"/><link rel="modulepreload" href="/build/_shared/chunk-34XIY2DH.js"/><link rel="modulepreload" href="/build/_shared/chunk-KQM5FBHR.js"/><link rel="modulepreload" href="/build/_shared/chunk-OCWQY3HK.js"/><link rel="modulepreload" href="/build/_shared/chunk-7HNKBP4B.js"/><link rel="modulepreload" href="/build/_shared/chunk-CUKUDK3R.js"/><link rel="modulepreload" href="/build/_shared/chunk-3EBOCCHJ.js"/><link rel="modulepreload" href="/build/_shared/chunk-O4VQNZ62.js"/><link rel="modulepreload" href="/build/_shared/chunk-4OEDG4JQ.js"/><link rel="modulepreload" href="/build/_shared/chunk-GUCIBHGO.js"/><link rel="modulepreload" href="/build/root-3VHQT63W.js"/><link rel="modulepreload" href="/build/_shared/chunk-SHVDI3JB.js"/><link rel="modulepreload" href="/build/routes/$-O2KOSX5W.js"/>
284<script>window.__remixContext = {"url":"/sizing","state":{"loaderData":{"root":{"config":{"version":3,"myst":"1.10.1","title":"Chris Snow","options":{"favicon":"/build/favicon-b17fe1a131c89ef3ffc3be56542460ec.ico","logo_text":"Chris Snow","analytics_google":"G-7E3VJX5MQJ","style":"/build/custom-d1a1614a2e8518bce0ae45db184c01f0.css"},"nav":[{"title":"GitHub","url":"https://github.com/snowch"},{"title":"LinkedIn","url":"https://www.linkedin.com/in/csnowuk/"}],"actions":[],"projects":[{"license":{"content":{"id":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/","name":"Creative Commons Attribution 4.0 International","free":true,"CC":true}},"title":"Chris Snow - Data \u0026 AI Engineering","description":"Data \u0026 AI Engineer with 25+ years in IT. Author of books on embeddings, ML, and data platforms. Creator of open source projects.","authors":[{"nameParsed":{"literal":"Chris Snow","given":"Chris","family":"Snow"},"name":"Chris Snow","url":"https://snowch.github.io","id":"contributors-myst-generated-uid-0"}],"github":"https://github.com/snowch/snowch.github.io","keywords":["data engineering","machine learning","artificial intelligence","digital design"],"id":"snowch-github-io","toc":[{"file":"index.md"},{"children":[{"file":"ai-eng/other-sections.md","title":"Table of Contents"},{"children":[{"file":"probability/index.md","title":"Introduction: Probability Tutorials \u0026 Notes"},{"file":"probability/inclusion_exclusion_tutorial.md","title":"Inclusion-Exclusion Principle"},{"file":"probability/birthday_tutorial.md","title":"Birthday Paradox"}],"title":"Probability"},{"children":[{"file":"observability/index.md","title":"Introduction: Observability \u0026 Anomaly Detection"}],"title":"Observability"},{"children":[{"file":"ai-eng/nnfs/index.md","title":"Introduction: Understanding Deep Learning From First Principles"},{"file":"ai-eng/nnfs/nn_edge_detector_blog.md","title":"Edge Detection Intuition: A Single Neuron as Pattern Matching"},{"file":"ai-eng/nnfs/nn_tutorial_blog.md","title":"Training an Edge-Detection Neural Network from Scratch"},{"file":"ai-eng/nnfs/nn_flexible_network_blog.md","title":"Building a General Neural Network from Scratch"},{"file":"ai-eng/nnfs/nn_pytorch_basics.md","title":"PyTorch Basics (Flexible MLP)"}],"title":"Neural Networks From Scratch"},{"children":[{"file":"ai-eng/llmfs/index.md","title":"Introduction: Building GPT From First Principles"},{"file":"ai-eng/llmfs/L01_Tokenization_From_Scratch.md","title":"L01 - Tokenization: From Scratch"},{"file":"ai-eng/llmfs/L02_Embeddings_and_Positional_Encoding.md","title":"L02 - Embeddings \u0026 Positional Encoding"},{"file":"ai-eng/llmfs/L03_The_Attention_Mechanism.md","title":"L03 - Self-Attention: Understanding Context"},{"file":"ai-eng/llmfs/L04_Multi_Head_Attention.md","title":"L04 - Multi-Head Attention: Seeing in Parallel"},{"file":"ai-eng/llmfs/L05_Normalization_and_Residuals.md","title":"L05 - Normalization \u0026 Residuals"},{"file":"ai-eng/llmfs/L06_The_Causal_Mask.md","title":"L06 - The Causal Mask: How to Stop Cheating"},{"file":"ai-eng/llmfs/L07_Assembling_the_GPT.md","title":"L07 - Assembling the GPT: The Grand Finale"},{"file":"ai-eng/llmfs/L08_Architecture_Design_Choices.md","title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters"},{"file":"ai-eng/llmfs/L09_Training_the_LLM.md","title":"L09 - Training the LLM: Learning to Speak"},{"file":"ai-eng/llmfs/L10_Inference_and_Sampling.md","title":"L10 - Inference \u0026 Sampling: Controlling the Creativity"},{"file":"ai-eng/llmfs/L11_Fine_tuning_and_Chat.md","title":"L11 - Fine-tuning: From Completion to Conversation"}],"title":"LLM From Scratch: Foundations"},{"children":[{"file":"ai-eng/llmfs-production/index.md","title":"Introduction: Bridge to Production"},{"file":"ai-eng/llmfs-production/L12_Loading_Pretrained_Weights.md","title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]"},{"file":"ai-eng/llmfs-production/L13_Data_Loading_Pipelines.md","title":"L13 - Data Loading Pipelines at Scale [DRAFT]"},{"file":"ai-eng/llmfs-production/L14_Evaluation_Frameworks.md","title":"L14 - Evaluation Frameworks [DRAFT]"},{"file":"ai-eng/llmfs-production/L15_LoRA_PEFT.md","title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]"},{"file":"ai-eng/llmfs-production/L16_Mixed_Precision_Training.md","title":"L16 - Mixed Precision Training [DRAFT]"}],"title":"LLM From Scratch: Production Techniques"},{"children":[{"file":"ai-eng/llmfs-scaling/index.md","title":"Introduction: Advanced Scale \u0026 Performance"},{"file":"ai-eng/llmfs-scaling/L17_Attention_Optimizations.md","title":"L17 - Attention Optimizations [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L18_Model_Parallelism.md","title":"L18 - Model Parallelism [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L19_Long_Context_Handling.md","title":"L19 - Long Context Handling [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L20_Quantization_Inference.md","title":"L20 - Quantization for Inference [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L21_Deployment_Serving.md","title":"L21 - Deployment \u0026 Serving [DRAFT]"}],"title":"LLM From Scratch: Scaling \u0026 Optimization"},{"children":[{"file":"ai-eng/ml-algorithms/latent_factors.md","title":"The Hidden Power of Latent Factors"},{"file":"ai-eng/ml-algorithms/als_tutorial.md","title":"Alternating Least Squares (ALS) for Movie Recommendations"},{"file":"ai-eng/ml-algorithms/softmax_from_scores.md","title":"Softmax: From Scores to Probabilities"},{"file":"ai-eng/ml-algorithms/tree_based_feature_importance.md","title":"Tree-Based Feature Importance [DRAFT]"}],"title":"ML/AI Algorithms"}],"title":"AI Engineering Blog"},{"file":"embeddings.md","title":"Embeddings at Scale Book"},{"file":"anomaly-detection.md","title":"Observability Anomaly Detection"},{"file":"sizing.md","title":"Sizing and TCO"},{"file":"probability/probability.md","title":"Probability Book"},{"file":"matrix-calculus.md","title":"Matrix Calculus Book"},{"file":"linear-algebra.md","title":"Learn Linear Algebra Book"},{"file":"books.md","title":"Other Books \u0026 Guides"},{"file":"opensource.md","title":"Open Source Work"},{"file":"external-articles.md","title":"External Articles"},{"file":"talks.md","title":"Talks \u0026 Presentations"},{"children":[{"file":"apps.md","title":"Apps"}],"title":"Other Work"},{"children":[{"file":"computer-architecture/computer_architecture_coming_soon.md","title":"Coming Soon"}],"title":"Computer Architecture Notes"},{"children":[{"file":"digital-design/d_flipflop_tutorial.ipynb","title":"D Flip-Flops"},{"file":"digital-design/d-flip-flop-interactive.ipynb","title":"Interactive D Flip-Flop"},{"file":"digital-design/latches_flipflop_quick_ref.md","title":"Latches \u0026 Flip-Flops Quick Reference"},{"file":"digital-design/timing_diagrams_tutorial.ipynb","title":"Timing Diagrams"},{"file":"digital-design/fsm_tutorial.ipynb","title":"Finite State Machines"}],"title":"Digital Design Notes"}],"exports":[],"bibliography":[],"index":"index","pages":[{"level":1,"title":"AI Engineering Blog"},{"slug":"other-sections","title":"AI Engineering Blog","short_title":"Table of Contents","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":2,"title":"Probability"},{"slug":"index-1","title":"Probability Tutorials \u0026 Notes","short_title":"Introduction: Probability Tutorials \u0026 Notes","de
284scription":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"inclusion-exclusion-tutorial","title":"The Inclusion-Exclusion Principle","short_title":"Inclusion-Exclusion Principle","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"birthday-tutorial","title":"The Birthday Paradox","short_title":"Birthday Paradox","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"Observability"},{"slug":"index-2","title":"Observability \u0026 Anomaly Detection","short_title":"Introduction: Observability \u0026 Anomaly Detection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"Neural Networks From Scratch"},{"slug":"index-3","title":"Neural Networks From Scratch: Understanding Deep Learning From First Principles","short_title":"Introduction: Understanding Deep Learning From First Principles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-edge-detector-blog","title":"NN01 - Edge Detection Intuition: A Single Neuron as Pattern Matching","short_title":"Edge Detection Intuition: A Single Neuron as Pattern Matching","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-tutorial-blog","title":"NN02 - Training an Edge-Detection Neural Network from Scratch","short_title":"Training an Edge-Detection Neural Network from Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-flexible-network-blog","title":"NN03 - Building a Flexible Neural Network from Scratch","short_title":"Building a General Neural Network from Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-pytorch-basics","title":"NN04 â PyTorch Basics: Rebuilding the Flexible MLP","short_title":"PyTorch Basics (Flexible MLP)","description":"Rebuild the NN03 flexible network in PyTorch, introduce nn.Module, nn.Sequential, loss functions, and the standard training loop.","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Foundations"},{"slug":"index-4","title":"LLM From Scratch: Building GPT From First Principles","short_title":"Introduction: Building GPT From First Principles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l01-tokenization-from-scratch","title":"L01 - Tokenization From Scratch: Teaching Computers to Read","short_title":"L01 - Tokenization: From Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l02-embeddings-and-positional-encoding","title":"L02 - Embeddings \u0026 Positional Encoding: Giving Numbers Meaning","short_title":"L02 - Embeddings \u0026 Positional Encoding","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l03-the-attention-mechanism","title":"L03 - Self-Attention: The Search Engine of Language","short_title":"L03 - Self-Attention: Understanding Context","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l04-multi-head-attention","title":"L04 - Multi-Head Attention: The Committee of Experts","short_title":"L04 - Multi-Head Attention: Seeing in Parallel","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l05-normalization-and-residuals","title":"L05 - Normalization \u0026 Residuals: The Plumbing of Deep Networks","short_title":"L05 - Normalization \u0026 Residuals","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l06-the-causal-mask","title":"L06 - The Causal Mask: How to Stop Cheating [DRAFT]","short_title":"L06 - The Causal Mask: How to Stop Cheating","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l07-assembling-the-gpt","title":"L07 - Assembling the GPT: The Grand Finale [DRAFT]","short_title":"L07 - Assembling the GPT: The Grand Finale","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l08-architecture-design-choices","title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters","short_title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l09-training-the-llm","title":"L09 - Training the LLM: Learning to Speak [DRAFT]","short_title":"L09 - Training the LLM: Learning to Speak","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l10-inference-and-sampling","title":"L10 - Inference \u0026 Sampling: Controlling the Creativity [DRAFT]","short_title":"L10 - Inference \u0026 Sampling: Controlling the Creativity","de
284scription":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l11-fine-tuning-and-chat","title":"L11 - Fine-tuning: From Completion to Conversation [DRAFT]","short_title":"L11 - Fine-tuning: From Completion to Conversation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Production Techniques"},{"slug":"index-5","title":"LLM From Scratch: Production Techniques","short_title":"Introduction: Bridge to Production","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l12-loading-pretrained-weights","title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]","short_title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l13-data-loading-pipelines","title":"L13 - Data Loading Pipelines at Scale [DRAFT]","short_title":"L13 - Data Loading Pipelines at Scale [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l14-evaluation-frameworks","title":"L14 - Evaluation Frameworks [DRAFT]","short_title":"L14 - Evaluation Frameworks [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l15-lora-peft","title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]","short_title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l16-mixed-precision-training","title":"L16 - Mixed Precision Training [DRAFT]","short_title":"L16 - Mixed Precision Training [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Scaling \u0026 Optimization"},{"slug":"index-6","title":"LLM From Scratch: Scaling \u0026 Optimization","short_title":"Introduction: Advanced Scale \u0026 Performance","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l17-attention-optimizations","title":"L17 - Attention Optimizations [DRAFT]","short_title":"L17 - Attention Optimizations [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l18-model-parallelism","title":"L18 - Model Parallelism [DRAFT]","short_title":"L18 - Model Parallelism [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l19-long-context-handling","title":"L19 - Long Context Handling [DRAFT]","short_title":"L19 - Long Context Handling [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l20-quantization-inference","title":"L20 - Quantization for Inference [DRAFT]","short_title":"L20 - Quantization for Inference [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l21-deployment-serving","title":"L21 - Deployment \u0026 Serving [DRAFT]","short_title":"L21 - Deployment \u0026 Serving [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"ML/AI Algorithms"},{"slug":"latent-factors","title":"The Hidden Power of Latent Factors - [DRAFT]","short_title":"The Hidden Power of Latent Factors","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"als-tutorial","title":"Alternating Least Squares (ALS) for Movie Recommendations","short_title":"Alternating Least Squares (ALS) for Movie Recommendations","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"softmax-from-scores","title":"Softmax: From Scores to Probabilities","short_title":"Softmax: From Scores to Probabilities","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"tree-based-feature-importance","title":"Tree-Based Feature Importance [DRAFT]","short_title":"Tree-Based Feature Importance [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"embeddings","title":"Embeddings at Scale Book","short_title":"Embeddings at Scale Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"anomaly-detection","title":"Observability Anomaly Detection","short_title":"Observability Anomaly Detection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"sizing","title":"Sizing and TCO","short_title":"Sizing and TCO","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"probability","title":"Probability Book","short_title":"Probability Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"matrix-calculus","title":"Matrix Calculus Book","short_title":"Matrix Calculus Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"linear-algebra","title":"Learn Linear Algebra Book","short_title":"Learn Linear Algebra Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"books","title":"Other Books \u0026 Guides","short_title":"Other Books \u0026 Guides","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"opensource","title":"Open Source Work","short_title":"Open Source Work","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"external-articles","title":"External Articles","short_title":"External Articles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"talks","title":"Talks \u0026 Presentations","short_title":"Talks \u0026 Presentations","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"level":1,"title":"Other Work"},{"slug":"apps","title":"Apps","short_title":"Apps","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Computer Architecture Notes"},{"slug":"computer-architecture-coming-soon","title":"Computer Architecture","short_title":"Coming Soon","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Digital Design Notes"},{"slug":"d-flipflop-tutorial","title":"D Flip-Flops in Digital Design","short_title":"D Flip-Flops","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"d-flip-flop-interactive","title":"Interactive D Flip-Flop Visualization","short_title":"Interactive D Flip-Flop","description":"","date":"","thumbnail":"/build/d-flip-flop-v
284iz-18b8795c020a6b40dddc44553f0264e1.jpg","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"latches-flipflop-quick-ref","title":"Sequential Logic Quick Reference","short_title":"Latches \u0026 Flip-Flops Quick Reference","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"timing-diagrams-tutorial","title":"Timing Diagrams","short_title":"Timing Diagrams","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"fsm-tutorial","title":"Finite State Machines in Digital Design","short_title":"Finite State Machines","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}]}]},"CONTENT_CDN_PORT":"3100","MODE":"static"},"routes/$":{"config":{"version":3,"myst":"1.10.1","title":"Chris Snow","options":{"favicon":"/build/favicon-b17fe1a131c89ef3ffc3be56542460ec.ico","logo_text":"Chris Snow","analytics_google":"G-7E3VJX5MQJ","style":"/build/custom-d1a1614a2e8518bce0ae45db184c01f0.css"},"nav":[{"title":"GitHub","url":"https://github.com/snowch"},{"title":"LinkedIn","url":"https://www.linkedin.com/in/csnowuk/"}],"actions":[],"projects":[{"license":{"content":{"id":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/","name":"Creative Commons Attribution 4.0 International","free":true,"CC":true}},"title":"Chris Snow - Data \u0026 AI Engineering","description":"Data \u0026 AI Engineer with 25+ years in IT. Author of books on embeddings, ML, and data platforms. Creator of open source projects.","authors":[{"nameParsed":{"literal":"Chris Snow","given":"Chris","family":"Snow"},"name":"Chris Snow","url":"https://snowch.github.io","id":"contributors-myst-generated-uid-0"}],"github":"https://github.com/snowch/snowch.github.io","keywords":["data engineering","machine learning","artificial intelligence","digital design"],"id":"snowch-github-io","toc":[{"file":"index.md"},{"children":[{"file":"ai-eng/other-sections.md","title":"Table of Contents"},{"children":[{"file":"probability/index.md","title":"Introduction: Probability Tutorials \u0026 Notes"},{"file":"probability/inclusion_exclusion_tutorial.md","title":"Inclusion-Exclusion Principle"},{"file":"probability/birthday_tutorial.md","title":"Birthday Paradox"}],"title":"Probability"},{"children":[{"file":"observability/index.md","title":"Introduction: Observability \u0026 Anomaly Detection"}],"title":"Observability"},{"children":[{"file":"ai-eng/nnfs/index.md","title":"Introduction: Understanding Deep Learning From First Principles"},{"file":"ai-eng/nnfs/nn_edge_detector_blog.md","title":"Edge Detection Intuition: A Single Neuron as Pattern Matching"},{"file":"ai-eng/nnfs/nn_tutorial_blog.md","title":"Training an Edge-Detection Neural Network from Scratch"},{"file":"ai-eng/nnfs/nn_flexible_network_blog.md","title":"Building a General Neural Network from Scratch"},{"file":"ai-eng/nnfs/nn_pytorch_basics.md","title":"PyTorch Basics (Flexible MLP)"}],"title":"Neural Networks From Scratch"},{"children":[{"file":"ai-eng/llmfs/index.md","title":"Introduction: Building GPT From First Principles"},{"file":"ai-eng/llmfs/L01_Tokenization_From_Scratch.md","title":"L01 - Tokenization: From Scratch"},{"file":"ai-eng/llmfs/L02_Embeddings_and_Positional_Encoding.md","title":"L02 - Embeddings \u0026 Positional Encoding"},{"file":"ai-eng/llmfs/L03_The_Attention_Mechanism.md","title":"L03 - Self-Attention: Understanding Context"},{"file":"ai-eng/llmfs/L04_Multi_Head_Attention.md","title":"L04 - Multi-Head Attention: Seeing in Parallel"},{"file":"ai-eng/llmfs/L05_Normalization_and_Residuals.md","title":"L05 - Normalization \u0026 Residuals"},{"file":"ai-eng/llmfs/L06_The_Causal_Mask.md","title":"L06 - The Causal Mask: How to Stop Cheating"},{"file":"ai-eng/llmfs/L07_Assembling_the_GPT.md","title":"L07 - Assembling the GPT: The Grand Finale"},{"file":"ai-eng/llmfs/L08_Architecture_Design_Choices.md","title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters"},{"file":"ai-eng/llmfs/L09_Training_the_LLM.md","title":"L09 - Training the LLM: Learning to Speak"},{"file":"ai-eng/llmfs/L10_Inference_and_Sampling.md","title":"L10 - Inference \u0026 Sampling: Controlling the Creativity"},{"file":"ai-eng/llmfs/L11_Fine_tuning_and_Chat.md","title":"L11 - Fine-tuning: From Completion to Conversation"}],"title":"LLM From Scratch: Foundations"},{"children":[{"file":"ai-eng/llmfs-production/index.md","title":"Introduction: Bridge to Production"},{"file":"ai-eng/llmfs-production/L12_Loading_Pretrained_Weights.md","title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]"},{"file":"ai-eng/llmfs-production/L13_Data_Loading_Pipelines.md","title":"L13 - Data Loading Pipelines at Scale [DRAFT]"},{"file":"ai-eng/llmfs-production/L14_Evaluation_Frameworks.md","title":"L14 - Evaluation Frameworks [DRAFT]"},{"file":"ai-eng/llmfs-production/L15_LoRA_PEFT.md","title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]"},{"file":"ai-eng/llmfs-production/L16_Mixed_Precision_Training.md","title":"L16 - Mixed Precision Training [DRAFT]"}],"title":"LLM From Scratch: Production Techniques"},{"children":[{"file":"ai-eng/llmfs-scaling/index.md","title":"Introduction: Advanced Scale \u0026 Performance"},{"file":"ai-eng/llmfs-scaling/L17_Attention_Optimizations.md","title":"L17 - Attention Optimizations [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L18_Model_Parallelism.md","title":"L18 - Model Parallelism [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L19_Long_Context_Handling.md","title":"L19 - Long Context Handling [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L20_Quantization_Inference.md","title":"L20 - Quantization for Inference [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L21_Deployment_Serving.md","title":"L21 - Deployment \u0026 Serving [DRAFT]"}],"title":"LLM From Scratch: Scaling \u0026 Optimization"},{"children":[{"file":"ai-eng/ml-algorithms/latent_factors.md","title":"The Hidden Power of Latent Factors"},{"file":"ai-eng/ml-algorithms/als_tutorial.md","title":"Alternating Least Squares (ALS) for Movie Recommendations"},{"file":"ai-eng/ml-algorithms/softmax_from_scores.md","title":"Softmax: From Scores to Probabilities"},{"file":"ai-eng/ml-algorithms/tree_based_feature_importance.md","title":"Tree-Based Feature Importance [DRAFT]"}],"title":"ML/AI Algorithms"}],"title":"AI Engineering Blog"},{"file":"embeddings.md","title":"Embeddings at Scale Book"},{"file":"anomaly-detection.md","title":"Observability Anomaly Detection"},{"file":"sizing.md","title":"Sizing and TCO"},{"file":"probability/probability.md","title":"Probability Book"},{"file":"matrix-calculus.md","title":"Matrix Calculus Book"},{"file":"linear-algebra.md","title":"Learn Linear Algebra Book"},{"file":"books.md","title":"Other Books \u0026 Guides"},{"file":"opensource.md","title":"Open Source Work"},{"file":"external-articles.md","title":"External Articles"},{"file":"talks.md","title":"Talks \u0026 Presentations"},{"children":[{"file":"apps.md","title":"Apps"}],"title":"Other Work"},{"children":[{"file":"computer-architecture/computer_architecture_coming_soon.md","title":"Coming Soon"}],"title":"Computer Architecture Notes"},{"children":[{"file":"digital-design/d_flipflop_tutorial.ipynb","title":"D Flip-Flops"},{"file":"digital-design/d-flip-flop-interactive.ipynb","title":"Interactive D Flip-Flop"},{"file":"digital-design/latches_flipflop_quick_ref.md","title":"Latches \u0026 Flip-Flops Quick Reference"},{"file":"digital-design/timing_diagrams_tutorial.ipynb","title":"Timing Diagrams"},{"file":"digital-design/fsm_tutorial.ipynb","title":"Finite State Machines"}],"title":"Digital Design Notes"}],"exports":[],"bibliography":[],"index":"index","pages":[{"level":1,"title":"AI Engineering Blog"},{"slug":"other-sections","title":"AI Engineering Blog","short_title":"Table of Contents","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":2,"title":"Probability"},{"slug":"index-1","title":"Probability Tutorials \u0026 Notes","short_title":"Introduction: Probability Tutorials \u0026 Notes","de
284scription":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"inclusion-exclusion-tutorial","title":"The Inclusion-Exclusion Principle","short_title":"Inclusion-Exclusion Principle","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"birthday-tutorial","title":"The Birthday Paradox","short_title":"Birthday Paradox","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"Observability"},{"slug":"index-2","title":"Observability \u0026 Anomaly Detection","short_title":"Introduction: Observability \u0026 Anomaly Detection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"Neural Networks From Scratch"},{"slug":"index-3","title":"Neural Networks From Scratch: Understanding Deep Learning From First Principles","short_title":"Introduction: Understanding Deep Learning From First Principles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-edge-detector-blog","title":"NN01 - Edge Detection Intuition: A Single Neuron as Pattern Matching","short_title":"Edge Detection Intuition: A Single Neuron as Pattern Matching","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-tutorial-blog","title":"NN02 - Training an Edge-Detection Neural Network from Scratch","short_title":"Training an Edge-Detection Neural Network from Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-flexible-network-blog","title":"NN03 - Building a Flexible Neural Network from Scratch","short_title":"Building a General Neural Network from Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-pytorch-basics","title":"NN04 â PyTorch Basics: Rebuilding the Flexible MLP","short_title":"PyTorch Basics (Flexible MLP)","description":"Rebuild the NN03 flexible network in PyTorch, introduce nn.Module, nn.Sequential, loss functions, and the standard training loop.","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Foundations"},{"slug":"index-4","title":"LLM From Scratch: Building GPT From First Principles","short_title":"Introduction: Building GPT From First Principles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l01-tokenization-from-scratch","title":"L01 - Tokenization From Scratch: Teaching Computers to Read","short_title":"L01 - Tokenization: From Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l02-embeddings-and-positional-encoding","title":"L02 - Embeddings \u0026 Positional Encoding: Giving Numbers Meaning","short_title":"L02 - Embeddings \u0026 Positional Encoding","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l03-the-attention-mechanism","title":"L03 - Self-Attention: The Search Engine of Language","short_title":"L03 - Self-Attention: Understanding Context","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l04-multi-head-attention","title":"L04 - Multi-Head Attention: The Committee of Experts","short_title":"L04 - Multi-Head Attention: Seeing in Parallel","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l05-normalization-and-residuals","title":"L05 - Normalization \u0026 Residuals: The Plumbing of Deep Networks","short_title":"L05 - Normalization \u0026 Residuals","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l06-the-causal-mask","title":"L06 - The Causal Mask: How to Stop Cheating [DRAFT]","short_title":"L06 - The Causal Mask: How to Stop Cheating","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l07-assembling-the-gpt","title":"L07 - Assembling the GPT: The Grand Finale [DRAFT]","short_title":"L07 - Assembling the GPT: The Grand Finale","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l08-architecture-design-choices","title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters","short_title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l09-training-the-llm","title":"L09 - Training the LLM: Learning to Speak [DRAFT]","short_title":"L09 - Training the LLM: Learning to Speak","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l10-inference-and-sampling","title":"L10 - Inference \u0026 Sampling: Controlling the Creativity [DRAFT]","short_title":"L10 - Inference \u0026 Sampling: Controlling the Creativity","de
284scription":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l11-fine-tuning-and-chat","title":"L11 - Fine-tuning: From Completion to Conversation [DRAFT]","short_title":"L11 - Fine-tuning: From Completion to Conversation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Production Techniques"},{"slug":"index-5","title":"LLM From Scratch: Production Techniques","short_title":"Introduction: Bridge to Production","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l12-loading-pretrained-weights","title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]","short_title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l13-data-loading-pipelines","title":"L13 - Data Loading Pipelines at Scale [DRAFT]","short_title":"L13 - Data Loading Pipelines at Scale [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l14-evaluation-frameworks","title":"L14 - Evaluation Frameworks [DRAFT]","short_title":"L14 - Evaluation Frameworks [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l15-lora-peft","title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]","short_title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l16-mixed-precision-training","title":"L16 - Mixed Precision Training [DRAFT]","short_title":"L16 - Mixed Precision Training [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Scaling \u0026 Optimization"},{"slug":"index-6","title":"LLM From Scratch: Scaling \u0026 Optimization","short_title":"Introduction: Advanced Scale \u0026 Performance","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l17-attention-optimizations","title":"L17 - Attention Optimizations [DRAFT]","short_title":"L17 - Attention Optimizations [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l18-model-parallelism","title":"L18 - Model Parallelism [DRAFT]","short_title":"L18 - Model Parallelism [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l19-long-context-handling","title":"L19 - Long Context Handling [DRAFT]","short_title":"L19 - Long Context Handling [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l20-quantization-inference","title":"L20 - Quantization for Inference [DRAFT]","short_title":"L20 - Quantization for Inference [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l21-deployment-serving","title":"L21 - Deployment \u0026 Serving [DRAFT]","short_title":"L21 - Deployment \u0026 Serving [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"ML/AI Algorithms"},{"slug":"latent-factors","title":"The Hidden Power of Latent Factors - [DRAFT]","short_title":"The Hidden Power of Latent Factors","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"als-tutorial","title":"Alternating Least Squares (ALS) for Movie Recommendations","short_title":"Alternating Least Squares (ALS) for Movie Recommendations","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"softmax-from-scores","title":"Softmax: From Scores to Probabilities","short_title":"Softmax: From Scores to Probabilities","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"tree-based-feature-importance","title":"Tree-Based Feature Importance [DRAFT]","short_title":"Tree-Based Feature Importance [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"embeddings","title":"Embeddings at Scale Book","short_title":"Embeddings at Scale Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"anomaly-detection","title":"Observability Anomaly Detection","short_title":"Observability Anomaly Detection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"sizing","title":"Sizing and TCO","short_title":"Sizing and TCO","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"probability","title":"Probability Book","short_title":"Probability Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"matrix-calculus","title":"Matrix Calculus Book","short_title":"Matrix Calculus Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"linear-algebra","title":"Learn Linear Algebra Book","short_title":"Learn Linear Algebra Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"books","title":"Other Books \u0026 Guides","short_title":"Other Books \u0026 Guides","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"opensource","title":"Open Source Work","short_title":"Open Source Work","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"external-articles","title":"External Articles","short_title":"External Articles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"talks","title":"Talks \u0026 Presentations","short_title":"Talks \u0026 Presentations","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"level":1,"title":"Other Work"},{"slug":"apps","title":"Apps","short_title":"Apps","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Computer Architecture Notes"},{"slug":"computer-architecture-coming-soon","title":"Computer Architecture","short_title":"Coming Soon","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Digital Design Notes"},{"slug":"d-flipflop-tutorial","title":"D Flip-Flops in Digital Design","short_title":"D Flip-Flops","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"d-flip-flop-interactive","title":"Interactive D Flip-Flop Visualization","short_title":"Interactive D Flip-Flop","description":"","date":"","thumbnail":"/build/d-flip-flop-v
284iz-18b8795c020a6b40dddc44553f0264e1.jpg","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"latches-flipflop-quick-ref","title":"Sequential Logic Quick Reference","short_title":"Latches \u0026 Flip-Flops Quick Reference","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"timing-diagrams-tutorial","title":"Timing Diagrams","short_title":"Timing Diagrams","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"fsm-tutorial","title":"Finite State Machines in Digital Design","short_title":"Finite State Machines","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}]}]},"page":{"version":3,"kind":"Article","sha256":"ef1cdd2b0c43d9345393638061581e7a9f6931682c86b1c567edc0cc694b58fe","slug":"sizing","location":"/sizing.md","dependencies":[],"frontmatter":{"title":"Sizing and TCO","content_includes_title":false,"authors":[{"nameParsed":{"literal":"Chris Snow","given":"Chris","family":"Snow"},"name":"Chris Snow","url":"https://snowch.github.io","id":"contributors-myst-generated-uid-0"}],"license":{"content":{"id":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/","name":"Creative Commons Attribution 4.0 International","free":true,"CC":true}},"github":"https://github.com/snowch/snowch.github.io","keywords":["data engineering","machine learning","artificial intelligence","digital design"],"source_url":"https://github.com/snowch/snowch.github.io/blob/main/sizing.md","edit_url":"https://github.com/snowch/snowch.github.io/edit/main/sizing.md","exports":[{"format":"md","filename":"sizing.md","url":"/build/sizing-697edfcbbcc12eb5b42210018b438e1d.md"}]},"mdast":{"type":"root","children":[{"type":"block","children":[{"type":"paragraph","position":{"start":{"line":3,"column":1},"end":{"line":3,"column":1}},"children":[{"type":"text","value":"Capacity planning, sizing and total cost of ownership, modelled as code. A self-study book and toolkit built around one question â how big, how much, and how wrong could I be? â and one rule for answering it: every number says where it came from.","position":{"start":{"line":3,"column":1},"end":{"line":3,"column":1}}
284,"key":"m0c6Ljxmv5"}],"key":"MJtPRky4AF"},{"type":"heading","depth":2,"position":{"start":{"line":5,"column":1},"end":{"line":5,"column":1}},"children":[{"type":"text","value":"Topics Covered","position":{"start":{"line":5,"column":1},"end":{"line":5,"column":1}},"key":"o4CWnVyrHP"}],"identifier":"topics-covered","label":"Topics Covered","html_id":"topics-covered","implicit":true,"key":"UzmyvMeCv5"},{"type":"list","ordered":false,"spread":false,"position":{"start":{"line":7,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"listItem","spread":true,"position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"children":[{"type":"text","value":"What Youâre Sizing","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}},"key":"NmJTBCtHhA"}],"key":"MyJKgVNvg4"},{"type":"text","value":": point estimates, what a workload is, where the numbers come from, peak, mean and growth","position":{"start":{"line":7,"column":1},"end":{"line":7,"column":1}}
284,"key":"d6ghC0aJD9"}],"key":"nO4ZcS6x7j"}],"key":"L7DZRuXeRg"},{"type":"listItem","spread":true,"position":{"start":{"line":8,"column":1},"end":{"line":8,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":8,"column":1},"end":{"line":8,"column":1}},"children":[{"type":"text","value":"Ceilings","position":{"start":{"line":8,"column":1},"end":{"line":8,"column":1}},"key":"TvhLPBFXoH"}],"key":"K96iMNpGTT"},{"type":"text","value":": Littleâs Law, queueing and the knee, when adding servers stops helping, regime changes","position":{"start":{"line":8,"column":1},"end":{"line":8,"column":1}},"key":"Vc1qHDPTJz"}],"key":"GkebarpPAO"}],"key":"eqM3LcosI2"},{"type":"listItem","spread":true,"position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"children":[{"type":"text","value":"Sizing","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}}
284,"key":"zjpOt6VEsO"}],"key":"R7eZbtmucM"},{"type":"text","value":": capacity, bandwidth and the binding constraint, headroom and failure domains","position":{"start":{"line":9,"column":1},"end":{"line":9,"column":1}},"key":"q3IxuX33n8"}],"key":"sxl4QNL5mF"}],"key":"eTPb5bYFF7"},{"type":"listItem","spread":true,"position":{"start":{"line":10,"column":1},"end":{"line":10,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":10,"column":1},"end":{"line":10,"column":1}},"children":[{"type":"text","value":"Uncertainty","position":{"start":{"line":10,"column":1},"end":{"line":10,"column":1}},"key":"uOOUTlZGAz"}],"key":"H89QNkjcA5"},{"type":"text","value":": Monte Carlo from first principles, correlation and convergence","position":{"start":{"line":10,"column":1},"end":{"line":10,"column":1}},"key":"e5d2oc6LxC"}],"key":"SlTAWXuKiv"}],"key":"YPwZ1Imebi"},{"type":"listItem","spread":true,"position":{"start":{"line":11,"column":1},"end":{"line":11,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":11,"column":1},"end":{"line":11,"column":1}},"children":[{"type":"text","value":"Cost","position":{"start":{"line":11,"column":1},"end":{"line":11,"column":1}}
284,"key":"lAZG3acFKD"}],"key":"D5FZrQArvc"},{"type":"text","value":": capex, opex and lifecycle, power first, unit economics, the five-year model","position":{"start":{"line":11,"column":1},"end":{"line":11,"column":1}},"key":"kcMFQAqLm2"}],"key":"ApJqdU7VQr"}],"key":"CowOHmTOAv"},{"type":"listItem","spread":true,"position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"children":[{"type":"text","value":"Sensitivity","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"key":"VwKih5T3ei"}],"key":"ofFEk3h50K"},{"type":"text","value":": which input is really the answer, and the missing node","position":{"start":{"line":12,"column":1},"end":{"line":12,"column":1}},"key":"fDBiTpzG1J"}],"key":"BZO9vmjy5v"}],"key":"W7tHUpfvU4"},{"type":"listItem","spread":true,"position":{"start":{"line":13,"column":1},"end":{"line":13,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":13,"column":1},"end":{"line":13,"column":1}},"children":[{"type":"text","value":"Presenting It","position":{"start":{"line":13,"column":1},"end":{"line":13,"column":1}}
284,"key":"Bssdr8fqHI"}],"key":"Rm6EIej7wJ"},{"type":"text","value":": a TCO for finance, and comparing two TCOs","position":{"start":{"line":13,"column":1},"end":{"line":13,"column":1}},"key":"nkZBi6PINK"}],"key":"dBaz5KAfCf"}],"key":"Dz5ZGLXhCa"},{"type":"listItem","spread":true,"position":{"start":{"line":14,"column":1},"end":{"line":15,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"children":[{"type":"text","value":"Appendices","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"key":"g5IGUyP52x"}],"key":"ZTkt0B0aYu"},{"type":"text","value":": DSL reference, the Monte Carlo module, distributions, units, two worked models, glossary","position":{"start":{"line":14,"column":1},"end":{"line":14,"column":1}},"key":"LjmUzBbURE"}],"key":"AQ3TLu1kuH"}],"key":"EiIu4EbyKO"}],"key":"RpLt3rcu8s"},{"type":"heading","depth":2,"position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}},"children":[{"type":"text","value":"What Makes It Different","position":{"start":{"line":16,"column":1},"end":{"line":16,"column":1}}
284,"key":"cRBbZiAd5k"}],"identifier":"what-makes-it-different","label":"What Makes It Different","html_id":"what-makes-it-different","implicit":true,"key":"o35TQdyve6"},{"type":"list","ordered":false,"spread":false,"position":{"start":{"line":18,"column":1},"end":{"line":23,"column":1}},"children":[{"type":"listItem","spread":true,"position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"children":[{"type":"text","value":"Models are code","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"key":"GmGgV4yeim"}],"key":"iC9KAT5bqm"},{"type":"text","value":" â a model is a graph of named quantities in a YAML file, evaluated and version controlled like anything else","position":{"start":{"line":18,"column":1},"end":{"line":18,"column":1}},"key":"FsyWL2nU85"}],"key":"in4FYbXf5l"}],"key":"oKhnBPoea1"},{"type":"listItem","spread":true,"position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"children":[{"type":"text","value":"Units fail the build","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}}
284,"key":"jEabOM8Qmk"}],"key":"LErNCOP26D"},{"type":"text","value":" â every node declares a unit, so a model that multiplies the wrong two things is rejected rather than published","position":{"start":{"line":19,"column":1},"end":{"line":19,"column":1}},"key":"oB3s9WKsp4"}],"key":"OR9vJYTE4O"}],"key":"R31VrwtqUp"},{"type":"listItem","spread":true,"position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"children":[{"type":"text","value":"Provenance is mandatory","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"key":"zRUUbXIli9"}],"key":"qJiqzrsgVr"},{"type":"text","value":" â every input declares whether it is a measured fact, a vendorâs claim, or an assumption","position":{"start":{"line":20,"column":1},"end":{"line":20,"column":1}},"key":"KAZrbCZemZ"}],"key":"zDtWI7JV0c"}],"key":"cTzsseRWLI"},{"type":"listItem","spread":true,"position":{"start":{"line":21,"column":1},"end":{"line":21,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":21,"column":1},"end":{"line":21,"column":1}},"children":[{"type":"text","value":"Gaps stay visible","position":{"start":{"line":21,"column":1},"end":{"line":21,"column":1}}
284,"key":"oK0lF4cCwx"}],"key":"QzTg9vtqRR"},{"type":"text","value":" â a constant nobody has measured leaves the nodes below it empty instead of quietly filled in","position":{"start":{"line":21,"column":1},"end":{"line":21,"column":1}},"key":"nl123oygCE"}],"key":"Pcuw8Ul1Z0"}],"key":"EkNAITqGmu"},{"type":"listItem","spread":true,"position":{"start":{"line":22,"column":1},"end":{"line":23,"column":1}},"children":[{"type":"paragraph","children":[{"type":"strong","position":{"start":{"line":22,"column":1},"end":{"line":22,"column":1}},"children":[{"type":"text","value":"Monte Carlo from scratch","position":{"start":{"line":22,"column":1},"end":{"line":22,"column":1}},"key":"HcSO4xHiGo"}],"key":"MoGw8EcMTy"},{"type":"text","value":" â inverse-transform sampling, rank correlation and convergence written to be read, not called","position":{"start":{"line":22,"column":1},"end":{"line":22,"column":1}},"key":"kB3Ipro9Wl"}],"key":"PbQZ12JEXl"}],"key":"GBQiQFQ0Z4"}],"key":"LESMtYnQfd"},{"type":"heading","depth":2,"position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}},"children":[{"type":"text","value":"Access the Full Book","position":{"start":{"line":24,"column":1},"end":{"line":24,"column":1}}
284,"key":"LfYsg83eJE"}],"identifier":"access-the-full-book","label":"Access the Full Book","html_id":"access-the-full-book","implicit":true,"key":"iBVCSYpk6M"},{"type":"paragraph","position":{"start":{"line":26,"column":1},"end":{"line":26,"column":1}},"children":[{"type":"strong","position":{"start":{"line":26,"column":1},"end":{"line":26,"column":1}},"children":[{"type":"link","url":"https://snowch.github.io/sizing-and-tco/","position":{"start":{"line":26,"column":1},"end":{"line":26,"column":1}},"children":[{"type":"text","value":"Sizing and TCO â","position":{"start":{"line":26,"column":1},"end":{"line":26,"column":1}},"key":"OGSKzlxapo"}],"urlSource":"https://snowch.github.io/sizing-and-tco/","key":"wpzSBQNF9w"}],"key":"Be1NBuNYT3"}],"key":"MlqeX2ljb4"},{"type":"paragraph","position":{"start":{"line":28,"column":1},"end":{"line":28,"column":1}},"children":[{"type":"text","value":"The complete book is available as an interactive resource, with worked models you can adjust and re-run in the browser. Source and toolkit on ","position":{"start":{"line":28,"column":1},"end":{"line":28,"column":1}}
284,"key":"NbdZXOM306"},{"type":"link","url":"https://github.com/snowch/sizing-and-tco","position":{"start":{"line":28,"column":1},"end":{"line":28,"column":1}},"children":[{"type":"text","value":"GitHub","position":{"start":{"line":28,"column":1},"end":{"line":28,"column":1}},"key":"zGTN0chV0E"}],"urlSource":"https://github.com/snowch/sizing-and-tco","error":true,"key":"Hd608NLvmG"},{"type":"text","value":".","position":{"start":{"line":28,"column":1},"end":{"line":28,"column":1}},"key":"U13vKTnj55"}],"key":"w7Q2ElgVby"}],"key":"PjCbN2MARa"}],"key":"Ltw0KGtoYs"},"references":{"cite":{"order":[],"data":{}}},"footer":{"navigation":{"prev":{"title":"Observability Anomaly Detection","short_title":"Observability Anomaly Detection","url":"/anomaly-detection","group":"ML/AI Algorithms"},"next":{"title":"Probability Book","short_title":"Probability Book","url":"/probability","group":"ML/AI Algorithms"}}},"domain":"http://localhost:3000"},"project":{"license":{"content":{"id":"CC-BY-4.0","url":"https://creativecommons.org/licenses/by/4.0/","name":"Creative Commons Attribution 4.0 International","free":true,"CC":true}},"title":"Chris Snow - Data \u0026 AI Engineering","description":"Data \u0026 AI Engineer with 25+ years in IT. Author of books on embeddings, ML, and data platforms. Creator of open source projects.","authors":[{"nameParsed":{"literal":"Chris Snow","given":"Chris","family":"Snow"},"name":"Chris Snow","url":"https://snowch.github.io","id":"contributors-myst-generated-uid-0"}],"github":"https://github.com/snowch/snowch.github.io","keywords":["data engineering","machine learning","artificial intelligence","digital design"],"id":"snowch-github-io","toc":[{"file":"index.md"},{"children":[{"file":"ai-eng/other-sections.md","title":"Table of Contents"},{"children":[{"file":"probability/index.md","title":"Introduction: Probability Tutorials \u0026 Notes"},{"file":"probability/inclusion_exclusion_tutorial.md","title":"Inclusion-Exclusion Principle"},{"file":"probability/birthday_tutorial.md","title":"Birthday Paradox"}],"title":"Probability"},{"children":[{"file":"observability/index.md","title":"Introduction: Observability \u0026 Anomaly Detection"}],"title":"Observability"},{"children":[{"file":"ai-eng/nnfs/index.md","title":"Introduction: Understanding Deep Learning From First Principles"},{"file":"ai-eng/nnfs/nn_edge_detector_blog.md","title":"Edge Detection Intuition: A Single Neuron as Pattern Matching"},{"file":"ai-eng/nnfs/nn_tutorial_blog.md","title":"Training an Edge-Detection Neural Network from Scratch"},{"file":"ai-eng/nnfs/nn_flexible_network_blog.md","title":"Building a General Neural Network from Scratch"},{"file":"ai-eng/nnfs/nn_pytorch_basics.md","title":"PyTorch Basics (Flexible MLP)"}],"title":"Neural Networks From Scratch"},{"children":[{"file":"ai-eng/llmfs/index.md","title":"Introduction: Building GPT From First Principles"},{"file":"ai-eng/llmfs/L01_Tokenization_From_Scratch.md","title":"L01 - Tokenization: From Scratch"},{"file":"ai-eng/llmfs/L02_Embeddings_and_Positional_Encoding.md","title":"L02 - Embeddings \u0026 Positional Encoding"},{"file":"ai-eng/llmfs/L03_The_Attention_Mechanism.md","title":"L03 - Self-Attention: Understanding Context"},{"file":"ai-eng/llmfs/L04_Multi_Head_Attention.md","title":"L04 - Multi-Head Attention: Seeing in Parallel"},{"file":"ai-eng/llmfs/L05_Normalization_and_Residuals.md","title":"L05 - Normalization \u0026 Residuals"},{"file":"ai-eng/llmfs/L06_The_Causal_Mask.md","title":"L06 - The Causal Mask: How to Stop Cheating"},{"file":"ai-eng/llmfs/L07_Assembling_the_GPT.md","title":"L07 - Assembling the GPT: The Grand Finale"},{"file":"ai-eng/llmfs/L08_Architecture_Design_Choices.md","title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters"},{"file":"ai-eng/llmfs/L09_Training_the_LLM.md","title":"L09 - Training the LLM: Learning to Speak"},{"file":"ai-eng/llmfs/L10_Inference_and_Sampling.md","title":"L10 - Inference \u0026 Sampling: Controlling the Creativity"},{"file":"ai-eng/llmfs/L11_Fine_tuning_and_Chat.md","title":"L11 - Fine-tuning: From Completion to Conversation"}],"title":"LLM From Scratch: Foundations"},{"children":[{"file":"ai-eng/llmfs-production/index.md","title":"Introduction: Bridge to Production"},{"file":"ai-eng/llmfs-production/L12_Loading_Pretrained_Weights.md","title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]"},{"file":"ai-eng/llmfs-production/L13_Data_Loading_Pipelines.md","title":"L13 - Data Loading Pipelines at Scale [DRAFT]"},{"file":"ai-eng/llmfs-production/L14_Evaluation_Frameworks.md","title":"L14 - Evaluation Frameworks [DRAFT]"},{"file":"ai-eng/llmfs-production/L15_LoRA_PEFT.md","title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]"},{"file":"ai-eng/llmfs-production/L16_Mixed_Precision_Training.md","title":"L16 - Mixed Precision Training [DRAFT]"}],"title":"LLM From Scratch: Production Techniques"},{"children":[{"file":"ai-eng/llmfs-scaling/index.md","title":"Introduction: Advanced Scale \u0026 Performance"},{"file":"ai-eng/llmfs-scaling/L17_Attention_Optimizations.md","title":"L17 - Attention Optimizations [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L18_Model_Parallelism.md","title":"L18 - Model Parallelism [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L19_Long_Context_Handling.md","title":"L19 - Long Context Handling [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L20_Quantization_Inference.md","title":"L20 - Quantization for Inference [DRAFT]"},{"file":"ai-eng/llmfs-scaling/L21_Deployment_Serving.md","title":"L21 - Deployment \u0026 Serving [DRAFT]"}],"title":"LLM From Scratch: Scaling \u0026 Optimization"},{"children":[{"file":"ai-eng/ml-algorithms/latent_factors.md","title":"The Hidden Power of Latent Factors"},{"file":"ai-eng/ml-algorithms/als_tutorial.md","title":"Alternating Least Squares (ALS) for Movie Recommendations"},{"file":"ai-eng/ml-algorithms/softmax_from_scores.md","title":"Softmax: From Scores to Probabilities"},{"file":"ai-eng/ml-algorithms/tree_based_feature_importance.md","title":"Tree-Based Feature Importance [DRAFT]"}],"title":"ML/AI Algorithms"}],"title":"AI Engineering Blog"},{"file":"embeddings.md","title":"Embeddings at Scale Book"},{"file":"anomaly-detection.md","title":"Observability Anomaly Detection"},{"file":"sizing.md","title":"Sizing and TCO"},{"file":"probability/probability.md","title":"Probability Book"},{"file":"matrix-calculus.md","title":"Matrix Calculus Book"},{"file":"linear-algebra.md","title":"Learn Linear Algebra Book"},{"file":"books.md","title":"Other Books \u0026 Guides"},{"file":"opensource.md","title":"Open Source Work"},{"file":"external-articles.md","title":"External Articles"},{"file":"talks.md","title":"Talks \u0026 Presentations"},{"children":[{"file":"apps.md","title":"Apps"}],"title":"Other Work"},{"children":[{"file":"computer-architecture/computer_architecture_coming_soon.md","title":"Coming Soon"}],"title":"Computer Architecture Notes"},{"children":[{"file":"digital-design/d_flipflop_tutorial.ipynb","title":"D Flip-Flops"},{"file":"digital-design/d-flip-flop-interactive.ipynb","title":"Interactive D Flip-Flop"},{"file":"digital-design/latches_flipflop_quick_ref.md","title":"Latches \u0026 Flip-Flops Quick Reference"},{"file":"digital-design/timing_diagrams_tutorial.ipynb","title":"Timing Diagrams"},{"file":"digital-design/fsm_tutorial.ipynb","title":"Finite State Machines"}],"title":"Digital Design Notes"}],"exports":[],"bibliography":[],"index":"index","pages":[{"level":1,"title":"AI Engineering Blog"},{"slug":"other-sections","title":"AI Engineering Blog","short_title":"Table of Contents","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":2,"title":"Probability"},{"slug":"index-1","title":"Probability Tutorials \u0026 Notes","short_title":"Introduction: Probability Tutorials \u0026 Notes","de
284scription":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"inclusion-exclusion-tutorial","title":"The Inclusion-Exclusion Principle","short_title":"Inclusion-Exclusion Principle","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"birthday-tutorial","title":"The Birthday Paradox","short_title":"Birthday Paradox","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"Observability"},{"slug":"index-2","title":"Observability \u0026 Anomaly Detection","short_title":"Introduction: Observability \u0026 Anomaly Detection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"Neural Networks From Scratch"},{"slug":"index-3","title":"Neural Networks From Scratch: Understanding Deep Learning From First Principles","short_title":"Introduction: Understanding Deep Learning From First Principles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-edge-detector-blog","title":"NN01 - Edge Detection Intuition: A Single Neuron as Pattern Matching","short_title":"Edge Detection Intuition: A Single Neuron as Pattern Matching","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-tutorial-blog","title":"NN02 - Training an Edge-Detection Neural Network from Scratch","short_title":"Training an Edge-Detection Neural Network from Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-flexible-network-blog","title":"NN03 - Building a Flexible Neural Network from Scratch","short_title":"Building a General Neural Network from Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"nn-pytorch-basics","title":"NN04 â PyTorch Basics: Rebuilding the Flexible MLP","short_title":"PyTorch Basics (Flexible MLP)","description":"Rebuild the NN03 flexible network in PyTorch, introduce nn.Module, nn.Sequential, loss functions, and the standard training loop.","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Foundations"},{"slug":"index-4","title":"LLM From Scratch: Building GPT From First Principles","short_title":"Introduction: Building GPT From First Principles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l01-tokenization-from-scratch","title":"L01 - Tokenization From Scratch: Teaching Computers to Read","short_title":"L01 - Tokenization: From Scratch","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l02-embeddings-and-positional-encoding","title":"L02 - Embeddings \u0026 Positional Encoding: Giving Numbers Meaning","short_title":"L02 - Embeddings \u0026 Positional Encoding","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l03-the-attention-mechanism","title":"L03 - Self-Attention: The Search Engine of Language","short_title":"L03 - Self-Attention: Understanding Context","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l04-multi-head-attention","title":"L04 - Multi-Head Attention: The Committee of Experts","short_title":"L04 - Multi-Head Attention: Seeing in Parallel","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l05-normalization-and-residuals","title":"L05 - Normalization \u0026 Residuals: The Plumbing of Deep Networks","short_title":"L05 - Normalization \u0026 Residuals","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l06-the-causal-mask","title":"L06 - The Causal Mask: How to Stop Cheating [DRAFT]","short_title":"L06 - The Causal Mask: How to Stop Cheating","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l07-assembling-the-gpt","title":"L07 - Assembling the GPT: The Grand Finale [DRAFT]","short_title":"L07 - Assembling the GPT: The Grand Finale","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l08-architecture-design-choices","title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters","short_title":"L08 - Architecture Design Choices: Choosing Your Hyperparameters","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l09-training-the-llm","title":"L09 - Training the LLM: Learning to Speak [DRAFT]","short_title":"L09 - Training the LLM: Learning to Speak","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l10-inference-and-sampling","title":"L10 - Inference \u0026 Sampling: Controlling the Creativity [DRAFT]","short_title":"L10 - Inference \u0026 Sampling: Controlling the Creativity","de
284scription":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l11-fine-tuning-and-chat","title":"L11 - Fine-tuning: From Completion to Conversation [DRAFT]","short_title":"L11 - Fine-tuning: From Completion to Conversation","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Production Techniques"},{"slug":"index-5","title":"LLM From Scratch: Production Techniques","short_title":"Introduction: Bridge to Production","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l12-loading-pretrained-weights","title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]","short_title":"L12 - Loading Pretrained Weights \u0026 Transfer Learning [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l13-data-loading-pipelines","title":"L13 - Data Loading Pipelines at Scale [DRAFT]","short_title":"L13 - Data Loading Pipelines at Scale [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l14-evaluation-frameworks","title":"L14 - Evaluation Frameworks [DRAFT]","short_title":"L14 - Evaluation Frameworks [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l15-lora-peft","title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]","short_title":"L15 - Parameter-Efficient Fine-Tuning (LoRA) [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l16-mixed-precision-training","title":"L16 - Mixed Precision Training [DRAFT]","short_title":"L16 - Mixed Precision Training [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"LLM From Scratch: Scaling \u0026 Optimization"},{"slug":"index-6","title":"LLM From Scratch: Scaling \u0026 Optimization","short_title":"Introduction: Advanced Scale \u0026 Performance","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l17-attention-optimizations","title":"L17 - Attention Optimizations [DRAFT]","short_title":"L17 - Attention Optimizations [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l18-model-parallelism","title":"L18 - Model Parallelism [DRAFT]","short_title":"L18 - Model Parallelism [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l19-long-context-handling","title":"L19 - Long Context Handling [DRAFT]","short_title":"L19 - Long Context Handling [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l20-quantization-inference","title":"L20 - Quantization for Inference [DRAFT]","short_title":"L20 - Quantization for Inference [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"l21-deployment-serving","title":"L21 - Deployment \u0026 Serving [DRAFT]","short_title":"L21 - Deployment \u0026 Serving [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"level":2,"title":"ML/AI Algorithms"},{"slug":"latent-factors","title":"The Hidden Power of Latent Factors - [DRAFT]","short_title":"The Hidden Power of Latent Factors","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"als-tutorial","title":"Alternating Least Squares (ALS) for Movie Recommendations","short_title":"Alternating Least Squares (ALS) for Movie Recommendations","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"softmax-from-scores","title":"Softmax: From Scores to Probabilities","short_title":"Softmax: From Scores to Probabilities","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"tree-based-feature-importance","title":"Tree-Based Feature Importance [DRAFT]","short_title":"Tree-Based Feature Importance [DRAFT]","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":3},{"slug":"embeddings","title":"Embeddings at Scale Book","short_title":"Embeddings at Scale Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"anomaly-detection","title":"Observability Anomaly Detection","short_title":"Observability Anomaly Detection","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"sizing","title":"Sizing and TCO","short_title":"Sizing and TCO","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"probability","title":"Probability Book","short_title":"Probability Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"matrix-calculus","title":"Matrix Calculus Book","short_title":"Matrix Calculus Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"linear-algebra","title":"Learn Linear Algebra Book","short_title":"Learn Linear Algebra Book","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"books","title":"Other Books \u0026 Guides","short_title":"Other Books \u0026 Guides","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"opensource","title":"Open Source Work","short_title":"Open Source Work","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"external-articles","title":"External Articles","short_title":"External Articles","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"slug":"talks","title":"Talks \u0026 Presentations","short_title":"Talks \u0026 Presentations","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":1},{"level":1,"title":"Other Work"},{"slug":"apps","title":"Apps","short_title":"Apps","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Computer Architecture Notes"},{"slug":"computer-architecture-coming-soon","title":"Computer Architecture","short_title":"Coming Soon","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"level":1,"title":"Digital Design Notes"},{"slug":"d-flipflop-tutorial","title":"D Flip-Flops in Digital Design","short_title":"D Flip-Flops","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"d-flip-flop-interactive","title":"Interactive D Flip-Flop Visualization","short_title":"Interactive D Flip-Flop","description":"","date":"","thumbnail":"/build/d-flip-flop-v
284iz-18b8795c020a6b40dddc44553f0264e1.jpg","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"latches-flipflop-quick-ref","title":"Sequential Logic Quick Reference","short_title":"Latches \u0026 Flip-Flops Quick Reference","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"timing-diagrams-tutorial","title":"Timing Diagrams","short_title":"Timing Diagrams","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2},{"slug":"fsm-tutorial","title":"Finite State Machines in Digital Design","short_title":"Finite State Machines","description":"","date":"","thumbnail":"","thumbnailOptimized":"","banner":"","bannerOptimized":"","tags":[],"level":2}]}}},"actionData":null,"errors":null},"future":{"unstable_dev":false,"unstable_postcss":false,"unstable_tailwind":false,"v2_errorBoundary":true,"v2_headers":true,"v2_meta":true,"v2_normalizeFormMethod":true,"v2_routeConvention":true}};</script>
284<script type="module" async="">import "/build/manifest-C732C875.js"; 285import * as route0 from "/build/root-3VHQT63W.js"; 286import * as route1 from "/build/routes/$-O2KOSX5W.js"; 287window.__remixRouteModules = {"root":route0,"routes/$":route1}; 288 289import("/build/entry.client-PCJPW7TK.js");</script>
289</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.