<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rey Kingers</title>
    <description>The latest articles on DEV Community by Rey Kingers (@reykingers_f513925d3df43).</description>
    <link>https://dev.to/reykingers_f513925d3df43</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4026552%2Fe19e3769-cf50-49d7-a183-199534927efe.jpg</url>
      <title>DEV Community: Rey Kingers</title>
      <link>https://dev.to/reykingers_f513925d3df43</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reykingers_f513925d3df43"/>
    <language>en</language>
    <item>
      <title>Token Economics: Why Your LLM Bill Is 3 What the Pricing Page Promised</title>
      <dc:creator>Rey Kingers</dc:creator>
      <pubDate>Mon, 13 Jul 2026 03:01:02 +0000</pubDate>
      <link>https://dev.to/reykingers_f513925d3df43/token-economics-why-your-llm-bill-is-3x-what-the-pricing-page-promised-36e7</link>
      <guid>https://dev.to/reykingers_f513925d3df43/token-economics-why-your-llm-bill-is-3x-what-the-pricing-page-promised-36e7</guid>
      <description>&lt;p&gt;&lt;code&gt;Every LLM provider publishes a pricing table.&lt;/code&gt;$2.50 per million input tokens. $10 per million output tokens.` Clean. Transparent. Easy to spreadsheet.&lt;/p&gt;

&lt;p&gt;So you run the napkin math: 10,000 requests/day × 2,000 input tokens × $2.50/M = &lt;strong&gt;$18.25/day&lt;/strong&gt; on GPT-4o. Annualized: $6,660. The CFO approves it.&lt;/p&gt;

&lt;p&gt;Three months later the bill is &lt;strong&gt;$54/day&lt;/strong&gt; — $19,710/year — and nobody can explain the gap.&lt;/p&gt;

&lt;p&gt;It's not a billing error. It's &lt;strong&gt;five structural leaks&lt;/strong&gt; between the pricing page and your credit card.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Five Leaks, at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Leak&lt;/th&gt;
&lt;th&gt;What It Is&lt;/th&gt;
&lt;th&gt;How Much It Costs You&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workload ratio&lt;/td&gt;
&lt;td&gt;Output tokens cost 3–4× more than input&lt;/td&gt;
&lt;td&gt;2.9× spread across use cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokenizer variance&lt;/td&gt;
&lt;td&gt;Same text = different token counts per provider&lt;/td&gt;
&lt;td&gt;5–15% (EN), 15–30% (multilingual)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt caching&lt;/td&gt;
&lt;td&gt;Anthropic gives 90% off, OpenAI 50% — nobody configures it&lt;/td&gt;
&lt;td&gt;24% of total bill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch processing&lt;/td&gt;
&lt;td&gt;50% off for async workloads&lt;/td&gt;
&lt;td&gt;15–30% blended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry overhead&lt;/td&gt;
&lt;td&gt;Failed requests consume tokens twice&lt;/td&gt;
&lt;td&gt;1–3% + architectural waste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These aren't additive. They're &lt;strong&gt;stackable&lt;/strong&gt;. Combined, the difference between naive pricing and optimized reality is 40–65%.&lt;/p&gt;




&lt;h2&gt;
  
  
  Leak 1: Workload Ratio — Your Use Case Is the Multiplier
&lt;/h2&gt;

&lt;p&gt;Output tokens cost 3–5× more than input tokens. The ratio between them is determined by your workload — and it's the single largest cost variable.&lt;/p&gt;

&lt;p&gt;Same model (GPT-4o). Same request count (10,000/day). Different workloads:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Annual Cost&lt;/th&gt;
&lt;th&gt;vs Chat&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;💬 Chat&lt;/td&gt;
&lt;td&gt;20M&lt;/td&gt;
&lt;td&gt;8M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$47,450&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔍 RAG / Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;60M&lt;/td&gt;
&lt;td&gt;8M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$83,950&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.8×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝 Summarization&lt;/td&gt;
&lt;td&gt;80M&lt;/td&gt;
&lt;td&gt;10M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$109,500&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.3×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💻 Code Generation&lt;/td&gt;
&lt;td&gt;15M&lt;/td&gt;
&lt;td&gt;30M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$123,188&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.6×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Translation&lt;/td&gt;
&lt;td&gt;30M&lt;/td&gt;
&lt;td&gt;30M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$136,875&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.9×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.9× spread — same model, same request count.&lt;/strong&gt; Before comparing providers. Before factoring any other leak.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Measure your actual input-to-output token ratio in production. Most teams guess 1:1. Almost no real workload is 1:1.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Leak 2: Tokenizer Variance — You're Comparing Different Units
&lt;/h2&gt;

&lt;p&gt;Every provider's tokenizer is different. The same text produces different token counts on each:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Tokenizer&lt;/th&gt;
&lt;th&gt;Relative Efficiency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cl100k_base&lt;/code&gt; (tiktoken)&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Proprietary BPE&lt;/td&gt;
&lt;td&gt;5–10% fewer tokens (EN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;SentencePiece&lt;/td&gt;
&lt;td&gt;5–10% more tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;BPE (optimized for Chinese+English)&lt;/td&gt;
&lt;td&gt;5–15% more tokens (EN-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; comparing per-token prices without benchmarking your actual text = comparing different units. Provider A at $2.00/M with a 10% hungrier tokenizer = Provider B at $2.20/M. The cheaper sticker price may be more expensive after tokenization.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Run your actual production text through 2–3 candidate tokenizers before committing. At 1M+ requests/day, a 10% efficiency gap is thousands/month.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Leak 3: Prompt Caching — The 90% Discount Nobody Turns On
&lt;/h2&gt;

&lt;p&gt;Anthropic introduced prompt caching in August 2024. OpenAI followed with automatic caching. Google launched context caching in early 2025. The discounts are the largest cost lever in LLM APIs — and most teams never configure it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Standard Input&lt;/th&gt;
&lt;th&gt;Cached Input&lt;/th&gt;
&lt;th&gt;Discount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude Opus 4&lt;/td&gt;
&lt;td&gt;$15.00/M&lt;/td&gt;
&lt;td&gt;$1.50/M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude Sonnet 4&lt;/td&gt;
&lt;td&gt;$3.00/M&lt;/td&gt;
&lt;td&gt;$0.30/M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI GPT-4o&lt;/td&gt;
&lt;td&gt;$2.50/M&lt;/td&gt;
&lt;td&gt;$1.25/M&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Gemini 2.5 Pro&lt;/td&gt;
&lt;td&gt;$1.25/M&lt;/td&gt;
&lt;td&gt;$0.3125/M&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What's actually cacheable in your app:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token Category&lt;/th&gt;
&lt;th&gt;Typical Size&lt;/th&gt;
&lt;th&gt;Cacheability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;System prompt&lt;/td&gt;
&lt;td&gt;500–2,000 tokens&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Few-shot examples&lt;/td&gt;
&lt;td&gt;500–3,000 tokens&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG context&lt;/td&gt;
&lt;td&gt;2,000–8,000 tokens&lt;/td&gt;
&lt;td&gt;20–40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversation history&lt;/td&gt;
&lt;td&gt;1,000–10,000 tokens&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Real example:&lt;/strong&gt; a customer support chatbot with 1,500-token system prompt, 1,000-token few-shot examples, 3,000-token RAG context per query. Total input: 5,500 tokens. Cacheable: 2,500 tokens (45%).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Annual Cost (Claude Sonnet 4)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Naive (no caching)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$104,025&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With caching configured&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$79,388&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Saved by one config change&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$24,638 (24%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Identify your cacheable prefix tokens. Structure API calls so they appear at the beginning of every prompt. Anthropic requires explicit cache point marking; OpenAI and Google handle it automatically.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Leak 4: Batch Processing — Half Price, No Catch
&lt;/h2&gt;

&lt;p&gt;OpenAI and Anthropic offer batch endpoints at &lt;strong&gt;50% off&lt;/strong&gt; standard pricing. The tradeoff: up to 24-hour completion SLA instead of real-time response.&lt;/p&gt;

&lt;p&gt;For offline workloads — evaluation runs, dataset labeling, embedding generation, nightly summarization, synthetic data generation — there is literally zero downside. The 50% discount is free money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stacked with prompt caching:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
Cached input  + batch = 5% of sticker price  (90% off × 50% off)&lt;br&gt;
Uncached input + batch = 50% of sticker price&lt;br&gt;
Output         + batch = 50% of sticker price&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Moving 60% of the support chatbot's traffic to batch: &lt;strong&gt;$55,572/year&lt;/strong&gt; vs $104,025 naive = &lt;strong&gt;47% saved.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Segment traffic into realtime and async. Route async to batch endpoints. The infrastructure change is an API endpoint swap — no model changes, no prompt changes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Leak 5: Rate Limit Retries — Paying Twice
&lt;/h2&gt;

&lt;p&gt;When your app hits API rate limits, the client retries — and the failed tokens are charged. At 2% retry rate, 10,000 requests/day: $365/year in wasted input tokens. Small, but the architectural cost is larger: teams over-provision multiple providers to avoid limits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Exponential backoff with jitter. Monitor retry rate (if &amp;gt;1%, you need higher limits or a queuing layer). Route async traffic to batch endpoints (separate, higher limits).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The 2026 Provider Landscape
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Models&lt;/th&gt;
&lt;th&gt;Output Price&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Premium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Opus 4&lt;/td&gt;
&lt;td&gt;$75/M&lt;/td&gt;
&lt;td&gt;Non-negotiable quality + caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GPT-4o, Claude Sonnet 4, Gemini 2.5 Pro, Mistral Large 2&lt;/td&gt;
&lt;td&gt;$5–15/M&lt;/td&gt;
&lt;td&gt;General purpose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Budget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GPT-4o-mini, Claude Haiku, Gemini Flash, Llama 4 Scout (Groq)&lt;/td&gt;
&lt;td&gt;$0.50–1.25/M&lt;/td&gt;
&lt;td&gt;Classification, extraction, filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disruptor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepSeek-V3, DeepSeek-R1&lt;/td&gt;
&lt;td&gt;$1.10–2.19/M&lt;/td&gt;
&lt;td&gt;Flagship capability at budget prices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The caching twist:&lt;/strong&gt; Anthropic's 90% cache discount makes Claude Opus 4's effective cached input ($1.50/M) cheaper than GPT-4o's standard input ($2.50/M). At high cache hit rates, the premium tier beats the standard tier on price.&lt;/p&gt;




&lt;h2&gt;
  
  
  Self-Hosted vs API: The Breakeven Math
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;th&gt;GPU Cost&lt;/th&gt;
&lt;th&gt;Breakeven vs DeepSeek&lt;/th&gt;
&lt;th&gt;Breakeven vs GPT-4o-mini&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8B model&lt;/td&gt;
&lt;td&gt;1× H100 = $1,800/mo&lt;/td&gt;
&lt;td&gt;Wins at &lt;strong&gt;35% utilization&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Wins at &lt;strong&gt;50% utilization&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70B model&lt;/td&gt;
&lt;td&gt;3× H100 = $5,400/mo&lt;/td&gt;
&lt;td&gt;Wins at &lt;strong&gt;40% utilization&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Wins at &lt;strong&gt;3% utilization&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The utilization reality:&lt;/strong&gt; most teams overestimate their GPU utilization. Self-hosted GPUs idle during nights, weekends, holidays. The API charges zero for idle time. Bursty traffic → API wins. Steady high throughput → self-hosting wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hidden cost:&lt;/strong&gt; self-hosting a 70B model across 3 GPUs requires understanding tensor parallelism, quantization (AWQ/GPTQ/FP8), continuous batching (vLLM/TGI), and GPU node management. Budget 0.25–0.5 FTE for production self-hosting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five Questions That Determine Your Bill
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What's your actual input-to-output ratio?&lt;/strong&gt; Measure it. Don't guess 1:1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What % of input tokens are cacheable?&lt;/strong&gt; If &amp;gt;20%, Anthropic's 90% cache discount may beat GPT-4o despite the higher sticker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What % of traffic tolerates 24-hour latency?&lt;/strong&gt; Batch = 50% off. Moving 30% of traffic to batch cuts blended cost by 15%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is traffic steady or bursty?&lt;/strong&gt; Steady → self-host. Bursty → API. Be honest about utilization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Need multi-provider for reliability?&lt;/strong&gt; A three-tier routing strategy (budget/standard/flagship) cuts blended per-token cost by 60–80% vs routing everything to the flagship.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Interactive calculator: &lt;a href="https://www.jslet.com/llm-api-pricing-calculator" rel="noopener noreferrer"&gt;jslet.com/llm-api-pricing-calculator&lt;/a&gt; — compare 12 models across 6 providers with caching, batch, and workload presets. All client-side, no signup.&lt;/em&gt;&lt;br&gt;
`&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>api</category>
      <category>finops</category>
    </item>
    <item>
      <title>DNS Propagation Time: How Long Until Your DNS Change Goes Live?</title>
      <dc:creator>Rey Kingers</dc:creator>
      <pubDate>Mon, 13 Jul 2026 02:51:28 +0000</pubDate>
      <link>https://dev.to/reykingers_f513925d3df43/dns-propagation-time-how-long-until-your-dns-change-goes-live-3mcd</link>
      <guid>https://dev.to/reykingers_f513925d3df43/dns-propagation-time-how-long-until-your-dns-change-goes-live-3mcd</guid>
      <description>&lt;p&gt;&lt;code&gt;You change the A record for&lt;/code&gt;api.example.com&lt;code&gt;from&lt;/code&gt;203.0.113.10&lt;code&gt;to&lt;/code&gt;203.0.113.20`. Your browser shows the new IP. The deployment dashboard says green.&lt;/p&gt;

&lt;p&gt;Then the Slack messages start rolling in:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"API is down from Singapore."&lt;br&gt;&lt;br&gt;
"Connection refused from Frankfurt."&lt;br&gt;&lt;br&gt;
"Works fine here in Virginia."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is DNS propagation. &lt;strong&gt;It is not a single number.&lt;/strong&gt; It's a probability distribution — shaped by your TTL, the cache policies of 8 major resolver populations, and the geographic topology of the DNS hierarchy itself.&lt;/p&gt;

&lt;p&gt;The user on Google DNS sees the change in &lt;strong&gt;60 seconds&lt;/strong&gt;. The user on Deutsche Telekom might wait &lt;strong&gt;24 hours&lt;/strong&gt;. Both readings are correct from their vantage point.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Architecture Nobody Explains
&lt;/h2&gt;

&lt;p&gt;DNS is not a push protocol. When you update a record at your authoritative nameserver, it doesn't notify anyone. It waits. Resolvers come to it when their cached copy expires. The time between "change made" and "every resolver has the new answer" is your propagation window — and it's determined entirely by cache expiration, not network physics.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Four-Step Lifecycle of a DNS Change
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Timer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;You update the zone file and increment SOA serial&lt;/td&gt;
&lt;td&gt;t=0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A resolver cold-queries your authoritative NS, gets the new record, starts its TTL countdown&lt;/td&gt;
&lt;td&gt;t + RTT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;While TTL ticks, all users behind that resolver get the cached answer&lt;/td&gt;
&lt;td&gt;TTL window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;TTL expires, resolver re-queries, gets the new record&lt;/td&gt;
&lt;td&gt;t + RTT + TTL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The key insight:&lt;/strong&gt; each resolver's countdown started when &lt;em&gt;it&lt;/em&gt; last cached the record — not when &lt;em&gt;you&lt;/em&gt; made the change. If a resolver cached the old record 30 seconds before your update with a 3600s TTL, it will serve the old value for &lt;strong&gt;59 minutes and 30 seconds after your change&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 8 Resolver Populations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tier 1: Strict TTL Honor (Fastest)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google Public DNS&lt;/strong&gt; — &lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Walks the DNS hierarchy from root to authoritative for every cold query. No upstream forwarding. No minimum TTL override.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propagation:&lt;/strong&gt; TTL + 0–60s. At 300s TTL: 5–6 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market share:&lt;/strong&gt; ~10% of global DNS. Default on many Android OEM builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare 1.1.1.1&lt;/strong&gt; — &lt;code&gt;1.1.1.1&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;330+ edge locations. Cache is per-edge, not global — Mumbai and London may see the record expire at slightly different times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propagation:&lt;/strong&gt; TTL + 0–90s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WARP catch:&lt;/strong&gt; Cloudflare WARP users layer an additional cache at the egress point. Adds 30–60s delay vs native 1.1.1.1.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tier 2: Mostly Honoring (Slight Lag)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quad9&lt;/strong&gt; — &lt;code&gt;9.9.9.9&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Honors TTL but enforces a 30s minimum. Every query passes through IBM X-Force + 18 threat-intelligence feeds; filtering adds 5–50ms to cold queries but doesn't affect cached answers.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;DNSSEC landmine:&lt;/strong&gt; Quad9 validates DNSSEC by default. Broken DNSSEC → SERVFAIL → cached for the negative TTL. Frequently misdiagnosed as "propagation failure."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;OpenDNS / Cisco Umbrella&lt;/strong&gt; — &lt;code&gt;208.67.222.222&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Honors TTL with 1–3 min processing overhead from content filtering. Enterprise Umbrella users may have admin-configured cache overrides.&lt;/li&gt;
&lt;li&gt;NXDOMAIN handling: free tier replaces NXDOMAIN with a search page. Irrelevant to propagation but confusing during testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tier 3: ISP Resolvers — The Wild West
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Comcast / Xfinity&lt;/strong&gt; — &lt;code&gt;75.75.75.75&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimum TTL: 300s&lt;/strong&gt; for A/AAAA. Regional cache clusters — East Coast ≠ West Coast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propagation:&lt;/strong&gt; max(your TTL, 300s) + 0–15 min.&lt;/li&gt;
&lt;li&gt;~30 million subscribers. Largest single ISP resolver population in the US.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;BT / EE (UK)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimum TTL: 900s&lt;/strong&gt; for A/AAAA. Independent regional clusters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propagation:&lt;/strong&gt; max(your TTL, 900s) + 0–10 min.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deutsche Telekom — the reason "48 hours" exists&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimum TTL: 3,600s&lt;/strong&gt; (1 hour) for A/AAAA. The most aggressive override among major ISPs.&lt;/li&gt;
&lt;li&gt;Three-tier hierarchical cache: &lt;strong&gt;edge → regional → central&lt;/strong&gt;. Each tier caches independently. All three must expire sequentially before the change propagates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Propagation:&lt;/strong&gt; 1–24 hours for A records. NS changes: 48+ hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;45 million subscribers.&lt;/strong&gt; This single ISP is why "DNS takes 48 hours" persists as industry lore — for their users, it genuinely can.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;General ISP defaults&lt;/strong&gt; — the catch-all model&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most Tier 2/3 ISPs run BIND or Unbound with default configs. BIND default min-TTL: 300s. Unbound: no minimum, but 86400s maximum. Many ISPs customize upward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe assumption:&lt;/strong&gt; ISP resolvers enforce 300–900s min for A/AAAA, 3600s for MX/NS, 600–3600s for negative caching.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Pre-Warming Playbook
&lt;/h2&gt;

&lt;p&gt;The difference between a 5-minute cutover and a 48-hour outage for half your users:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;T–1 day&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lower TTL to 60–300s. Wait ≥ old TTL duration.&lt;/td&gt;
&lt;td&gt;Expire the old long cache everywhere &lt;em&gt;before&lt;/em&gt; the change.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;T=0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Make the DNS change.&lt;/td&gt;
&lt;td&gt;Every resolver now has a short stale window, not a long one.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;T+1 hour&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verify propagation across all 4 public resolvers.&lt;/td&gt;
&lt;td&gt;Confirm the change is live.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;T+1 day&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Restore original TTL.&lt;/td&gt;
&lt;td&gt;Operational TTL back to normal; short TTL already expired.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The logic:&lt;/strong&gt; you're not fighting stale caches — you expired them before the battle. A 60s TTL means 60s propagation on Google DNS and Cloudflare. 300s on Comcast (their minimum). 3600s on Deutsche Telekom (their minimum). Pre-warming eliminates the old-cache variable; it cannot override ISP minimum TTL policies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When pre-warming fails:&lt;/strong&gt; NS record changes. Parent zone NS records have registry-level TTLs (&lt;code&gt;.com&lt;/code&gt; = 2 days, set by Verisign). No amount of pre-warming your own zone accelerates registry TTLs. Nameserver migrations are inherently 24–48 hour affairs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Propagation Check
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`bash&lt;/p&gt;

&lt;h1&gt;
  
  
  Test each major resolver
&lt;/h1&gt;

&lt;p&gt;dig +short A example.com @8.8.8.8       # Google&lt;br&gt;
dig +short A example.com @1.1.1.1       # Cloudflare&lt;br&gt;
dig +short A example.com @9.9.9.9       # Quad9&lt;br&gt;
dig +short A example.com @208.67.222.222  # OpenDNS&lt;/p&gt;

&lt;h1&gt;
  
  
  Google DNS-over-HTTPS (machine-readable)
&lt;/h1&gt;

&lt;p&gt;curl -s "&lt;a href="https://dns.google/resolve?name=example.com&amp;amp;type=A" rel="noopener noreferrer"&gt;https://dns.google/resolve?name=example.com&amp;amp;type=A&lt;/a&gt;" | jq '.Answer[] | {name, data}'&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Golden rule:&lt;/strong&gt; if Google DNS returns the new IP but your ISP doesn't — it's your ISP's cache policy, not your DNS configuration. Don't touch the zone file. Wait.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Try the interactive propagation modeler at &lt;a href="https://www.jslet.com/dns-propagation" rel="noopener noreferrer"&gt;jslet.com/dns-propagation&lt;/a&gt; — plug in your TTL, record type, and see per-resolver estimates across all 8 populations. 100% client-side.&lt;/em&gt;&lt;br&gt;
`&lt;/p&gt;

</description>
      <category>dns</category>
      <category>networking</category>
      <category>devops</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>LLM Inference Latency: Why Your 7B Model Gets 15 tok/s on a T4 but 3,500 tok/s on an H100</title>
      <dc:creator>Rey Kingers</dc:creator>
      <pubDate>Mon, 13 Jul 2026 02:16:01 +0000</pubDate>
      <link>https://dev.to/reykingers_f513925d3df43/llm-inference-latency-why-your-7b-model-gets-15-toks-on-a-t4-but-3500-toks-on-an-h100-2fea</link>
      <guid>https://dev.to/reykingers_f513925d3df43/llm-inference-latency-why-your-7b-model-gets-15-toks-on-a-t4-but-3500-toks-on-an-h100-2fea</guid>
      <description>&lt;p&gt;`NVIDIA's spec sheet says the H100 delivers &lt;strong&gt;989 TFLOPS&lt;/strong&gt; of FP16 compute. The A100: 312. The T4: 65. Simple arithmetic says the H100 is 15× faster.&lt;/p&gt;

&lt;p&gt;So a 7-billion-parameter LLM should be 15× faster on an H100, right?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;It's 150× faster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The T4 struggles at &lt;strong&gt;~15 tok/s&lt;/strong&gt;. The H100 cruises at &lt;strong&gt;~2,200 tok/s&lt;/strong&gt; — and with continuous batching, north of &lt;strong&gt;3,500&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The 15× TFLOPS gap doesn't explain the 150× throughput gap. The missing variable is the one thing NVIDIA's marketing pages bury on line three of the spec table:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Memory bandwidth.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The T4 has 300 GB/s. The H100 has 3,350 GB/s. That's an 11× gap in raw bandwidth, and closer to 100–150× in effective throughput once cache size and clock speed are factored in.&lt;/p&gt;

&lt;p&gt;This post traces the arithmetic from first principles: &lt;em&gt;why&lt;/em&gt; memory bandwidth is the bottleneck, &lt;em&gt;how&lt;/em&gt; quantization turns it into a lever, and &lt;em&gt;what&lt;/em&gt; tok/s you should actually expect across 12 real GPU × model combinations.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Memory Bandwidth: The Bottleneck Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Autoregressive LLM inference has two phases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Bottleneck&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prefill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Process the input prompt (all tokens in parallel)&lt;/td&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Decode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generate output tokens (one at a time)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Memory bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The decode phase dominates total latency for any response longer than a few tokens. And in decode, the GPU spends 98%+ of its time doing nothing — waiting for the next chunk of model weights to arrive from VRAM.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Arithmetic, Step by Step
&lt;/h3&gt;

&lt;p&gt;Each generated token requires reading &lt;strong&gt;every single parameter&lt;/strong&gt; from VRAM. For a 7B model at FP16:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`plaintext&lt;br&gt;
Weights:  7,000,000,000 params × 2 bytes = 14 GB per token&lt;/p&gt;

&lt;p&gt;H100:     14 GB ÷ 3,350 GB/s = 4.18 ms   →   239 tok/s (theoretical)&lt;br&gt;
T4:       14 GB ÷   300 GB/s = 46.7 ms   →    21 tok/s (theoretical)&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now consider the compute cost: ~14 TFLOPs per token. The H100's 989 TFLOPS could execute that &lt;strong&gt;70 times&lt;/strong&gt; in 4.18 ms. The compute units finish their work and sit idle, waiting for the next 14 GB of weights to trickle in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You cannot compute faster than you can read.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every meaningful LLM optimization — quantization, KV cache compression, FlashAttention, speculative decoding — is fundamentally about &lt;strong&gt;reducing bytes moved per token&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Full GPU Landscape
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GPU&lt;/th&gt;
&lt;th&gt;Bandwidth&lt;/th&gt;
&lt;th&gt;7B FP16&lt;/th&gt;
&lt;th&gt;7B INT4&lt;/th&gt;
&lt;th&gt;70B INT4&lt;/th&gt;
&lt;th&gt;VRAM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA B200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8,000 GB/s&lt;/td&gt;
&lt;td&gt;571&lt;/td&gt;
&lt;td&gt;2,286&lt;/td&gt;
&lt;td&gt;229&lt;/td&gt;
&lt;td&gt;192 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA H200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4,800 GB/s&lt;/td&gt;
&lt;td&gt;343&lt;/td&gt;
&lt;td&gt;1,371&lt;/td&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;td&gt;141 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA H100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3,350 GB/s&lt;/td&gt;
&lt;td&gt;239&lt;/td&gt;
&lt;td&gt;957&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;80 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA A100-80GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,039 GB/s&lt;/td&gt;
&lt;td&gt;146&lt;/td&gt;
&lt;td&gt;583&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;80 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA RTX 4090&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,008 GB/s&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;288&lt;/td&gt;
&lt;td&gt;28.8&lt;/td&gt;
&lt;td&gt;24 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA L40S&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;864 GB/s&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;247&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;48 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NVIDIA T4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;300 GB/s&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Theoretical tok/s at 100% bandwidth utilization. Real-world: multiply by 0.6–0.85. "—" = doesn't fit in VRAM.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Quantization: 4× Faster Without Changing GPUs
&lt;/h2&gt;

&lt;p&gt;If your bottleneck is bytes-per-token, and you can't change the GPU's memory bandwidth, there's exactly one lever left: &lt;strong&gt;reduce bytes per parameter&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Precision&lt;/th&gt;
&lt;th&gt;Bytes/Param&lt;/th&gt;
&lt;th&gt;7B Model&lt;/th&gt;
&lt;th&gt;70B Model&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;th&gt;Quality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FP16&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;14 GB&lt;/td&gt;
&lt;td&gt;140 GB&lt;/td&gt;
&lt;td&gt;1×&lt;/td&gt;
&lt;td&gt;Reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT8&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;7 GB&lt;/td&gt;
&lt;td&gt;70 GB&lt;/td&gt;
&lt;td&gt;~1.8×&lt;/td&gt;
&lt;td&gt;Negligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;INT4 (GPTQ/AWQ)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.5 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35 GB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~3.5×&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1–3% perplexity&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT3&lt;/td&gt;
&lt;td&gt;0.375&lt;/td&gt;
&lt;td&gt;2.6 GB&lt;/td&gt;
&lt;td&gt;26 GB&lt;/td&gt;
&lt;td&gt;~4.5×&lt;/td&gt;
&lt;td&gt;3–8% loss&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The rule of thumb:&lt;/strong&gt; the larger the model, the harder it is to break with quantization. A 405B model at INT2 often outperforms a 70B model at FP16 on knowledge tasks — despite using fewer bytes per token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What quantization doesn't improve:&lt;/strong&gt; time-to-first-token (prefill latency). Prefill is compute-bound. Quantization can even make it &lt;em&gt;slower&lt;/em&gt; due to dequantization overhead. The gains apply almost entirely to the decode phase.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Real Benchmarks
&lt;/h2&gt;

&lt;p&gt;Theoretical ceilings are clean math. Reality includes framework overhead, attention kernel efficiency, and KV cache management. These numbers are from &lt;strong&gt;vLLM 0.6.x&lt;/strong&gt;, continuous batching, bare-metal H100 instances — mid-2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Precision&lt;/th&gt;
&lt;th&gt;GPU(s)&lt;/th&gt;
&lt;th&gt;Batch 1&lt;/th&gt;
&lt;th&gt;Batch 8&lt;/th&gt;
&lt;th&gt;Batch 32&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Scout (8B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FP16&lt;/td&gt;
&lt;td&gt;1× H100&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;td&gt;1,200&lt;/td&gt;
&lt;td&gt;3,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Scout (8B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;INT4&lt;/td&gt;
&lt;td&gt;1× H100&lt;/td&gt;
&lt;td&gt;620&lt;/td&gt;
&lt;td&gt;3,800&lt;/td&gt;
&lt;td&gt;8,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Scout (8B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;INT4&lt;/td&gt;
&lt;td&gt;1× RTX 4090&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;310&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral Small 3 (7B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FP16&lt;/td&gt;
&lt;td&gt;1× H100&lt;/td&gt;
&lt;td&gt;195&lt;/td&gt;
&lt;td&gt;1,250&lt;/td&gt;
&lt;td&gt;3,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Maverick (70B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FP16&lt;/td&gt;
&lt;td&gt;2× H100&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;190&lt;/td&gt;
&lt;td&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama 4 Maverick (70B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;INT4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1× H100&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;440&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,050&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral Large 2 (123B)&lt;/td&gt;
&lt;td&gt;FP16&lt;/td&gt;
&lt;td&gt;4× H100&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek-V3 (671B MoE)&lt;/td&gt;
&lt;td&gt;INT8&lt;/td&gt;
&lt;td&gt;8× H100&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 2.5 (72B)&lt;/td&gt;
&lt;td&gt;INT4&lt;/td&gt;
&lt;td&gt;1× H100&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;410&lt;/td&gt;
&lt;td&gt;960&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phi-4 (14B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;INT4&lt;/td&gt;
&lt;td&gt;1× RTX 4090&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 3 (27B)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;INT4&lt;/td&gt;
&lt;td&gt;1× RTX 4090&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"TP=N" = Tensor Parallelism across N GPUs. "—" = VRAM insufficient at listed context length. Output token decode only.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The headline:&lt;/strong&gt; INT4 turns a 70B model from "needs 2 GPUs and is still slow" into "runs on 1 GPU and is faster than FP16 on 2."&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Batch Size: The Latency–Throughput Tradeoff
&lt;/h2&gt;

&lt;p&gt;Batching fills the idle time between memory reads. While one request waits for weights, another's compute can run. But per-request latency climbs with batch size.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Batch&lt;/th&gt;
&lt;th&gt;Latency Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Real-time chat / copilot&lt;/td&gt;
&lt;td&gt;1–4&lt;/td&gt;
&lt;td&gt;&amp;lt;200ms TTFT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code completion&lt;/td&gt;
&lt;td&gt;1–2&lt;/td&gt;
&lt;td&gt;&amp;lt;20ms/tok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support chatbot&lt;/td&gt;
&lt;td&gt;4–16&lt;/td&gt;
&lt;td&gt;&amp;lt;1s TTFT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summarization (async)&lt;/td&gt;
&lt;td&gt;16–32&lt;/td&gt;
&lt;td&gt;Throughput priority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dataset labeling&lt;/td&gt;
&lt;td&gt;32–128&lt;/td&gt;
&lt;td&gt;Throughput only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Continuous batching&lt;/strong&gt; (vLLM, TensorRT-LLM, SGLang) is the critical innovation. Traditional static batching waits for &lt;em&gt;all&lt;/em&gt; requests to finish. Continuous batching evicts completed requests and admits new ones at &lt;em&gt;every decode step&lt;/em&gt; — eliminating the "one slow request holds up 31 others" problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;If you deploy without continuous batching, you're leaving 50–70% of your GPU throughput on the table.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Multi-GPU: The Scaling Efficiency Problem
&lt;/h2&gt;

&lt;p&gt;When one GPU isn't enough, you split the model with &lt;strong&gt;tensor parallelism&lt;/strong&gt;. But all-reduce communication between GPUs eats into your gains:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;th&gt;Batch 32 tok/s&lt;/th&gt;
&lt;th&gt;Per-GPU Efficiency&lt;/th&gt;
&lt;th&gt;NCCL Tax&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2× A100 (TP=2)&lt;/td&gt;
&lt;td&gt;380&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;92%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4× A100 (TP=4)&lt;/td&gt;
&lt;td&gt;610&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8× A100 (TP=8)&lt;/td&gt;
&lt;td&gt;840&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;63%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~37%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;At TP=8, nearly 40% of interconnect bandwidth goes to synchronization.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is why &lt;strong&gt;expert-parallel&lt;/strong&gt; inference for MoE models is revolutionary: each expert lives on a dedicated GPU, and only the &lt;em&gt;active&lt;/em&gt; experts participate in each forward pass. DeepSeek-V3 has 671B total parameters but only 37B active — so it's faster than a 70B dense model despite having 10× more total weights.&lt;/p&gt;




&lt;h2&gt;
  
  
  The One-Sentence Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;LLM inference throughput = GPU memory bandwidth ÷ bytes per token. Everything else is overhead management.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Try the interactive calculator at &lt;a href="https://www.jslet.com/llm-inference-latency" rel="noopener noreferrer"&gt;jslet.com/llm-inference-latency&lt;/a&gt; — plug in your model, GPU, and quantization level. All 100% client-side, no signup.&lt;/em&gt;&lt;br&gt;
`&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gpu</category>
      <category>machinelearning</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
