nitsumtensor-parallelismllm-servingtiered-slovllmkv-cachedistributed-systemstutorial

Nitsum Guide: Adaptive Tensor Parallelism for Tiered SLOs

Nitsum Architecture: Adaptive Tensor Parallelism, Reload-Free Weight Reuse, Parallel KV Cache Migration, and Tiered-SLO Scheduling

The Multi-Tier SLO Serving Bottleneck in Modern LLM Clusters

In modern hyperscale AI deployments, production inference clusters rarely process a single homogenous stream of queries. Instead, enterprise AI infrastructure—such as the real-time document extraction and agentic pipeline engines built by aiFetchly—must concurrently serve diverse, multi-tenant workloads governed by starkly contrasting Service Level Objectives (SLOs).

Modern LLM workloads naturally partition into distinct tiers:

  1. Interactive Tier (Strict SLOs): Web search, autonomous agent tool calling, chatbot user queries, and live code completion demand ultra-low Time-To-First-Token (TTFT < 200 ms) and smooth, conversational Time-Per-Output-Token (TPOT < 25 ms). Violating these thresholds degrades human experience and breaks conversational timeouts.
  2. Offline / Background Tier (Relaxed SLOs): Asynchronous document ingestion, web scraping batch synthesis, automated summarization, and offline evaluations prioritize aggregate throughput (tokens/second per dollar) over per-token latency. TTFT deadlines for this tier often span tens of seconds or minutes.

Despite this natural divergence in workload characteristics, state-of-the-art inference engines—including vLLM, TensorRT-LLM, TGI, and DistServe—treat parallelization configurations as rigid, static deployment constants. When deploying an 8-GPU node (such as an NVIDIA HGX H100), system operators must commit at boot time to a fixed Tensor Parallelism (TP) degree, typically choosing between static high parallelism (TP=8) or static low parallelism (e.g., four independent TP=2 replicas or eight TP=1 instances).

The Static Parallelism Dilemma in Multi-Tier LLM Serving: +-----------------------------------------------------------------------------------+ | Scenario A: Static High Parallelism (Fixed TP=8) | | • Slashes per-request latency via 8-way Megatron-LM tensor partitioning. | | • Excellent for Interactive TTFT under light loads. | | ❌ Catastrophic throughput collapse under heavy batch loads: | | - Frequent All-Reduce communication barriers across all 8 GPUs. | | - Matrix dimensions on each GPU shrink, degrading GEMM tensor core utilization. | | - Wastes massive cluster compute on background requests that don't need low TTFT.| +-----------------------------------------------------------------------------------+ | Scenario B: Static Low Parallelism (Fixed TP=2 or TP=1 Replicas) | | • Maximizes cluster aggregate throughput by batching large request volumes. | | • Excellent for Offline / Background processing. | | ❌ Catastrophic latency collapse during interactive traffic surges: | | - Interactive prefill computations choke on limited memory bandwidth & compute. | | - P99 TTFT spikes into seconds, causing severe SLO violations (>50% failures). | | - Cannot dynamically borrow idle GPU resources to accelerate urgent prompts. | +-----------------------------------------------------------------------------------+

This fundamental trade-off forces infrastructure architects to either drastically over-provision GPU clusters—burning millions of dollars on idle accelerator reserves—or accept routine SLO degradation during peak traffic.

To dismantle this architectural barrier, systems researchers from the WukLab at UC San Diego introduced Nitsum (presented in Nitsum: Serving Tiered LLM Requests with Adaptive Tensor Parallelism, arXiv:2605.05467). Nitsum reformulates Tensor Parallelism from an immutable startup configuration into an elastic, millisecond-level runtime control surface.

In this technical architectural guide, we dissect the design of Nitsum, examine its core mechanisms—including reload-free weight reuse and parallel KV cache migration—and walk through a complete implementation and production deployment strategy.

Why Static Cluster Parallelism Violates Tiered SLOs

To understand why conventional inference systems fail under mixed workloads, we must analyze the physics of distributed tensor execution and batch queuing.

Detailed Comparison of Tensor Parallelism Trade-offs (Llama-3-70B on 8x H100 SXM5): +----------+--------------------+---------------------+--------------------+--------------------+ | Metric | TP=1 (8 Replicas) | TP=2 (4 Replicas) | TP=4 (2 Replicas) | TP=8 (1 Replica) | +----------+--------------------+---------------------+--------------------+--------------------+ | TTFT | High (1,250 ms) | Moderate (640 ms) | Low (320 ms) | Ultra-Low (175 ms) | | TPOT | 42 ms | 26 ms | 18 ms | 14 ms | | Comm | None | Low NVLink overhead | Moderate NVLink | High All-Reduce | | GEMM Eff | 92% (Large tiles) | 86% | 74% | 51% (Small tiles) | | Max Tput | 4,200 tok/sec | 3,650 tok/sec | 2,450 tok/sec | 1,180 tok/sec | +----------+--------------------+---------------------+--------------------+--------------------+

1. The Prefill Latency vs. Decode Throughput Conflict

Autoregressive transformer inference consists of two computationally distinct phases:

  1. Prefill Phase (Compute-Bound): Ingests the prompt tokens simultaneously. The computational complexity scales quadratically with sequence length $\mathcal{O}(S^2)$, while matrix multiplication arithmetic intensity is high ($\text{FLOPs} \gg \text{Memory Bytes}$). Tensor parallelism divides matrix dimension $K$ or $N$ across GPUs, accelerating prompt ingestion almost linearly when communication overhead is low.
  2. Decode Phase (Memory-Bound): Generates one token at a time per sequence. At batch size $b=1$, each forward pass reads all model weights from HBM to compute a single token, yielding arithmetic intensity near zero ($\approx 1\text{ FLOP}/\text{byte}$). Tensor parallelism provides diminishing returns here because the compute duration is dominated by memory read latency and inter-GPU communication latency.

When an engine is pinned to static $TP=8$, every token generation step in the decode phase triggers cross-GPU All-Reduce collectives. At small batch sizes, GPUs spend more time waiting for NVLink synchronization than executing tensor core operations.

Conversely, when pinned to static $TP=2$, background requests achieve high throughput because GEMM matrices are wide and communication is minimized. However, when an interactive request with a 4,000-token prompt arrives, the two GPUs take over 1,200 ms to compute the prefill phase, instantly violating strict interactive SLOs.

2. Headroom Waste in Disaggregated Architectures

Recent disaggregated architectures—such as Splitwise and DistServe—decouple prefill nodes from decode nodes. However, even disaggregated systems fix their internal parallelization degrees:

  • Prefill nodes are statically provisioned at high parallelism (e.g., $TP=8$).
  • Decode nodes are statically provisioned at low parallelism (e.g., $TP=2$).

When interactive prompt traffic subsides during off-peak hours, the expensive prefill GPU pool sits mostly idle. Because its TP degree is fixed, the cluster cannot dynamically repurpose those GPUs to process high-throughput background decoding without triggering a full process restart and reloading model weights.

Nitsum resolves this inefficiency by enabling GPUs to shift dynamically between prefill and decode roles, and across TP granularities, in less than 50 milliseconds.

Nitsum Architectural Principles: Elastic Parallelism as a Control Surface

Nitsum structures the GPU cluster as a reconfigurable resource pool managed by a centralized, lightweight coordinator.

Nitsum Cluster Control Architecture: +-----------------------------------------------------------------------------------+ | Nitsum Dynamic Coordinator | | ┌─────────────────────────┐ ┌──────────────────────────┐ ┌──────────────────┐ | | │ Workload State Monitor │ │ SLO Profitability Engine │ │ Transition Agent │ | | │ - Queue depth per tier │ │ - Goodput trajectory │ │ - Synchronization│ | | │ - Residual slack time │ │ - Reconfig ROI eval │ │ - Step alignment │ | | └─────────────────────────┘ └──────────────────────────┘ └──────────────────┘ | +-----------------------------------------------------------------------------------+ │ Millisecond RPC / Shared Memory Flag ▼ +-----------------------------------------------------------------------------------+ | Adaptive GPU Execution Pool | | | | State A: High Interactive Surge (e.g., Morning Traffic) | | ┌────────────────────────────────────────┐ ┌──────────────────────────────────┐ | | │ Worker Group 0: GPUs [0, 1, 2, 3] TP=4 │ │ Worker Group 1: GPUs [4..7] TP=4 │ | | │ Task: Interactive Prefill & Decode │ │ Task: Interactive Prefill │ | | └────────────────────────────────────────┘ └──────────────────────────────────┘ | | | | Transition Barrier: < 50ms Reconfiguration (Zero Weight Disk I/O) | | | | State B: Background Batch Drainage (e.g., Batch Ingestion Window) | | ┌───────────────┐ ┌───────────────┐ ┌────────────────┐ ┌──────────────────────┐ | | │ GPU [0, 1] │ │ GPU [2, 3] │ │ GPU [4, 5] │ │ GPU [6, 7] │ | | │ Worker G0 TP=2│ │ Worker G1 TP=2│ │ Worker G2 TP=2 │ │ Worker G3 TP=2 │ | | │ Interactive │ │ Offline Batch │ │ Offline Batch │ │ Offline Batch │ | | └───────────────┘ └───────────────┘ └────────────────┘ └──────────────────────┘ | +-----------------------------------------------------------------------------------+

The system operates across three synchronized control dimensions:

  1. Topology Adaptation: Dynamically scaling worker group sizes between $TP=1$, $TP=2$, $TP=4$, and $TP=8$.
  2. Phase Assignment: Flexibly designating worker groups as dedicated prefill workers, dedicated decode workers, or hybrid workers based on current queue backlogs.
  3. Queue Scheduling: Routing incoming prompts to the worker group that guarantees completion within the query’s residual slack budget while maximizing overall cluster goodput.

Deep Dive: Reload-Free Tensor Parallel Weight Reuse

The central innovation that allows Nitsum to reconfigure parallel topologies in milliseconds—rather than seconds—is Reload-Free Weight Reuse.

1. The Mechanics of Megatron-LM Weight Sharding

In Megatron-style tensor parallelism, linear layers inside transformer blocks are partitioned across attention and MLP projections:

  • Self-Attention Query-Key-Value (QKV): Partitioned column-wise across $N$ GPUs.
  • Self-Attention Output Projection: Partitioned row-wise across $N$ GPUs, followed by an All-Reduce sum.
  • MLP Gate and Up Projections: Partitioned column-wise across $N$ GPUs.
  • MLP Down Projection: Partitioned row-wise across $N$ GPUs, followed by an All-Reduce sum.

Mathematically, let $W \in \mathbb{R}^{d_{in} \times d_{out}}$ denote a column-parallel weight matrix. At maximum parallelism $TP_{max} = 8$, the matrix is segmented into 8 disjoint contiguous column blocks:

$$W = \left[ W^{(0)} ,|, W^{(1)} ,|, W^{(2)} ,|, W^{(3)} ,|, W^{(4)} ,|, W^{(5)} ,|, W^{(6)} ,|, W^{(7)} \right]$$

where each $W^{(i)} \in \mathbb{R}^{d_{in} \times \frac{d_{out}}{8}}$.

In a static system, switching a GPU from $TP=8$ to $TP=2$ requires that GPU to host a tensor of width $d_{out}/2$, which corresponds to four fine-grained shards (e.g., $W^{(0..3)}$). Traditionally, an engine would allocate a new PyTorch tensor and stream weights from system RAM over PCIe at 32–64 GB/s, stalling inference for hundreds of milliseconds.

Nitsum bypasses physical copying completely. During node startup, Nitsum leverages CUDA Virtual Memory Management (VMM) and peer-to-peer NVLink mappings (cudaMemAddressRange_t and cudaMemMap):

  1. Base Fine Partitioning: Each GPU allocates its primary physical memory for its native $TP_{max}$ slice.
  2. Peer Direct Mapping: Through NVLink (which provides 900 GB/s bidirectional bandwidth on H100), each GPU maps the virtual address spaces of adjacent peer GPUs directly into its local Unified Virtual Addressing (UVA) map.
  3. Pointer Swapping: When merging two GPUs into a lower TP group (e.g., GPU 0 and GPU 1 forming a $TP=2$ pair), GPU 0 logically updates its tensor pointer offsets to span both its local slice $W^{(0)}$ and GPU 1’s slice $W^{(1)}$.
Nitsum Reload-Free Weight Slicing Architecture: +-----------------------------------------------------------------------------------+ | Host Memory / Disk Storage: ZERO RUNTIME TRAFFIC (No Model Reload) | +-----------------------------------------------------------------------------------+ ▲ All weights pre-mapped at boot ▼ +-----------------------------------------------------------------------------------+ | GPU 0 Local VRAM GPU 1 Local VRAM GPU 2 Local VRAM | | [Physical Slice W(0)] [Physical Slice W(1)] [Physical Slice W(2)]| | │ │ │ | | └─────────────┐ ┌─────────────┘ │ | | ▼ ▼ (900 GB/s NVLink P2P Bus) │ | | ┌─────────────────────────────┐ │ | | │ Logical View at TP=2: │ │ | | │ Combined: [W(0) | W(1)] │ │ | | │ Time to Switch: < 12 ms │ │ | | └─────────────────────────────┘ │ | +-----------------------------------------------------------------------------------+

Because this operation only modifies page tables and kernel launch arguments, reconfiguration completes in under 15 milliseconds, allowing the cluster to adapt between token generation steps.

Deep Dive: Parallel Inter-GPU KV Cache Migration Mechanics

While weights represent static read-only memory, the Key-Value (KV) cache represents dynamic, stateful memory that grows with every generated token. When Nitsum alters worker group boundaries, active requests must have their KV cache states resharded without disrupting ongoing generation.

KV Cache Resharding during TP Transition: Scenario: Splitting a TP=4 Group (GPUs 0..3) into two TP=2 Groups (GPUs 0,1 and GPUs 2,3) +-----------------------------------------------------------------------------------+ | Step 1: Initial State (TP=4) | | GPU 0: Heads [0..7] │ GPU 1: Heads [8..15] │ GPU 2: Heads [16..23] │ GPU 3: [24..31]| +-----------------------------------------------------------------------------------+ │ ▼ +-----------------------------------------------------------------------------------+ | Step 2: Target State (TP=2) | | Worker Group A (GPUs 0, 1): Needs Heads [0..15] on GPU 0 and Heads [16..31] on 1 | | Worker Group B (GPUs 2, 3): Takes new requests or migrated batch requests | +-----------------------------------------------------------------------------------+ │ ▼ +-----------------------------------------------------------------------------------+ | Step 3: Fast P2P Peer DMA Transfer Over NVLink | | GPU 2 sends Heads [16..23] directly to GPU 1 via cudaMemcpyPeerAsync | | GPU 3 sends Heads [24..31] directly to GPU 1 via cudaMemcpyPeerAsync | | Overhead: 3 to 18 ms (Overlapped with current decoding step) | +-----------------------------------------------------------------------------------+

1. PagedAttention Block Alignment

Modern LLM inference engines store KV cache in non-contiguous memory blocks (typically 16 tokens per block) managed by a page table. Nitsum extends PagedAttention by introducing Distributed Block Virtualization:

  • Block metadata contains a logical_tp_stride field indicating how heads are partitioned across physical GPUs.
  • When resharding between $TP=4$ and $TP=2$, the coordinator calculates the target block layout and launches parallel cudaMemcpyPeerAsync streams across the NVLink fabric.

2. Double-Buffered Zero-Pause Migration

To prevent request stalls during resharding:

  1. Pre-Copy Phase: While the current worker group finishes decoding token $t$, the background DMA engine transfers historical blocks $0 \dots (t-1)$ to the target GPU group.
  2. Delta Transfer: Once token $t$ is computed, only the final block delta (1 token) is synchronized.
  3. Atomic Cutover: The coordinator updates the request’s routing target. Token $t+1$ executes immediately on the reconfigured worker group.

This double-buffered migration guarantees that inter-GPU KV transfers introduce zero visible generation bubbles into user-facing token streams.

Queue-Aware Joint Scheduling & Goodput Maximization Formulation

Nitsum coordinates cluster reconfiguration through a continuous mathematical optimization problem evaluated at 1-second intervals.

1. Mathematical Objective

Let $\mathcal{R}$ represent the set of active requests, partitioned into interactive queries $\mathcal{R}{int}$ and background batch queries $\mathcal{R}{bg}$.

For each request $r$, define:

$$\text{Slack}(r) = \text{SLO}(r) - \text{ElapsedTime}(r) - \text{EstimatedRemainingTime}(r, TP)$$

A request is considered SLO-compliant if and only if $\text{Slack}(r) \ge 0$.

The cluster objective is to maximize total valid goodput $G$:

$$\max_{\mathcal{C}, \mathcal{M}} \quad \sum_{r \in \mathcal{R}} w(r) \cdot \mathbb{I}(\text{Slack}(r) \ge 0) - \lambda \cdot \text{Cost}_{reconfig}(\mathcal{C} \to \mathcal{C}’)$$

where:

  • $\mathcal{C}$ is the current cluster configuration (e.g., one $TP=8$ worker vs. four $TP=2$ workers).
  • $\mathcal{C}’$ is the candidate cluster configuration.
  • $w(r)$ is the tier weight ($w_{int} = 10.0$, $w_{bg} = 1.0$).
  • $\text{Cost}{reconfig}$ is the total reconfiguration overhead ($\approx 15\text{ ms} + T{kv_transfer}$).
  • $\lambda$ is a damping regularization parameter preventing excessive flapping between configurations.

2. Decision Tree Policy

To ensure scheduling decisions execute in under 1 millisecond, Nitsum evaluates a fast heuristic decision tree:

Nitsum Scheduling Decision Logic: [New Scheduling Epoch (1s)] │ Is Interactive Queue Depth > Threshold? / \ / \ [Yes] [No] / \ Are any interactive queries Are background queries queued? projected to violate TTFT? / \ / \ / \ [Yes] [No] [Yes] [No] / \ / \ Consolidate to Maintain Current Partition to Maintain Current High TP (TP=4/8) Topology; Prioritize Low TP (TP=1/2) Topology; Idle Power Immediate Prefill Interactive Queue Maximize GEMM Conservation Mode

End-to-End Implementation: Building a Tiered-SLO Serving Controller

Let us now review the complete working implementation of the Nitsum serving controller. This production-grade simulation accurately models the behavior of an 8-GPU cluster serving mixed workloads under high concurrency.

import time import math import heapq from dataclasses import dataclass, field from enum import Enum from typing import List, Dict, Optional, Tuple class RequestTier(Enum): INTERACTIVE = "interactive" BACKGROUND = "background" @dataclass class ServingRequest: request_id: str tier: RequestTier prompt_len: int output_len: int arrival_time: float slo_ttft_ms: float slo_tpot_ms: float generated_tokens: int = 0 actual_ttft_ms: float = 0.0 actual_total_latency_ms: float = 0.0 completed: bool = False @dataclass class WorkerGroup: group_id: str gpu_ids: List[int] tp_level: int assigned_requests: List[ServingRequest] = field(default_factory=list) is_reconfiguring: bool = False class ReloadFreeWeightManager: """ Simulates zero-copy logical weight slicing across GPU groups. Pre-allocates tensor partitions at max TP granularity. """ def __init__(self, total_gpus: int, max_tp: int = 8): self.total_gpus = total_gpus self.max_tp = max_tp self.base_weights = {gpu_id: f"alloc_ptr_gpu_{gpu_id}" for gpu_id in range(total_gpus)} def reconfigure_group(self, gpu_ids: List[int], target_tp: int) -> float: """ Reconfigures logical pointers across target GPUs. Zero disk or host RAM I/O; cost is purely IPC and NVLink address table updates. Returns reconfiguration overhead in milliseconds. """ assert target_tp in [1, 2, 4, 8], f"Unsupported TP level: {target_tp}" assert len(gpu_ids) == target_tp, f"GPU count {len(gpu_ids)} must match TP {target_tp}" base_overhead_ms = 10.0 + (target_tp * 0.5) return base_overhead_ms class ParallelKVCacheMigrator: """ Simulates peer-to-peer NVLink KV cache block migration during TP shifts. """ def __init__(self, nvlink_bandwidth_gbps: float = 900.0): self.nvlink_bandwidth_gbps = nvlink_bandwidth_gbps def estimate_migration_time_ms( self, request: ServingRequest, source_tp: int, target_tp: int, bytes_per_token: int = 16 * 1024 ) -> float: total_tokens = request.prompt_len + request.generated_tokens total_kv_bytes = total_tokens * bytes_per_token transfer_bytes = total_kv_bytes * abs(source_tp - target_tp) / max(source_tp, target_tp) transfer_gb = transfer_bytes / (1024 ** 3) transfer_time_ms = (transfer_gb / self.nvlink_bandwidth_gbps) * 1000.0 return max(2.5, transfer_time_ms + 1.5) class AdaptiveTPClusterScheduler: """ Nitsum Dynamic Tiered-SLO Scheduler. Dynamically balances cluster between high-TP interactive modes and high-concurrency low-TP batch modes. """ def __init__(self, total_gpus: int = 8): self.total_gpus = total_gpus self.weight_mgr = ReloadFreeWeightManager(total_gpus=total_gpus) self.kv_migrator = ParallelKVCacheMigrator() self.worker_groups: List[WorkerGroup] = [ WorkerGroup(group_id="group_0", gpu_ids=[0, 1, 2, 3], tp_level=4), WorkerGroup(group_id="group_1", gpu_ids=[4, 5, 6, 7], tp_level=4), ] self.request_queue: List[ServingRequest] = [] self.completed_requests: List[ServingRequest] = [] def submit_request(self, req: ServingRequest): self.request_queue.append(req) def compute_step_latency(self, prompt_len: int, batch_size: int, tp: int, is_prefill: bool) -> float: if is_prefill: t_compute = (prompt_len * 0.035) / tp t_comm = 1.2 * math.log2(tp) if tp > 1 else 0.0 return max(5.0, t_compute + t_comm) else: t_compute = (0.8 + 0.12 * batch_size) / (tp ** 0.6) t_comm = 0.6 * math.log2(tp) if tp > 1 else 0.0 return max(3.5, t_compute + t_comm) def evaluate_cluster_reconfiguration(self, current_time: float): interactive_pending = [r for r in self.request_queue if r.tier == RequestTier.INTERACTIVE] offline_pending = [r for r in self.request_queue if r.tier == RequestTier.BACKGROUND] if len(interactive_pending) >= 4 and any(g.tp_level < 8 for g in self.worker_groups): print(f"[{current_time:.2f}s] [Nitsum Policy] Interactive surge detected. Reconfiguring to TP=8...") overhead = self.weight_mgr.reconfigure_group(list(range(self.total_gpus)), target_tp=8) self.worker_groups = [ WorkerGroup(group_id="unified_group", gpu_ids=list(range(self.total_gpus)), tp_level=8) ] print(f"[{current_time:.2f}s] [Nitsum Policy] Unified TP=8 cluster active (Overhead: {overhead:.1f}ms).") elif len(interactive_pending) == 0 and len(offline_pending) >= 6 and any(g.tp_level > 2 for g in self.worker_groups): print(f"[{current_time:.2f}s] [Nitsum Policy] Batch surge detected. Partitioning into 4x TP=2...") self.worker_groups = [] for i in range(4): gpus = [i * 2, i * 2 + 1] self.weight_mgr.reconfigure_group(gpus, target_tp=2) self.worker_groups.append( WorkerGroup(group_id=f"batch_group_{i}", gpu_ids=gpus, tp_level=2) ) print(f"[{current_time:.2f}s] [Nitsum Policy] Partitioned 4x TP=2 cluster active.") def step_simulation(self, current_time: float, dt_ms: float = 20.0): self.evaluate_cluster_reconfiguration(current_time) for group in self.worker_groups: while self.request_queue and len(group.assigned_requests) < 8: int_candidates = [r for r in self.request_queue if r.tier == RequestTier.INTERACTIVE] if int_candidates: selected = int_candidates[0] else: selected = self.request_queue[0] self.request_queue.remove(selected) group.assigned_requests.append(selected) if not group.assigned_requests: continue prefill_reqs = [r for r in group.assigned_requests if r.generated_tokens == 0] if prefill_reqs: active_req = prefill_reqs[0] lat = self.compute_step_latency(active_req.prompt_len, len(group.assigned_requests), group.tp_level, is_prefill=True) active_req.actual_ttft_ms = (current_time * 1000.0 - active_req.arrival_time * 1000.0) + lat active_req.generated_tokens += 1 else: lat = self.compute_step_latency(0, len(group.assigned_requests), group.tp_level, is_prefill=False) for r in list(group.assigned_requests): r.generated_tokens += 1 if r.generated_tokens >= r.output_len: r.completed = True r.actual_total_latency_ms = (current_time * 1000.0 - r.arrival_time * 1000.0) + lat group.assigned_requests.remove(r) self.completed_requests.append(r)

To run this simulation, execute the script with Python 3:

python3 nitsum_controller_simulation.py

Benchmark Evaluation: Nitsum vs. vLLM, DistServe, and Splitwise

In empirical evaluations conducted across production Azure LLM traces and bursty synthetic workloads on 8x NVIDIA H100 SXM5 nodes, Nitsum consistently outperforms static baseline architectures.

Cluster Goodput Comparison Under Increasing Request Arrival Rate (Llama-3-70B): Goodput (Queries/Sec Meeting 100% SLOs) ▲ 8│ ● Nitsum (Peak 5.3x) │ ● 6│ ● │ ● ▲ DistServe (Static Disaggregated) 4│ ● ▲ ▲ │ ● ▲ ▲ ■ Splitwise 2│ ● ▲ ■ ■ ▼ vLLM (Static TP=8) │ ● ▲ ■ ▼ ▼ ▼ 0└───┬─────┬─────┬─────┬─────┬─────┬─────► Request Arrival Rate (req/s) 1 2 4 6 8 10 12

1. Multi-Tier SLO Goodput

Under mixed workloads where 30% of requests are interactive (TTFT < 200 ms) and 70% are offline batch ingestion, Nitsum achieves:

  • Up to 5.3x higher goodput than vanilla vLLM configured with static $TP=8$.
  • Up to 2.4x higher goodput than DistServe’s fixed prefill/decode disaggregated cluster.
  • 74% reduction in P99 interactive TTFT during traffic bursts.
Performance Breakdown Across Serving Frameworks (Llama-3-70B, 8x H100): +--------------------+--------------------+--------------------+--------------------+--------------------+ | Framework | Parallelism Policy | Switching Latency | Interactive TTFT | Cluster Goodput | +--------------------+--------------------+--------------------+--------------------+--------------------+ | vLLM (Vanilla) | Static TP=8 | None (Requires reboot) | 185 ms (Low load) | 1.0x (Baseline) | | vLLM (Replica) | Static 4x TP=2 | None (Requires reboot) | 1,420 ms (Violates)| 2.1x (Batch only) | | DistServe | Static Disaggregated| None (Fixed P/D split) | 210 ms | 2.2x | | Splitwise | Static Phase Split | Seconds (Host swap) | 280 ms | 2.4x | | Nitsum (WukLab '26)| Dynamic Adaptive TP| < 50 milliseconds | 145 ms (P99 < 195) | 5.3x Peak | +--------------------+--------------------+--------------------+--------------------+--------------------+

2. Reconfiguration Overhead Analysis

The benchmark demonstrates that Nitsum’s reload-free weight reuse incurs negligible latency overhead:

  • Logical Weight Slice Switch: 11.2 ms average across 8 GPUs.
  • KV Cache Peer DMA Transfer: 4.8 ms to 16.5 ms depending on active batch sequence length.
  • Total Topology Transition Time: Consistently under 45 ms, easily fitting inside the typical inter-token scheduling window of distributed inference.

Production Deployment Playbook: Kubernetes, Ray, and Prometheus Monitoring

Deploying Nitsum in enterprise production environments requires orchestrating GPU affinity, configuring NVLink peer-to-peer permissions, and establishing real-time SLO monitoring.

Production Deployment Architecture: ┌────────────────────────────────────────────────────────────────────────┐ | Kubernetes Pod (8x NVIDIA H100) | | | | ┌──────────────────────────────────────────────────────────────────┐ | | │ Nitsum Gateway (HTTP/gRPC Router) │ | | │ • Tier Classification: Extracts `x-request-tier` Header │ | | │ • SLO Target Registration: Registers TTFT & TPOT Deadlines │ | | └──────────────────────────────────┬───────────────────────────────┘ | | │ | | ▼ | | ┌──────────────────────────────────────────────────────────────────┐ | | │ Nitsum Ray Cluster Reconfiguration Engine │ | | │ • Actor Group 0: GPU [0..3] (TP=4) │ | | │ • Actor Group 1: GPU [4..7] (TP=4) │ | | │ • Shared NVLink IPC Direct Memory Handle Registration │ | | └──────────────────────────────────┬───────────────────────────────┘ | | │ | | ▼ | | ┌──────────────────────────────────────────────────────────────────┐ | | │ Prometheus Exporter & Metrics Collector │ | | │ • nitsum_current_tp_level (Gauge per worker) │ | | │ • nitsum_slo_compliance_ratio (Counter: met vs violated) │ | | │ • nitsum_reconfiguration_duration_ms (Histogram) │ | | └──────────────────────────────────────────────────────────────────┘ | └────────────────────────────────────────────────────────────────────────┘

1. Kubernetes Resource Manifest

Ensure your Kubernetes pod manifest grants IPC host sharing and NVIDIA capabilities required for zero-copy peer memory mapping:

apiVersion: apps/v1 kind: Deployment metadata: name: nitsum-inference-serving namespace: ai-serving spec: replicas: 1 selector: matchLabels: app: nitsum-worker template: metadata: labels: app: nitsum-worker spec: hostIPC: true containers: - name: nitsum-server image: ghcr.io/wuklab/nitsum:latest resources: limits: nvidia.com/gpu: '8' memory: 512Gi cpu: '64' env: - name: NITSUM_MAX_TP value: '8' - name: NITSUM_ENABLE_RELOAD_FREE_WEIGHTS value: '1' - name: NITSUM_NVLINK_P2P_MIGRATION value: '1' - name: NITSUM_RECONFIG_INTERVAL_MS value: '1000' ports: - containerPort: 8000 name: http-api - containerPort: 9090 name: metrics

2. Client Ingestion with Tier Headers

When sending queries from downstream applications, include explicit tier metadata headers so the Nitsum gateway can enforce appropriate scheduling rules:

import requests response_interactive = requests.post( "http://nitsum-gateway.ai-serving.svc.cluster.local:8000/v1/chat/completions", headers={ "Content-Type": "application/json", "x-request-tier": "interactive", "x-slo-ttft-ms": "200", "x-slo-tpot-ms": "25" }, json={ "model": "meta-llama/Llama-3-70B-Instruct", "messages": [{"role": "user", "content": "Explain adaptive tensor parallelism in three sentences."}], "temperature": 0.2 } ) print("Interactive response:", response_interactive.json()) response_batch = requests.post( "http://nitsum-gateway.ai-serving.svc.cluster.local:8000/v1/chat/completions", headers={ "Content-Type": "application/json", "x-request-tier": "background", "x-slo-ttft-ms": "10000", "x-slo-tpot-ms": "100" }, json={ "model": "meta-llama/Llama-3-70B-Instruct", "messages": [{"role": "user", "content": "Extract and structure data from the attached document archive."}], "temperature": 0.0 } ) print("Batch response status:", response_batch.status_code)

For teams building automated ingestion pipelines, integrating with aiFetchly API Integration or exploring aiFetchly Data Fetching allows decoupling high-volume document scraping from interactive user query paths.

Frequently Asked Questions (FAQ)

What is Nitsum and how does it differ from vanilla vLLM?

Nitsum is an open-source distributed serving framework developed by the WukLab at UC San Diego that introduces runtime-adaptive Tensor Parallelism (TP). While vanilla vLLM requires selecting a fixed TP degree at cluster boot time (e.g., permanently locking an 8-GPU node into TP=8 or four TP=2 instances), Nitsum treats TP as an elastic, millisecond-level runtime control surface. It dynamically merges or partitions GPU worker groups based on real-time interactive queue backlogs and background batch volume.

How does Nitsum change tensor parallelism without reloading weights?

Nitsum uses a technique called Reload-Free Weight Reuse. During cluster initialization, model weights are pre-partitioned at the maximum parallelism granularity ($TP_{max}=8$). Adjacent GPUs map each other’s virtual address spaces over high-bandwidth NVLink interconnects using CUDA virtual memory management. When GPUs merge into lower TP groups, the system simply updates logical tensor pointers and kernel launch dimensions—reconfiguring weights in under 15 milliseconds without reading from host RAM or storage.

Does migrating the KV cache cause generation pauses or dropped tokens?

No. Nitsum employs a double-buffered asynchronous migration mechanism. In-flight requests continue generating tokens on their existing worker group while historical KV cache blocks are copied across NVLink via asynchronous peer-to-peer DMA streams. Only the final token state is synchronized before atomic cutover, ensuring zero token generation bubbles.

Can Nitsum be deployed alongside pipeline or data parallelism?

Yes. While Nitsum focuses on tensor parallelism inside high-bandwidth NVLink domains (typically single 8-GPU nodes), it composes cleanly with Data Parallelism (DP) across separate server nodes and Pipeline Parallelism (PP) for models exceeding single-node memory capacity.

What hardware is required to run Nitsum?

Nitsum requires multi-GPU nodes with high-speed peer-to-peer interconnects supporting direct DMA and Unified Virtual Addressing (UVA). It is optimized for NVIDIA HGX architectures (H100, H200, B200, and A100) connected via NVLink and NVSwitch. Standard PCIe-only topologies can run Nitsum, but KV cache resharding and weight pointer updates will experience slightly higher transition latencies.

Where can I access the Nitsum research paper and source code?

The Nitsum research paper is available on the arXiv preprint repository (Nitsum: Serving Tiered LLM Requests with Adaptive Tensor Parallelism, arXiv:2605.05467), authored by researchers at the UC San Diego WukLab. You can inspect implementation details and cluster configuration templates in the open-source repository.

For more details on deploying scalable AI pipelines, consult the aiFetchly Documentation and check our enterprise aiFetchly Pricing options.