{"id":25139,"date":"2026-10-28T06:25:00","date_gmt":"2026-10-28T06:25:00","guid":{"rendered":"https:\/\/atalnetworks.com\/?p=25139"},"modified":"2026-10-28T06:28:33","modified_gmt":"2026-10-28T06:28:33","slug":"llm-inference-server-sizing","status":"publish","type":"post","link":"https:\/\/atalnetworks.com\/ar\/llm-inference-server-sizing\/","title":{"rendered":"Self-Hosting LLMs on a Dedicated Server: Hardware Sizing Guide"},"content":{"rendered":"<p><b>To self-host an LLM on a dedicated server, size the hardware for the model, context length, active requests, and response-time target.<\/b><span style=\"font-weight: 400;\"> Budget for model weights, request memory, runtime overhead, system RAM, CPU work, and storage. A model that loads successfully has passed a memory check, not a production-capacity test.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The gap becomes clear during a busy hour. One short request works. Several users submit long documents, the request queue grows, and the same server runs out of memory or takes too long to respond.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Avoid that problem by planning in this order:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Define the exact model and request profile.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Calculate weight memory and cache memory separately.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Budget for the complete server and supporting services.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Test realistic traffic against response-time and quality targets.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Compare complete costs for the configurations that pass.<\/span><\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400;\">Start with the model and request profile<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Server sizing starts with what the application must do. \u201cRun an LLM for our team\u201d is too broad to produce a useful hardware recommendation.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Record these inputs before comparing servers:<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th><b>Input<\/b><\/th>\n<th><b>What to record<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Model<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Exact name, revision, architecture, and license<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Weight format<\/span><\/td>\n<td><span style=\"font-weight: 400;\">FP16, BF16, or the specific quantized artifact<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Context<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Normal and maximum prompt-plus-output token counts<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Traffic<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Active generations, arrival rate, and burst behavior<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">\u0627\u0644\u0623\u062f\u0627\u0621<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Time to first token and acceptable completion time<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Quality<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Tasks the model must complete correctly<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Other services<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Embeddings, reranking, vector search, APIs, and monitoring<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Operations<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Update process, recovery needs, and growth reserve<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Context includes system instructions, chat history, retrieved text, user input, and generated output. A short question can produce a long model input if the application adds several documents.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Also separate users from active requests. A service with 100 registered users may have only a few generations running at once. An agent used by one person may issue several requests during a single task.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For a definition of the serving process, see <\/span><a href=\"https:\/\/atalnetworks.com\/ar\/what-is-ai-inference\/\"><span style=\"font-weight: 400;\">what AI inference means<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Keep inference separate from training<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">This guide covers inference: using an already trained model to produce an answer. Training and fine-tuning can require additional memory for gradients, optimizer state, and activations, depending on the method.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Do not use an inference sizing table as a training recommendation. If the same machine must serve users and run fine-tuning jobs, test the combined schedule or separate those workloads.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Calculate model-weight memory first<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Model weights are the stored numerical values used during inference. Their memory footprint provides the starting point for a hardware budget.<\/span><\/p>\n<p><b>Idealized weight memory in bytes = parameter count \u00d7 bits per weight \u00f7 8<\/b><\/p>\n<p><span style=\"font-weight: 400;\">For a nominal eight-billion-parameter model at 16 bits:<\/span><\/p>\n<p><b>8,000,000,000 \u00d7 16 \u00f7 8 = 16,000,000,000 bytes, or 16 GB<\/b><\/p>\n<p><span style=\"font-weight: 400;\">At an idealized four bits per weight, the same calculation gives 4 GB.<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th><b>Nominal model size<\/b><\/th>\n<th><b>FP16\/BF16 weight floor<\/b><\/th>\n<th><b>8-bit weight floor<\/b><\/th>\n<th><b>4-bit weight floor<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">8B<\/span><\/td>\n<td><span style=\"font-weight: 400;\">16 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">8 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4 GB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">14B<\/span><\/td>\n<td><span style=\"font-weight: 400;\">28 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">14 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">7 GB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">32B<\/span><\/td>\n<td><span style=\"font-weight: 400;\">64 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">32 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">16 GB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">70B<\/span><\/td>\n<td><span style=\"font-weight: 400;\">140 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">70 GB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">35 GB<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>These figures cover idealized weights only.<\/b><span style=\"font-weight: 400;\"> They exclude request cache, working buffers, quantization metadata, and other runtime allocations. The exact model may also have more parameters than its rounded name suggests.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Why a 4-bit file needs more than the raw calculation<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">A quantized artifact can contain scale values, metadata, and tensors stored at other precisions. Its downloaded size and loaded memory footprint can differ.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Record the exact artifact, then inspect memory after loading it in the intended runtime. Do not treat every format labeled \u201c4-bit\u201d as interchangeable.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Reducing weight precision also does not automatically reduce the precision of the request cache. Those are separate settings with separate compatibility and quality checks.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Use total parameters for MoE weight planning<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">A mixture-of-experts model, or MoE model, activates only part of its expert network for each token. That can reduce computation relative to using every expert, but the other weights still need a placement plan.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For full residency, budget for the stored model, not just its active parameter count. Expert offload and distributed placement can change where memory is used, but they introduce their own transfer and execution costs.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Keep GB and GiB consistent<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">One GB is one billion bytes. One GiB is 1,073,741,824 bytes. A 4 GB payload is about 3.73 GiB.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Convert values to the same unit before subtracting model memory from a device budget. Use the actual available memory reported for the deployment rather than mixing a product label with a differently reported measurement.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Add KV cache, context length, and concurrent requests<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The key-value cache, usually called the <\/span><b>KV cache<\/b><span style=\"font-weight: 400;\">, stores attention data used while the model generates text. Model weights can be shared across requests within one model instance, but active sequences also need request state.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">That is why longer contexts and more active requests can consume memory even when the loaded model does not change.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For a conventional decoder with the same full-attention layout in each layer, estimate logical cache payload as:<\/span><\/p>\n<p><b>KV bytes \u2248 2 \u00d7 layers \u00d7 KV heads \u00d7 head dimension \u00d7 bytes per cached value \u00d7 total cached tokens<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The factor of two accounts for keys and values. Total cached tokens means the sum across active sequences. If all sequences have the same length, multiply that length by the number of active sequences.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is not a universal formula for every model. Sliding-window attention, other cache architectures, cache quantization, and runtime allocation rules can change the calculation. Hugging Face documents cache strategies with different memory behavior, including limits for sliding-window and chunked-attention layers.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">A worked cache example<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Meta&#8217;s Llama 3.1 8B configuration uses 32 layers, 32 attention heads, eight KV heads, and a hidden dimension of 4,096. The head dimension is 4,096 \u00f7 32 = 128.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Assume a two-byte KV cache, full attention, and no prefix sharing:<\/span><\/p>\n<p><b>2 \u00d7 32 \u00d7 8 \u00d7 128 \u00d7 2 = 131,072 bytes per cached token per sequence<\/b><\/p>\n<p><span style=\"font-weight: 400;\">That equals 128 KiB.\u00a0<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th><b>Cached tokens per sequence<\/b><\/th>\n<th><b>Active sequences<\/b><\/th>\n<th><b>Calculated logical KV payload<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">8,192<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">8,192<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">32,768<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4<\/span><\/td>\n<td><span style=\"font-weight: 400;\">16 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">32,768<\/span><\/td>\n<td><span style=\"font-weight: 400;\">8<\/span><\/td>\n<td><span style=\"font-weight: 400;\">32 GiB<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">The model is unchanged, yet request memory changes sharply. This is why adding a fixed percentage to model size cannot account for every context and concurrency target.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">These are calculated payloads, not measured GPU allocations. A runtime may reserve cache blocks in advance or keep allocations for reuse. Memory reported by a monitoring tool may therefore differ from the live token payload.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Build a complete GPU memory budget<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">For a fully GPU-resident deployment, start with:<\/span><\/p>\n<p><b>GPU memory budget = loaded weights + KV allocation + runtime working memory + operating reserve<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Use measured runtime values where possible. Avoid counting the same reserved cache pool twice.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Example: a short-context assistant versus a shared service<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">The following is a <\/span><b>teaching scenario<\/b><span style=\"font-weight: 400;\">, not an Atal benchmark. Assume:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Loaded quantized weights: 5 GiB.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Other runtime working memory: 2 GiB.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Operating reserve: 2 GiB.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Cache layout from the Llama 3.1 8B example above.<\/span><\/li>\n<\/ul>\n<table>\n<thead>\n<tr>\n<th><b>Memory item<\/b><\/th>\n<th><b>Short-context assistant<\/b><\/th>\n<th><b>Longer-context shared service<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Active sequences<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1<\/span><\/td>\n<td><span style=\"font-weight: 400;\">4<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Cached tokens per sequence<\/span><\/td>\n<td><span style=\"font-weight: 400;\">8,192<\/span><\/td>\n<td><span style=\"font-weight: 400;\">32,768<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Loaded weights, assumed<\/span><\/td>\n<td><span style=\"font-weight: 400;\">5 GiB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">5 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Logical KV payload, calculated<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1 GiB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">16 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Other working memory, assumed<\/span><\/td>\n<td><span style=\"font-weight: 400;\">2 GiB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">2 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Reserve, assumed<\/span><\/td>\n<td><span style=\"font-weight: 400;\">2 GiB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">2 GiB<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Combined planning total<\/span><\/td>\n<td><span style=\"font-weight: 400;\">10 GiB<\/span><\/td>\n<td><span style=\"font-weight: 400;\">25 GiB<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Under these assumptions, the first profile clears a 16 GiB memory-budget check. The second exceeds a 24 GiB budget. Neither result proves throughput or response time.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The reserve and overhead figures are inputs for this example, not general recommendations. Replace them with measurements from the exact runtime and settings before selecting hardware.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">What about a 70B model?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">A nominal 70B model has an idealized four-bit weight floor of 35 GB. It cannot be fully GPU-resident within 24 GB of available memory, even before cache and overhead.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Possible paths include a larger-memory GPU, supported multi-GPU placement, CPU offload, or a smaller model that passes the task-quality test. A 48 GB device is not a blanket recommendation for every 70B workload. Context, active requests, format overhead, and runtime behavior still matter.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Choose GPU hardware by more than VRAM<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Enough memory makes a configuration possible. It does not make the configuration fast enough.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Compare candidates using the same workload:<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th><b>Hardware check<\/b><\/th>\n<th><b>What to confirm<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Available VRAM<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Actual allocation after partitions and other processes<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Runtime support<\/span><\/td>\n<td><span style=\"font-weight: 400;\">GPU architecture, driver, backend, and model support<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Weight and cache formats<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Supported kernels and memory behavior<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Memory bandwidth<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Performance under the selected model and request mix<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Interconnect<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Device topology for the chosen parallel method<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Power and cooling<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Sustained operating limits in the server<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Service terms<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Dedicated or shared resources, support, and replacement process<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Avoid selecting a GPU from a generic users-per-card table. Ten short requests and ten long-document requests are different workloads.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Keep the shortlisted model revision, runtime version, prompt\/output limits, and active-request target beside each hardware option. Otherwise, the comparison is difficult to reproduce.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Size system RAM, CPU, storage, and networking<\/span><\/h2>\n<h3><span style=\"font-weight: 400;\">System RAM: budget for loading and host services<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">System RAM supports the operating system, model loading, APIs, tokenization, monitoring, and any CPU-resident model or cache state. Embedding models, rerankers, and vector databases add further demand if they share the host.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Measure peak RAM during startup as well as steady operation. The loading method can use temporary copies or buffers that are absent after startup.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There is no single RAM-to-VRAM ratio that fits every inference stack. Build a host budget from the selected runtime, offload plan, and supporting services. A model that fits on the GPU can still fail during loading because host memory is insufficient.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">CPU: match cores and memory bandwidth to the task<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">On a GPU-backed server, the CPU still handles request processing, tokenization, networking, and application work. CPU-only inference also makes processor execution and system-memory behavior central to performance.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Test the intended thread count. More cores do not automatically produce a matching increase in token rate. For multi-socket systems, inspect memory locality and the placement of GPUs and network devices.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A CPU-only dedicated server can be a candidate for batch jobs, experiments, or low-frequency tasks. Whether it is suitable for interactive use depends on the model and measured response time.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">NVMe storage: include versions and recovery<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Budget storage for more than one downloaded model:<\/span><\/p>\n<p><b>Storage budget = active model files + rollback files + runtime artifacts + application data + retained logs + free working space<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Add vector indexes and document data when retrieval shares the server. Also consider temporary downloads and conversion files.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Local NVMe can reduce model-loading and data-access delays. It does not guarantee a higher generation rate after all required weights are resident in memory. Measure cold-start time separately from warm request performance.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Networking: separate client traffic from model traffic<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">A public network port handles client connections, downloads, and transfers. GPU-to-GPU links and the network between distributed inference nodes serve different purposes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Do not use a public 10 Gbps port specification as proof of multi-node inference performance. Check the actual topology, communication method, and runtime requirements.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For voice applications, measure the full turn: speech input, transcription, model response, speech generation, and delivery. LLM time to the first token covers only part of that path.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Match the runtime and multi-GPU design to the workload<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Choose the runtime before making a final hardware decision. It controls model support, placement, batching, and memory management.<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th><b>Runtime<\/b><\/th>\n<th><b>Useful evaluation path<\/b><\/th>\n<th><b>Check before committing<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Ollama<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Model trials and a simpler serving workflow<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Hardware support, context, parallel requests, and loaded-model limits<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">llama.cpp<\/span><\/td>\n<td><span style=\"font-weight: 400;\">GGUF models, CPU inference, and partial GPU offload<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Build\/backend, artifact support, offloaded layers, and measured speed<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">vLLM<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Batched serving and supported multi-GPU deployments<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Model\/format compatibility, memory controls, topology, and latency under load<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Ollama documents increased memory needs with parallel requests and longer context. llama.cpp supports CPU\/GPU hybrid inference. These are options to test, not guarantees of a specific token rate.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Split one model or run separate replicas?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Splitting a model across GPUs can help when it does not fit on one device. Tensor parallelism divides supported tensor operations; pipeline parallelism divides model stages or layers. MoE deployments may also use expert parallelism.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Replicas serve a different purpose. Each copy holds its own weights and can handle a separate set of requests. Replicas can add serving capacity when one copy already fits, but they do not combine their memory to hold one larger model.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Two GPUs do not become one automatic memory pool. Per-device allocation, communication, and runtime support still constrain the layout. vLLM documents multiple parallel methods and topology considerations.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">NVLink is not a universal requirement. Compare the actual supported layout and benchmark it. Neither adding a second GPU nor doubling total VRAM guarantees twice the useful throughput.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Benchmark the server before production<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Test the application target, not the highest number in a benchmark screenshot.<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th><b>Metric<\/b><\/th>\n<th><b>What it tells you<\/b><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><span style=\"font-weight: 400;\">Time to first token, or TTFT<\/span><\/td>\n<td><span style=\"font-weight: 400;\">How long the client waits for initial model output<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Inter-token latency<\/span><\/td>\n<td><span style=\"font-weight: 400;\">How smoothly output arrives after generation starts<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Per-request output rate<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Generation speed experienced by one request<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Aggregate output rate<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Total output across the server<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Request completion time<\/span><\/td>\n<td><span style=\"font-weight: 400;\">How long the full response takes<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400;\">Errors and queue growth<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Whether demand exceeds usable capacity<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">The definitions and measurement boundaries matter. NVIDIA&#8217;s benchmark guidance distinguishes user-level token rates, system throughput, and response latency. Keep the selected tool&#8217;s definitions with the results.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Use a repeatable acceptance test<\/span><\/h3>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Fix the configuration.<\/b><span style=\"font-weight: 400;\"> Record model revision, artifact, tokenizer, runtime, driver, GPU, CPU, RAM, storage, and power limits.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Test one request.<\/b><span style=\"font-weight: 400;\"> Measure cold and warm behavior with representative input and output lengths.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Increase concurrency.<\/b><span style=\"font-weight: 400;\"> Check normal and long requests at several active-request levels.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Test arrival bursts.<\/b><span style=\"font-weight: 400;\"> Send requests at the expected rate so queues and overload behavior become visible.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Check quality.<\/b><span style=\"font-weight: 400;\"> Repeat task tests after changing precision, context, or serving settings.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Record the pass conditions.<\/b><span style=\"font-weight: 400;\"> Include latency, successful throughput, memory, quality, and required reserve.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">Use several measured repetitions after consistent warm-up. Report failures, sample counts, and the spread of results. A p99 figure based on too few requests can mislead.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">If prefix caching is enabled, test both repeated and new prefixes. If embeddings or reranking share the machine, include them in the load test. A synthetic short-prompt result cannot establish long-document capacity.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Use current tools and record their versions. NVIDIA&#8217;s current GenAI-Perf documentation says it is being phased out and directs new benchmarking work to AIPerf.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">When memory is the limiting resource<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">First identify whether the problem is model loading, cache reservation, context growth, or other services. Then change one factor and test again.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Possible options include a smaller model, a supported quantized artifact, shorter context limits, fewer active sequences, or another placement plan. These choices can change quality, queueing, and throughput.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">vLLM documents context-length and sequence limits as memory controls, and notes that CUDA graph capture uses additional GPU memory. Treat settings as part of the measured configuration.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Compare self-hosting cost with APIs and cloud GPUs<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Compare only configurations that meet the required task quality and response time. A cheap server that produces unusable answers is not a saving.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For a rented dedicated server, include:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Rental and setup charges over the planned term.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Storage, transfer, software, and support charges.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Operating work for updates, monitoring, and incidents.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Capacity needed for maintenance or failure handling.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Do not add power again when the rental charge already includes it. For owned hardware, use a separate ownership model covering purchase, energy, facilities, and support.<\/span><\/p>\n<p><b>Cost per accepted request = complete cost during a period \u00f7 accepted requests during that period<\/b><\/p>\n<p><span style=\"font-weight: 400;\">For example, a fictional complete monthly cost of $1,200 divided by 600,000 accepted requests gives $0.002 per accepted request. This is a teaching calculation, not an Atal quote or measured serving capacity.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Do not assume ten times the demand fits the same server at the same response time. The cost changes when capacity, staffing, or reserve needs change.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For API comparisons, price input tokens, output tokens, caching, and other billed categories separately. For cloud GPUs, include running hours, attached storage, transfers, and required supporting services.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There is no universal token volume at which self-hosting becomes cheaper. Utilization, model quality, request length, hardware, and operating responsibility determine the result.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Check deployment limits before ordering<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Hardware fit is one part of readiness. Confirm the exact model license and permitted use. Check driver, runtime, and artifact compatibility.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Control access to the inference endpoint. Set request-size, output, queue, and rate limits. Define logging and retention rules. Review outbound connections, external embeddings, tools, and fallback APIs if data must remain inside a specific boundary.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A rented dedicated server is not automatically on premises or air-gapped. Self-hosting gives you control over deployment choices; it does not prove that every prompt stays private under every configuration.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Plan model updates, rollback files, monitoring, and recovery. If service must continue during a host failure, the architecture needs spare capacity outside that host. Multiple GPUs inside one server do not provide a second host.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Frequently asked questions<\/span><\/h2>\n<h3><span style=\"font-weight: 400;\">Can I self-host an LLM without a GPU?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Yes. Supported runtimes can run models on CPUs, and some can divide work between CPU and GPU. Start with a model and format that fit system RAM, then test response time. CPU-only inference can suit batch or low-frequency tasks, but interactive suitability must be measured.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Is 24 GB of VRAM enough for an LLM server?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">It depends on the artifact, context, active requests, and runtime. Several compact quantized models may fit, but memory fit does not establish production capacity. A nominal 70B model&#8217;s idealized four-bit weights alone require 35 GB, which exceeds 24 GB of available VRAM.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">How much memory does a 70B model need?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">The idealized weight floors are 140 GB at 16 bits, 70 GB at eight bits, and 35 GB at four bits. Add format overhead, cache, working memory, and reserve. Placement across GPU and host memory depends on the runtime.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Can two 24 GB GPUs replace one larger GPU?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Sometimes, if the model and runtime support a suitable split. They are not automatically equivalent to one larger device. Communication, per-device overhead, cache placement, and server topology affect both fit and speed.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Why does the model load but fail with several requests?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Loading checks whether the initial model allocation fits. Additional requests can increase cache and working-memory demand. Measure the exact failure point and check context, active-sequence limits, and other loaded services before changing hardware.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">How much system RAM does an inference server need?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Budget for startup peaks, the operating system, runtime, API services, CPU offload, and any retrieval components. Measure both loading and steady operation. There is no fixed system-RAM requirement that follows from parameter count or GPU memory alone.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Is a dedicated server cheaper than an API?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">It can be, but compare complete costs at equivalent task quality and response time. Low or irregular demand may leave rented hardware idle. Sustained demand can improve utilization, provided the selected server can handle it within the service target.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Recommended Next Steps<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Choose hardware from a documented request profile, not parameter count alone. Calculate weights and cache separately, add the full server budget, and test the configurations that remain.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Before committing:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Fix the model revision, artifact, context, and active-request target.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Calculate the memory budget using consistent units.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Confirm runtime support and per-device placement.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Test latency, throughput, quality, and failure behavior.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Compare complete costs over the same period.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">To discuss a suitable configuration, review <\/span><a href=\"https:\/\/atalnetworks.com\/ar\/dedicated-servers\/\"><span style=\"font-weight: 400;\">Atal Networks dedicated servers<\/span><\/a><span style=\"font-weight: 400;\"> and share your model, request profile, memory estimate, location, and software requirements. Confirm GPU availability and supported options for the specific offer before ordering.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Sources and calculation notes<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Sources were checked on October 28, 2026. Model configurations, runtime support, and software behavior can change, so record the version used for a deployment.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/meta-llama\/llama-models\/blob\/main\/models\/sku_list.py\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Meta Llama model configurations<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/huggingface.co\/docs\/transformers\/en\/kv_cache\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Hugging Face cache strategies<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.vllm.ai\/en\/stable\/configuration\/conserving_memory\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">vLLM memory controls<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.vllm.ai\/en\/stable\/serving\/parallelism_scaling\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">vLLM parallelism and scaling<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.ollama.com\/faq\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Ollama FAQ<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/ggml-org\/llama.cpp\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">llama.cpp project<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/developer.nvidia.com\/blog\/?p=98215\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">NVIDIA inference benchmarking concepts<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/docs.nvidia.com\/deeplearning\/triton-inference-server\/user-guide\/docs\/perf_analyzer\/genai-perf\/README.html\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">NVIDIA benchmark-tool status<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Weight tables use idealized bit counts and decimal GB. KV-cache figures use binary GiB and the stated full-attention assumptions. The 5 GiB weight allocation, 2 GiB working-memory input, 2 GiB reserve, and dollar example are fictional teaching inputs. They are not Atal measurements, prices, or capacity claims.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>To self-host an LLM on a dedicated server, size the hardware for the model, context length, active requests, and response-time [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":25140,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-25139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-grade-server"],"acf":[],"_links":{"self":[{"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/posts\/25139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/comments?post=25139"}],"version-history":[{"count":3,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/posts\/25139\/revisions"}],"predecessor-version":[{"id":25143,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/posts\/25139\/revisions\/25143"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/media\/25140"}],"wp:attachment":[{"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/media?parent=25139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/categories?post=25139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atalnetworks.com\/ar\/wp-json\/wp\/v2\/tags?post=25139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}