PageSourceSearch

https://lucent.blog/deepseek-v41-flash-dp2-tp8/

html lucent.blog collected 2026-10-04 08:03:25 UTC 41,741 bytes, 722 lines download raw bytes

1<!DOCTYPE html>
2<html lang="zh">
3<head>
4    <meta charset="utf-8">
5    <meta name="viewport" content="width=device-width, initial-scale=1">
6    <title>双机 16×H100 部署 DeepSeek-V4.1-Flash:vLLM DP2 × TP8 + EP16 + 1M 上下文实战</title>
7    <link rel="preload" as="style" href="/assets/built/screen.css?v=eO5MZ7MbqRs0AXtb">
8    <link rel="stylesheet" href="/assets/built/screen.css?v=eO5MZ7MbqRs0AXtb">
9            <link rel="stylesheet" href="https://lucent.blog/dist/Artalk.css" data-artalk-styles onerror="this.dataset.artalkStylesFailed = 'true'">
10    <link rel="icon" href="https://lucent.blog/content/images/size/w256h256/format/jpeg/2026/08/b_2efb53416812e31894318965b1251a61-1.jpg" type="image/jpeg">
11    <link rel="canonical" href="https://lucent.blog/deepseek-v41-flash-dp2-tp8/">
12    <link rel="alternate" type="text/markdown" href="https://lucent.blog/deepseek-v41-flash-dp2-tp8.md">
13    <meta name="referrer" content="no-referrer-when-downgrade">
14    
15    <meta property="og:site_name" content="Lucent&#x27;s Blog">
16    <meta property="og:type" content="article">
17    <meta property="og:title" content="双机 16×H100 部署 DeepSeek-V4.1-Flash:vLLM DP2 × TP8 + EP16 + 1M 上下文实战">
18    <meta property="og:description" content="DeepSeek-V4.1-Flash 是 DeepSeek 新一代大规模 MoE 模型,原生支持 1,048,576 Token(1M)上下文,同时包含 Engram Memory、稀疏注意力、Vision 以及 DSpark Speculative Decoding 等机制。
19
20vLLM 官方 Recipe 给出的模型规模非常大:约 552B Backbone + 196B Engram Memory,模型文件约 511 GB,官方给出的最低显存预算约 614 GB。
21
22本文记录一次实际部署:
23
24以下所有折腾均是因为截止发文,vllm代码仍未完美支持多机推理 DeepSeek-V4.1-Flash。
25
26服务器数量:">
27    <meta property="og:url" content="https://lucent.blog/deepseek-v41-flash-dp2-tp8/">
28    <meta property="og:image" content="https://lucent.blog/content/images/size/w1200/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png">
29    <meta property="article:published_time" content="2026-09-14T15:10:18.000Z">
30    <meta property="article:modified_time" content="2026-09-14T15:27:29.000Z">
31    <meta property="article:tag" content="大模型">
32    
33    <meta name="twitter:card" content="summary_large_image">
34    <meta name="twitter:title" content="双机 16×H100 部署 DeepSeek-V4.1-Flash:vLLM DP2 × TP8 + EP16 + 1M 上下文实战">
35    <meta name="twitter:description" content="DeepSeek-V4.1-Flash 是 DeepSeek 新一代大规模 MoE 模型,原生支持 1,048,576 Token(1M)上下文,同时包含 Engram Memory、稀疏注意力、Vision 以及 DSpark Speculative Decoding 等机制。
36
37vLLM 官方 Recipe 给出的模型规模非常大:约 552B Backbone + 196B Engram Memory,模型文件约 511 GB,官方给出的最低显存预算约 614 GB。
38
39本文记录一次实际部署:
40
41以下所有折腾均是因为截止发文,vllm代码仍未完美支持多机推理 DeepSeek-V4.1-Flash。
42
43服务器数量:">
44    <meta name="twitter:url" content="https://lucent.blog/deepseek-v41-flash-dp2-tp8/">
45    <meta name="twitter:image" content="https://lucent.blog/content/images/size/w1200/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png">
46    <meta name="twitter:label1" content="Written by">
47    <meta name="twitter:data1" content="Lucent">
48    <meta name="twitter:label2" content="Filed under">
49    <meta name="twitter:data2" content="大模型">
50    <meta property="og:image:width" content="1200">
51    <meta property="og:image:height" content="675">
52    
53    
53<script type="application/ld+json">
54{
55    "@context": "https://schema.org",
56    "@type": "Article",
57    "publisher": {
58        "@type": "Organization",
59        "name": "Lucent's Blog",
60        "url": "https://lucent.blog/",
61        "logo": {
62            "@type": "ImageObject",
63            "url": "https://lucent.blog/content/images/2026/08/b_2efb53416812e31894318965b1251a61.jpg",
64            "width": 60,
65            "height": 60
66        }
67    },
68    "author": {
69        "@type": "Person",
70        "name": "Lucent",
71        "image": {
72            "@type": "ImageObject",
73            "url": "https://www.gravatar.com/avatar/3642289e0b2e0025802a85f6b5b6a8a0?s=250&r=x&d=mp",
74            "width": 250,
75            "height": 250
76        },
77        "url": "https://lucent.blog/author/lucent/",
78        "sameAs": []
79    },
80    "headline": "双机 16×H100 部署 DeepSeek-V4.1-Flash:vLLM DP2 × TP8 + EP16 + 1M 上下文实战",
81    "url": "https://lucent.blog/deepseek-v41-flash-dp2-tp8/",
82    "datePublished": "2026-09-14T15:10:18.000Z",
83    "dateModified": "2026-09-14T15:27:29.000Z",
84    "image": {
85        "@type": "ImageObject",
86        "url": "https://lucent.blog/content/images/size/w1200/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png",
87        "width": 1200,
88        "height": 675
89    },
90    "keywords": "大模型",
91    "description": "DeepSeek-V4.1-Flash 是 DeepSeek 新一代大规模 MoE 模型,原生支持 1,048,576 Token(1M)上下文,同时包含 Engram Memory、稀疏注意力、Vision 以及 DSpark Speculative Decoding 等机制。\n\nvLLM 官方 Recipe 给出的模型规模非常大:约 552B Backbone + 196B Engram Memory,模型文件约 511 GB,官方给出的最低显存预算约 614 GB。\n\n本文记录一次实际部署:\n\n以下所有折腾均是因为截止发文,vllm代码仍未完美支持多机推理 DeepSeek-V4.1-Flash。\n\n服务器数量:2\nGPU:16 × NVIDIA H100 80GB\n每节点:8 × H100\n节点 1:10.30.8.1\n节点 2:10.30.8.2\n\n高速网络:\nNode 1:\n  ens11np0 = 1.1.1.2\n  ens13np0 = 1.1.2.2\n\nNode 2:\n  ens11np0 = 1.1.1.1\n  ens13np0 = 1.1.2.1\n\n网络:双路 4",
92    "mainEntityOfPage": "https://lucent.blog/deepseek-v41-flash-dp2-tp8/"
93}
94    </script>
94
95
96    <meta name="generator" content="Ghost 6.59">
97    <link rel="alternate" type="application/rss+xml" title="Lucent&#x27;s Blog" href="https://lucent.blog/rss/">
98    
99    
99<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="e47e3d9ecc25587dd309a3f526" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://lucent.blog/" data-locale="zh" crossorigin="anonymous"></script>
99
100    
101    <link href="https://lucent.blog/webmentions/receive/" rel="webmention">
102    
102<script defer src="/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
102
103    <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=Jw0334E-A8vpuWdm">
104    
104<script defer src="/public/ghost-stats.min.js?v=RYVTbqYSu0JtTYwE" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://lucent.blog/api/v1/page_hit"  tb_site_uuid="0a519f17-ce0c-4b9e-8152-2e0f20a2d7cd" tb_post_uuid="6b128eb5-c7cc-44c3-8349-0771797de376" tb_post_type="post" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script>
104<style>:root {--ghost-accent-color: #FF1A75;}</style>
105    <link rel="preconnect" href="https://fonts.bunny.net"><link rel="stylesheet" href="https://fonts.bunny.net/css?family=noto-serif:400,700|noto-sans:400,700"><style>:root {--gh-font-heading: Noto Serif;--gh-font-body: Noto Sans;}</style>
106</head>
107<body class="post-template tag-halo-content-11 gh-font-heading-noto-serif gh-font-body-noto-sans route-content">
108    <a class="skip-link" href="#main-content">跳到正文</a>
109    <header class="site-panel">
110    <div class="site-panel__background" aria-hidden="true">
111            <img class="site-panel__background-image" src="/content/images/size/w2000/2026/08/37A6B7EA-DD79-475F-BD74-AAB500C6882F.png" alt="">
112    </div>
113    <div class="site-panel__content">
114        <button class="site-panel__menu-button mobile-menu-toggle" type="button" data-mobile-menu-toggle aria-controls="site-navigation" aria-expanded="false" aria-label="切换导航">
115            <span class="site-panel__menu-icon"><svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
116    <path d="M4 6h16"></path>
117    <path d="M4 12h16"></path>
118    <path d="M4 18h16"></path>
119</svg>
120</span>
121            <span class="site-panel__close-icon"><svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
122    <path d="M6 6l12 12"></path>
123    <path d="M18 6L6 18"></path>
124</svg>
125</span>
126        </button>
127
128        <div class="site-panel__identity" data-site-identity>
129            <a class="site-panel__avatar-link" href="https://lucent.blog/#blog" data-blog-action aria-label="查看文章">
130                    <img class="site-panel__avatar" src="/content/images/size/w360/2026/08/b_2efb53416812e31894318965b1251a61.jpg" alt="Lucent&#x27;s Blog" width="80" height="80">
131            </a>
132
133            <p class="site-panel__title">
134                <a class="site-panel__brand" href="https://lucent.blog" data-home-action>Lucent&#x27;s Blog</a>
135            </p>
136
137            <p class="site-panel__subtitle">
138                当时明月在  曾照彩云归
139            </p>
140            <hr class="site-panel__divider">
141            <p class="site-panel__welcome">
142                人生不相见,动如参与商。
143            </p>
144            <hr class="site-panel__divider site-panel__divider--secondary">
145
146            <nav id="site-navigation" class="site-panel__navigation" aria-label="主导航">
147                <ul class="nav">
148    <li class="nav-shou-ye"><a href="https://lucent.blog/">首页</a></li>
149    <li class="nav-wen-zhang"><a href="https://lucent.blog/#blog">文章</a></li>
150    <li class="nav-guan-yu"><a href="https://lucent.blog/about/">关于</a></li>
151    <li class="nav-wo-de-zuo-pin"><a href="https://lucent.blog/MyWorks/">我的作品</a></li>
152    <li class="nav-teabuddy"><a href="https://teabuddy.dev/">TeaBuddy</a></li>
153</ul>
154
155            </nav>
156        </div>
157
158        <div class="site-panel__actions" role="group" aria-label="站点工具">
159            <button class="site-panel__search" type="button" data-ghost-search aria-label="搜索">
160                <svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
161    <circle cx="11" cy="11" r="7"></circle>
162    <path d="m20 20-4-4"></path>
163</svg>
164            </button>
165        </div>
166
167        <div class="site-panel__social-links" role="group" aria-label="社交链接">
168        </div>
169    </div>
170</header>
171    <div class="content-shell">
172        <div id="main-content" class="content-shell__inner" tabindex="-1">
173            
174<main class="article-view">
175  <article class="article post tag-halo-content-11">
176    <header class="article-header">
177      <div class="article-meta">
178        <time datetime="2026-09-14">2026-09-14</time>
179        <span>预计阅读 12 分钟</span>
180      </div>
181      <h1>双机 16×H100 部署 DeepSeek-V4.1-Flash:vLLM DP2 × TP8 + EP16 + 1M 上下文实战</h1>
182      <div class="article-byline">
183        <span><a href="/author/lucent/">Lucent</a></span>
184        <span><a href="/tag/halo-content-11/">大模型</a></span>
185      </div>
186    </header>
187
188    <figure class="article-image">
189      <img
190        src="/content/images/size/w2000/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png"
191        srcset="/content/images/size/w360/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png 360w,
192                /content/images/size/w720/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png 720w,
193                /content/images/size/w1200/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png 1200w,
194                /content/images/size/w2000/2026/09/be93c42e-425a-441f-90d0-2412adc44576.png 2000w"
195        sizes="(max-width: 960px) 92vw, (max-width: 1400px) 60vw, 860px"
196        alt="双机 16×H100 部署 DeepSeek-V4.1-Flash:vLLM DP2 × TP8 + EP16 + 1M 上下文实战"
197        loading="eager"
198        fetchpriority="high"
199      >
200    </figure>
201
202    <section class="gh-content">
203      <p>DeepSeek-V4.1-Flash 是 DeepSeek 新一代大规模 MoE 模型,原生支持 <strong>1,048,576 Token(1M)上下文</strong>,同时包含 Engram Memory、稀疏注意力、Vision 以及 DSpark Speculative Decoding 等机制。</p><p>vLLM 官方 Recipe 给出的模型规模非常大:约 <strong>552B Backbone + 196B Engram Memory</strong>,模型文件约 511 GB,官方给出的最低显存预算约 614 GB。</p><p>本文记录一次实际部署:</p><p>以下所有折腾均是因为截止发文,vllm代码仍未完美支持多机推理 DeepSeek-V4.1-Flash。</p><pre><code class="language-`">服务器数量:2
204GPU:16 × NVIDIA H100 80GB
205每节点:8 × H100
206节点 1:10.30.8.1
207节点 2:10.30.8.2
208
209高速网络:
210Node 1:
211  ens11np0 = 1.1.1.2
212  ens13np0 = 1.1.2.2
213
214Node 2:
215  ens11np0 = 1.1.1.1
216  ens13np0 = 1.1.2.1
217
218网络:双路 400G RoCE</code></pre><p>最终采用:</p><pre><code class="language-`">DP = 2
219TP = 8
220EP = 16
221PP = 1
222Context = 1M
223DSpark = ON
224Vision = ON</code></pre><p>也就是:</p><pre><code class="language-`">                     API Server
225                         │
226                   10.30.8.1
227                         │
228                   DP Coordinator
229                   ┌─────┴─────┐
230                   │           │
231               DP Rank 0    DP Rank 1
232                   │           │
233            10.30.8.1      10.30.8.2
234               TP8            TP8
235          GPU 0 ~ GPU 7   GPU 0 ~ GPU 7
236                   └─────┬─────┘
237                         │
238                       EP16</code></pre><p>vLLM 本身支持这种 <strong>DP + TP + EP</strong> 组合:Attention 在每个 DP rank 内使用 TP,MoE Expert 则可以通过 <code>--enable-expert-parallel</code> 在 <code>DP × TP</code> 范围组成 Expert Parallel Group。</p><h3 id="%E4%B8%80%E3%80%81%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%80%E7%BB%88%E9%80%89%E6%8B%A9-dp2-%C3%97-tp8">一、为什么最终选择 DP2 × TP8</h3><p>一开始最自然的想法其实是:</p><pre><code>2 节点 × 8 H100
239        ↓
240       TP16</code></pre><p>也就是让一个请求横跨全部 16 张 GPU。</p><p>但实际测试发现,截至本文使用的 vLLM nightly:</p><pre><code>vllm/vllm-openai:nightly-eed1f3d0c6043bd494424a22443ee198dd56f657</code></pre><p>DeepSeek-V4.1-Flash 的 TP16 路径仍然存在实现限制。</p><p>实际启动已经可以:</p><pre><code class="language-`">✓ 初始化 16 个 TP Rank
241✓ NCCL 跨节点通信
242✓ 加载 DeepSeek-V4.1-Flash
243✓ 加载模型权重</code></pre><p>但在 <code>profile_run</code> 阶段进入 FlashMLA 时会报:</p><pre><code class="language-`">vllm/models/deepseek_v4_1/nvidia/flashmla.py
244
245heads_per_group =
246    self.n_local_heads // self.n_local_groups
247
248ZeroDivisionError:
249integer division or modulo by zero</code></pre><p>也就是在 <strong>TP16 切分后,当前 FlashMLA 对部分本地 Attention Group 的划分出现了 <code>n_local_groups == 0</code></strong>。</p><p>除此之外,DeepSeek-V4.1 的 Engram 目前也存在 TP shard 数量方面的约束。vLLM 当前代码中甚至明确保留(前一天的晚上不是这样,所以是官方也发现了问题):</p><pre><code class="language-`">
249# TODO: Support row-wise sharding when there are too few hash heads.</code></pre><p>因此这并不是:</p><pre><code>NCCL 配置错误
250RoCE 网络错误
251显存不足
252模型文件损坏</code></pre><p>而是当前 vLLM 对 DeepSeek-V4.1 <strong>超大 TP Size 的模型实现仍有边界条件没有完全处理</strong>。</p><p>所以这里改为:</p><pre><code>TP16 × DP1
253       ↓
254TP8 × DP2</code></pre><p>每台服务器形成一个 TP8 Attention Group。</p><h3 id="%E4%BA%8C%E3%80%81dp2-%C3%97-tp8-%E5%92%8C-tp16-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB">二、DP2 × TP8 和 TP16 有什么区别</h3><p>两种拓扑看起来都用了 16 张 H100,但执行方式不同。</p>
255<!--kg-card-begin: html-->
256<table data-start="2521" data-end="2849" class="w-fit min-w-(--thread-content-width)"><thead data-start="2521" data-end="2552"><tr data-start="2521" data-end="2552"><th data-start="2521" data-end="2526" data-col-size="sm" class="last:pe-10">项目</th><th data-start="2526" data-end="2539" data-col-size="sm" class="last:pe-10">TP16 × DP1</th><th data-start="2539" data-end="2552" data-col-size="sm" class="last:pe-10">TP8 × DP2</th></tr></thead><tbody data-start="2569" data-end="2849"><tr data-start="2569" data-end="2589"><td data-start="2569" data-end="2578" data-col-size="sm">GPU 总数</td><td data-start="2578" data-end="2583" data-col-size="sm">16</td><td data-start="2583" data-end="2589" data-col-size="sm">16</td></tr><tr data-start="2590" data-end="2604"><td data-start="2590" data-end="2595" data-col-size="sm">DP</td><td data-start="2595" data-end="2599" data-col-size="sm">1</td><td data-start="2599" data-end="2604" data-col-size="sm">2</td></tr><tr data-start="2605" data-end="2633"><td data-start="2605" data-end="2623" data-col-size="sm">每个 Attention TP</td><td data-start="2623" data-end="2628" data-col-size="sm">16</td><td data-start="2628" data-end="2633" data-col-size="sm">8</td></tr><tr data-start="2634" data-end="2667"><td data-start="2634" data-end="2652" data-col-size="sm">Expert Parallel</td><td data-start="2652" data-end="2659" data-col-size="sm">EP16</td><td data-start="2659" data-end="2667" data-col-size="sm">EP16</td></tr><tr data-start="2668" data-end="2695"><td data-start="2668" data-end="2686" data-col-size="sm">Attention 是否跨节点</td><td data-start="2686" data-end="2690" data-col-size="sm">是</td><td data-start="2690" data-end="2695" data-col-size="sm">否</td></tr><tr data-start="2696" data-end="2720"><td data-start="2696" data-end="2711" data-col-size="sm">Expert 是否跨节点</td><td data-start="2711" data-end="2715" data-col-size="sm">是</td><td data-start="2715" data-end="2720" data-col-size="sm">是</td></tr><tr data-start="2721" data-end="2748"><td data-start="2721" data-end="2735" data-col-size="sm">独立 KV Cache</td><td data-start="2735" data-end="2741" data-col-size="sm">1 组</td><td data-start="2741" data-end="2748" data-col-size="sm">2 组</td></tr><tr data-start="2749" data-end="2771"><td data-start="2749" data-end="2760" data-col-size="sm">API 吞吐能力</td><td data-start="2760" data-end="2765" data-col-size="sm">较低</td><td data-start="2765" data-end="2771" data-col-size="sm">更高</td></tr><tr data-start="2772" data-end="2802"><td data-start="2772" data-end="2792" data-col-size="sm">单请求 Attention GPU</td><td data-start="2792" data-end="2797" data-col-size="sm">16</td><td data-start="2797" data-end="2802" data-col-size="sm">8</td></tr><tr data-start="2803" data-end="2822"><td data-start="2803" data-end="2811" data-col-size="sm">多请求并发</td><td data-start="2811" data-end="2816" data-col-size="sm">一般</td><td data-start="2816" data-end="2822" data-col-size="sm">更好</td></tr><tr data-start="2823" data-end="2849"><td data-start="2823" data-end="2836" data-col-size="sm">1M Context</td><td data-start="2836" data-end="2843" data-col-size="sm">理论支持</td><td data-start="2843" data-end="2849" data-col-size="sm">支持</td></tr></tbody></table>
257<!--kg-card-end: html-->
258<p>DP2 并不会把:</p><pre><code>1M Context</code></pre><p>变成:</p><pre><code>512K + 512K</code></pre><p>一个请求仍然可以拥有完整:</p><pre><code>1,048,576 Token</code></pre><p>只是它的 Attention 会在其中一个 TP8 Replica 上运行。</p><p>例如:</p><pre><code>Request A
259   ↓
260DP Rank 0
261   ↓
262Node 1 TP8
263
264Request B
265   ↓
266DP Rank 1
267   ↓
268Node 2 TP8</code></pre><p>而 MoE Expert 部分,由于开启:</p><pre><code>--enable-expert-parallel</code></pre><p>Expert Parallel Size 为:</p><pre><code>EP_SIZE = DP × TP
269
270        = 2 × 8
271
272        = 16</code></pre><p>所以 Expert 仍然可以横跨 16 张 GPU。</p><h3 id="%E4%B8%89%E3%80%81docker-%E9%95%9C%E5%83%8F">三、Docker 镜像</h3><p>本次使用:</p><pre><code>vllm/vllm-openai:nightly-eed1f3d0c6043bd494424a22443ee198dd56f657</code></pre><p>这个版本已经包含:</p><pre><code>DeepseekV41ForCausalLM
273DeepSeek V4.1 tokenizer
274DeepSeek V4.1 tool parser
275DeepSeek V4.1 reasoning parser
276DSpark
277新版 Engram 实现
278Rust Frontend</code></pre><p>模型存放在两台机器相同路径:</p><pre><code>/mnt/disk2/modelscope/models/deepseek-ai/DeepSeek-V4.1-Flash</code></pre><h3 id="%E5%9B%9B%E3%80%81%E4%B8%BB%E8%8A%82%E7%82%B9-docker-compose">四、主节点 Docker Compose</h3><p>主节点:</p><pre><code>10.30.8.1
279
280400G IP:
2811.1.1.2
2821.1.2.2</code></pre><p><code>docker-compose.yml</code>:</p><pre><code class="language-yml">services:
283  deepseek-v41-flash:
284    image: vllm/vllm-openai:nightly-eed1f3d0c6043bd494424a22443ee198dd56f657
285    container_name: deepseek-v41-flash
286    restart: unless-stopped
287
288    network_mode: host
289    ipc: host
290    privileged: true
291    gpus: all
292
293    environment:
294      CUDA_VISIBLE_DEVICES: "0,1,2,3,4,5,6,7"
295
296      # vLLM 节点间通信地址
297      VLLM_HOST_IP: "1.1.1.2"
298
299      # 大模型初始化可能需要较长时间
300      VLLM_ENGINE_READY_TIMEOUT_S: "3600"
301
302      # DeepSeek V4.1 推荐 Rust Frontend
303      VLLM_USE_RUST_FRONTEND: "1"
304
305      PYTHONUNBUFFERED: "1"
306
307      # ========================
308      # NCCL / RoCE
309      # ========================
310
311      NCCL_DEBUG: "INFO"
312
313      # NCCL Socket 使用两张 400G 网卡
314      NCCL_SOCKET_IFNAME: "=ens11np0,ens13np0"
315
316      # Gloo 控制通信固定走第一张 400G 网卡
317      GLOO_SOCKET_IFNAME: "ens11np0"
318
319      # 两张 400G RoCE HCA
320      NCCL_IB_HCA: "=mlx5_0:1,mlx5_2:1"
321
322      # 启用 IB Verbs / RoCE
323      NCCL_IB_DISABLE: "0"
324
325    volumes:
326      - /mnt/disk2/modelscope/models:/models:ro
327      - ./vllm-cache/deepseek-v41-flash:/root/.cache
328
329    ulimits:
330      memlock:
331        soft: -1
332        hard: -1
333      stack:
334        soft: 67108864
335        hard: 67108864
336
337    command:
338      - /models/deepseek-ai/DeepSeek-V4.1-Flash
339
340      # ========================
341      # API
342      # ========================
343
344      - --host
345      - "0.0.0.0"
346
347      - --port
348      - "8030"
349
350      - --served-model-name
351      - DeepSeek-V4.1-Flash
352
353      # ========================
354      # TP8
355      # ========================
356
357      - --tensor-parallel-size
358      - "8"
359
360      - --distributed-executor-backend
361      - mp
362
363      # ========================
364      # DP2
365      # ========================
366
367      # 全局 DP 数量
368      - --data-parallel-size
369      - "2"
370
371      # 当前节点运行一个 DP Replica
372      - --data-parallel-size-local
373      - "1"
374
375      # 主节点不要指定 --data-parallel-start-rank
376      # 默认从 DP Rank 0 开始
377
378      # DP Coordinator 地址
379      - --data-parallel-address
380      - "1.1.1.2"
381
382      - --data-parallel-rpc-port
383      - "13399"
384
385      - --data-parallel-backend
386      - mp
387
388      # ========================
389      # Expert Parallel
390      # ========================
391
392      # DP2 × TP8 =&gt; EP16
393      - --enable-expert-parallel
394
395      # ========================
396      # Context / Scheduler
397      # ========================
398
399      # DeepSeek-V4.1 原生 1M Context
400      - --max-model-len
401      - "1048576"
402
403      # 单次 Scheduler Iteration 最大 Token Budget
404      - --max-num-batched-tokens
405      - "8192"
406
407      # 每个 DP Rank 最大活跃 Sequence 数量
408      - --max-num-seqs
409      - "128"
410
411      - --gpu-memory-utilization
412      - "0.95"
413
414      # DeepSeek MLA KV Cache
415      - --kv-cache-dtype
416      - fp8_ds_mla
417
418      - --enable-prefix-caching
419
420      # ========================
421      # DeepSeek V4.1
422      # ========================
423
424      - --tokenizer-mode
425      - deepseek_v41
426
427      # Tool Calling
428      - --tool-call-parser
429      - deepseek_v41
430
431      - --enable-auto-tool-choice
432
433      # Reasoning / Thinking
434      - --reasoning-parser
435      - deepseek_v41
436
437      # ========================
438      # DSpark
439      # ========================
440
441      - --speculative-config
442      - '{"method":"dspark","num_speculative_tokens":5,"draft_sample_method":"probabilistic","rejection_sample_method":"block","enable_adaptive_verification":true}'</code></pre><p>这里有一个非常容易踩的坑:</p><p><strong>主节点不要设置:</strong></p><pre><code>--data-parallel-start-rank 0</code></pre><p>vLLM 当前 CLI 中,<code>--data-parallel-start-rank</code> 是给 secondary node 使用的。如果主节点也显式设置它,会进入 Hybrid Load Balancing 判断,从而和子节点的 <code>--headless</code> 模式冲突。官方多节点 Internal DP 示例同样是主节点不传 <code>start-rank</code>,secondary node 才传。</p><h3 id="%E4%BA%94%E3%80%81%E5%AD%90%E8%8A%82%E7%82%B9-docker-compose">五、子节点 Docker Compose</h3><p>第二台服务器:</p><pre><code>10.30.8.2
443
444400G IP:
4451.1.1.1
4461.1.2.1</code></pre><p>完整配置:</p><pre><code>services:
447  deepseek-v41-flash:
448    image: vllm/vllm-openai:nightly-eed1f3d0c6043bd494424a22443ee198dd56f657
449    container_name: deepseek-v41-flash
450    restart: unless-stopped
451
452    network_mode: host
453    ipc: host
454    privileged: true
455    gpus: all
456
457    environment:
458      CUDA_VISIBLE_DEVICES: "0,1,2,3,4,5,6,7"
459
460      # 当前节点 400G 网络 IP
461      VLLM_HOST_IP: "1.1.1.1"
462
463      VLLM_ENGINE_READY_TIMEOUT_S: "3600"
464
465      VLLM_USE_RUST_FRONTEND: "1"
466
467      PYTHONUNBUFFERED: "1"
468
469      # ========================
470      # NCCL / RoCE
471      # ========================
472
473      NCCL_DEBUG: "INFO"
474
475      NCCL_SOCKET_IFNAME: "=ens11np0,ens13np0"
476
477      GLOO_SOCKET_IFNAME: "ens11np0"
478
479      NCCL_IB_HCA: "=mlx5_0:1,mlx5_2:1"
480
481      NCCL_IB_DISABLE: "0"
482
483    volumes:
484      - /mnt/disk2/modelscope/models:/models:ro
485      - ./vllm-cache/deepseek-v41-flash:/root/.cache
486
487    ulimits:
488      memlock:
489        soft: -1
490        hard: -1
491      stack:
492        soft: 67108864
493        hard: 67108864
494
495    command:
496      - /models/deepseek-ai/DeepSeek-V4.1-Flash
497
498      # ========================
499      # Headless Worker
500      # ========================
501
502      # 第二节点不提供 HTTP API
503      - --headless
504
505      - --served-model-name
506      - DeepSeek-V4.1-Flash
507
508      # ========================
509      # TP8
510      # ========================
511
512      - --tensor-parallel-size
513      - "8"
514
515      - --distributed-executor-backend
516      - mp
517
518      # ========================
519      # DP2
520      # ========================
521
522      - --data-parallel-size
523      - "2"
524
525      - --data-parallel-size-local
526      - "1"
527
528      # 第二台服务器负责 DP Rank 1
529      - --data-parallel-start-rank
530      - "1"
531
532      # 始终指向主节点
533      - --data-parallel-address
534      - "1.1.1.2"
535
536      - --data-parallel-rpc-port
537      - "13399"
538
539      - --data-parallel-backend
540      - mp
541
542      # ========================
543      # Expert Parallel
544      # ========================
545
546      - --enable-expert-parallel
547
548      # ========================
549      # Context / Scheduler
550      # ========================
551
552      - --max-model-len
553      - "1048576"
554
555      - --max-num-batched-tokens
556      - "8192"
557
558      - --max-num-seqs
559      - "128"
560
561      - --gpu-memory-utilization
562      - "0.95"
563
564      - --kv-cache-dtype
565      - fp8_ds_mla
566
567      - --enable-prefix-caching
568
569      # ========================
570      # DeepSeek V4.1
571      # ========================
572
573      - --tokenizer-mode
574      - deepseek_v41
575
576      - --tool-call-parser
577      - deepseek_v41
578
579      - --enable-auto-tool-choice
580
581      - --reasoning-parser
582      - deepseek_v41
583
584      # ========================
585      # DSpark
586      # ========================
587
588      - --speculative-config
589      - '{"method":"dspark","num_speculative_tokens":5,"draft_sample_method":"probabilistic","rejection_sample_method":"block","enable_adaptive_verification":true}'</code></pre><p>官方的多节点 Internal DP 也是类似结构:</p><pre><code>主节点:
590API + 本地 DP Engine
591
592Secondary:
593--headless
594--data-parallel-start-rank N</code></pre><p>最终所有请求仍然只需要访问主节点。</p><h3 id="%E5%85%AD%E3%80%81%E5%90%AF%E5%8A%A8%E9%A1%BA%E5%BA%8F">六、启动顺序</h3><p>推荐先启动子节点:</p><pre><code>docker compose up</code></pre><p>或者:</p><pre><code>docker compose up -d
595docker compose logs -f</code></pre><p>等子节点开始等待 Coordinator。</p><p>然后启动主节点:</p><pre><code>docker compose up -d
596docker compose logs -f</code></pre><p>最终 API 地址:</p><pre><code>http://10.30.8.1:8030</code></pre><h3 id="%E4%B8%83%E3%80%81%E9%AA%8C%E8%AF%81%E6%A8%A1%E5%9E%8B">七、验证模型</h3><p>首先检查模型列表:</p><pre><code>curl http://10.30.8.1:8030/v1/models</code></pre><p><img src="https://obj.lemonc.cc/files/2026/09/14/224918.png" alt="" loading="lazy"></p>
597<p>然后发送测试请求:</p><pre><code>curl http://10.30.8.1:8030/v1/chat/completions \
598  -H "Content-Type: application/json" \
599  -d '{
600    "model": "DeepSeek-V4.1-Flash",
601    "messages": [
602      {
603        "role": "user",
604        "content": "17*19等于多少?只返回数字。"
605      }
606    ],
607    "temperature": 0,
608    "chat_template_kwargs": {
609      "thinking": false
610    }
611  }'</code></pre><p><img src="https://obj.lemonc.cc/files/2026/09/14/225205.png" alt="" loading="lazy"></p>
612<p>关闭 Thinking:</p><pre><code>{
613  "chat_template_kwargs": {
614    "thinking": false
615  }
616}</code></pre><p>需要推理模式时则:</p><pre><code>{
617  "chat_template_kwargs": {
618    "thinking": true
619  }
620}</code></pre><h3 id="%E5%85%AB%E3%80%818192-%E5%92%8C-128-%E5%88%86%E5%88%AB%E6%8E%A7%E5%88%B6%E4%BB%80%E4%B9%88">八、8192 和 128 分别控制什么</h3><p>当前最终配置:</p><pre><code>--max-num-batched-tokens 8192
621--max-num-seqs 128</code></pre><p>这两个参数很容易被误解。</p><h2 id="max-num-batched-tokens8192"><code>max-num-batched-tokens=8192</code></h2><p>它不是:</p><pre><code>最大上下文 = 8192</code></pre><p>真正的最大上下文仍然由:</p><pre><code>--max-model-len 1048576</code></pre><p>决定。</p><p><code>max-num-batched-tokens</code> 控制的是:</p><blockquote>
621一个 Scheduler iteration 内最多处理多少 Token。</blockquote><p>所以一个 1M Prompt 可以被 Chunked Prefill 拆成很多个 chunk:</p><pre><code>1,048,576 / 8192
622≈ 128 个调度 Chunk</code></pre><p>8192 也是 vLLM DeepSeek-V4.1 Recipe 给出的常见 sweet spot。</p><p>值更大:</p><pre><code>16384
62332768</code></pre><p>长 Prompt Prefill 吞吐可能提高,但 activation、workspace 和一次 forward 的压力也会增大。</p><hr><h2 id="max-num-seqs128"><code>max-num-seqs=128</code></h2><p>它表示:</p><blockquote>每一个 DP rank 同时最多调度 128 条活跃 sequence。</blockquote><p>因为我们现在:</p><pre><code>DP = 2</code></pre><p>所以整个服务理论 Scheduler Active Sequence 上限:</p><pre><code>128 × 2
624= 256 sequences</code></pre><p>注意这里是:</p><pre><code>Active Sequences</code></pre><p>而不是:</p><pre><code>最多只能有 256 个 HTTP 请求</code></pre><p>超过 256 的请求可以继续在队列等待。</p><p>所以客户端完全可以:</p><pre><code>Concurrency = 300</code></pre><p>只是在某一个瞬间真正进入两个 Engine Scheduler 的 active sequence 数量最多约:</p><pre><code>256</code></pre><p>其余请求等待调度。</p><h3 id="%E4%B9%9D%E3%80%81%E5%AE%9E%E9%99%85%E5%8E%8B%E6%B5%8B%E7%BB%93%E6%9E%9C">九、实际压测结果</h3><p><img src="https://obj.lemonc.cc/files/2026/09/14/225404.png" alt="" loading="lazy"></p>
625<h3 id="%E5%8D%81%E3%80%81%E5%87%A0%E4%B8%AA%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95">十、几个踩坑记录</h3><h4 id="1-%E4%B8%BB%E8%8A%82%E7%82%B9%E4%B8%8D%E8%83%BD%E8%AE%BE%E7%BD%AE-data-parallel-start-rank0">1. 主节点不能设置 <code>data-parallel-start-rank=0</code></h4><p>错误配置:</p><pre><code>主节点:
626--data-parallel-start-rank 0
627
628子节点:
629--headless</code></pre><p>可能导致:</p><pre><code>Remote engine 1 must not use --headless
630in external or hybrid dp lb mode</code></pre><p>正确方式:</p><pre><code>主节点:
631不传 start-rank
632
633子节点:
634--data-parallel-start-rank 1
635--headless</code></pre><p>官方文档同样把 <code>--data-parallel-start-rank</code> 定义为 secondary node 的起始 DP rank。</p><h4 id="2-%E4%B8%8D%E8%A6%81%E4%BD%BF%E7%94%A8-tp16">2. 不要使用 TP16</h4><p>当前 tested nightly 下:</p><pre><code>TP16
636→ FlashMLA local attention group 分片异常
637→ n_local_groups = 0
638→ ZeroDivisionError</code></pre><p>所以:</p><pre><code>DP2 × TP8</code></pre><p>是目前在 2×8 H100 上更稳定的方案。</p><h4 id="3-dspark-%E4%B8%8D%E5%BB%BA%E8%AE%AE%E5%92%8C-pp2-%E6%B7%B7%E7%94%A8">3. DSpark 不建议和 PP2 混用</h4><p>我们之前还测试过:</p><pre><code>TP8 × PP2 + DSpark</code></pre><p>DSpark Draft Model 当前不支持 Pipeline Parallel 路径,因此会出现:</p><pre><code>Pipeline parallelism is not supported for this model</code></pre><p>所以本方案保持:</p><pre><code class="language-`">PP = 1</code></pre><h3 id="%E5%8D%81%E4%B8%80%E3%80%81%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B2%A1%E6%9C%89%E7%BB%A7%E7%BB%AD%E4%BD%BF%E7%94%A8%E5%AE%98%E6%96%B9%E6%97%A9%E6%9C%9F%E9%95%9C%E5%83%8Fdeepseekv41-flash-0909">十一、为什么没有继续使用官方早期镜像deepseekv41-flash-0909</h3><p>最开始部署 DeepSeek-V4.1-Flash 时,我们使用的是 vLLM 为该模型提供的专用镜像:</p><pre><code>vllm/vllm-openai:deepseekv41-flash-0909</code></pre><p>镜像内实际 vLLM 版本为:</p><pre><code>0.1.dev20904+g179dd0fa9</code></pre><p>这个镜像单机 <code>TP8</code> 可以运行 DeepSeek-V4.1-Flash,因此最初的想法很直接:</p><pre><code>单机:
6398 × H100
640TP8
641        ↓
642扩展到双机:
64316 × H100</code></pre><p>但真正做双机测试时,发现当时这个专用镜像对于 DeepSeek-V4.1 的多机并行支持还不完整。</p><h4 id="%E7%AC%AC%E4%B8%80%E7%A7%8D%E5%B0%9D%E8%AF%95%EF%BC%9Atp8-%C3%97-pp2">第一种尝试:TP8 × PP2</h4><p>最直观的双机方案是:</p><pre><code>Node 1:TP8
644Node 2:TP8
645
646Pipeline Parallel = 2
647Tensor Parallel   = 8</code></pre><p>也就是:</p><pre><code>TP8 × PP2 = 16 GPU</code></pre><p>但是开启 DSpark 后,启动直接失败:</p><pre><code>NotImplementedError:
648Pipeline parallelism is not supported for this model.
649Supported models implement the SupportsPP interface.</code></pre><p>
649进一步检查代码后发现,这里的问题并不是 DeepSeek-V4.1 主模型本身完全不支持 PP,而是 <strong>DSpark Draft Model</strong> 没有实现 vLLM 的 <code>SupportsPP</code> 接口。</p><p>也就是说:</p><pre><code>DeepSeek-V4.1 主模型
650        ↓
651可以存在 PP 支持
652
653DSpark Draft Model
654        ↓
655没有 PP 支持</code></pre><p>因此:</p><pre><code>TP8 + PP2 + DSpark</code></pre><p>这条路走不通。</p><p>而我们并不希望为了双机而关闭 DSpark,因为 speculative decoding 本身就是这套部署希望保留的重要性能能力。</p><h4 id="%E7%AC%AC%E4%BA%8C%E7%A7%8D%E5%B0%9D%E8%AF%95%EF%BC%9Atp16-%C3%97-pp1">第二种尝试:TP16 × PP1</h4><p>既然:</p><pre><code>PP2 + DSpark</code></pre><p>存在兼容问题,那么另一个思路就是彻底不使用 Pipeline Parallel:</p><pre><code>PP = 1
656TP = 16</code></pre><p>让整个模型直接做跨节点 Tensor Parallel:</p><pre><code>Node 1 GPU0~7  ─┐
657                 ├── TP16
658Node 2 GPU0~7  ─┘</code></pre><p>这样 DSpark 就不再经过 PP。</p><p>但是旧版 <code>deepseekv41-flash-0909</code> 又在 <strong>Engram</strong> 初始化阶段失败。</p><p>实际错误为:</p><pre><code>AssertionError:
659Engram sharding leaves ranks without hash heads:
66024 heads over TP=16 x DP=1</code></pre><p>原因来自 DeepSeek-V4.1 的 Engram Memory。</p><p>模型这里一共有:</p><pre><code>24 个 Engram Hash Heads</code></pre><p>旧版 vLLM 按“完整 Hash Head”进行 Tensor Parallel 分片。</p><p>如果:</p><pre><code>TP = 8</code></pre><p>那么:</p><pre><code>24 / 8 = 3 heads / TP rank</code></pre><p>刚好可以平均分:</p><pre><code>TP0 -&gt; 3
661TP1 -&gt; 3
662...
663TP7 -&gt; 3</code></pre><p>但是如果:</p><pre><code>TP = 16</code></pre><p>旧实现采用按 head group 分片后,会出现部分 rank 无法获得有效 Engram Head 的情况。</p><p>因此代码中直接进行了保护:</p><pre><code>Engram sharding leaves ranks without hash heads</code></pre><p>换句话说,当时的实现实际上要求:</p><pre><code>Engram Head 数量
664必须能够合理覆盖所有 TP Rank</code></pre><p>但:</p><pre><code>24 Heads
66516 TP Ranks</code></pre><p>并不满足当时的分片实现。</p><p>所以旧镜像中:</p><pre><code>TP16 + PP1</code></pre><p>同样无法启动。</p><h4 id="%E7%AC%AC%E4%B8%89%E7%A7%8D%E9%97%AE%E9%A2%98%EF%BC%9App2-%E4%B8%8E%E5%A4%9A%E6%A8%A1%E6%80%81%E8%B7%AF%E5%BE%84">第三种问题:PP2 与多模态路径</h4><p>我们还测试过关闭 DSpark 后继续尝试 <code>TP8 × PP2</code>。</p><p>模型权重可以完成加载,NCCL 和跨节点通信也都正常,但在 vLLM 的 <code>profile_run</code> 阶段,多模态模型路径又出现:</p><pre><code>ValueError:
666DeepSeek V4 vision MoE routing requires input_ids.</code></pre><p>也就是说旧版在:</p><pre><code>Pipeline Parallel
667+
668DeepSeek V4.1 Vision</code></pre><p>组合下,dummy/profile forward 的输入传递还存在问题。</p><p>当时可以通过:</p><pre><code>--language-model-only</code></pre><p>绕开 Vision 路径,但这样又意味着失去多模态能力。</p><p>所以,对于我们的目标:</p><pre><code>双机 16 × H100
669+
670Vision
671+
672DSpark
673+
6741M Context</code></pre><p>旧镜像实际上没有一条完整可用的双机路线:</p>
675<!--kg-card-begin: html-->
676<table data-start="2634" data-end="2844" class="w-fit min-w-(--thread-content-width)"><thead data-start="2634" data-end="2645"><tr data-start="2634" data-end="2645"><th data-start="2634" data-end="2639" data-col-size="sm" class="last:pe-10">方案</th><th data-start="2639" data-end="2645" data-col-size="sm" class="last:pe-10">结果</th></tr></thead><tbody data-start="2656" data-end="2844"><tr data-start="2656" data-end="2670"><td data-start="2656" data-end="2665" data-col-size="sm">TP8 单机</td><td data-start="2665" data-end="2670" data-col-size="sm">✅</td></tr><tr data-start="2671" data-end="2711"><td data-start="2671" data-end="2692" data-col-size="sm">TP8 × PP2 + DSpark</td><td data-start="2692" data-end="2711" data-col-size="sm">❌ DSpark 不支持 PP</td></tr><tr data-start="2712" data-end="2756"><td data-start="2712" data-end="2733" data-col-size="sm">TP8 × PP2 + Vision</td><td data-start="2733" data-end="2756" data-col-size="sm">❌ profile_run 多模态问题</td></tr>
676<tr data-start="2757" data-end="2787"><td data-start="2757" data-end="2770" data-col-size="sm">TP16 × PP1</td><td data-start="2770" data-end="2787" data-col-size="sm">❌ Engram 分片限制</td></tr><tr data-start="2788" data-end="2844"><td data-start="2788" data-end="2822" data-col-size="sm">TP8 × PP2 + language-model-only</td><td data-start="2822" data-end="2844" data-col-size="sm">可绕过部分问题,但丢失 Vision</td></tr></tbody></table>
677<!--kg-card-end: html-->
678<p>最终经过一系列的折腾,得出以下结论:</p><p><strong><em>deepseekv41-flash-0909 在当前的 DeepSeek-V4.1 实现下,无法在保留 Vision、DSpark 等完整能力的同时构成我们需要的双机 16×H100 部署</em></strong>。</p><p>所以,最终到了今日 2026.09.14,随着最新代码合并,nightly 镜像终于初步支持了多机运行 DeepSeek-V4.1-Flash</p><p><code>vllm/vllm-openai:nightly-eed1f3d0c6043bd494424a22443ee198dd56f657</code></p>
679    </section>
680  </article>
681
682  <nav class="post-navigation" aria-label="相邻文章">
683  <a class="post-navigation__link post-navigation__link--previous" href="/deepseek-v4-flash-vision-and-qwen3-8-flash-think-mode/" rel="prev">
684    <span class="post-navigation__direction">上一篇</span>
685    <strong class="post-navigation__title">DeepSeek-V4-Flash-Vision 与 Qwen3.8-Flash-Next 思考模式控制说明</strong>
686    <span class="post-navigation__excerpt">1. 参数对照
687
688
689
690模型关闭思考开启思考思考强度DeepSeek-V4-Flash-Vision-Expthinking: falsethinking: truelow / high / maxQwen3.8-Flash-Nextenable_thinking: falseenable_thinking: truelow / medium / xhigh</span>
691  </a>
692
693</nav>
694  <section class="article-comments" aria-label="评论">
695  <div class="artalk-comments" data-artalk-comments data-artalk-server="https://lucent.blog" data-artalk-site="Lucent&#x27;s Blog"></div>
696  <p class="artalk-comments__status" data-artalk-status hidden>评论暂时无法加载。</p>
697</section>
698</main>
699
700        </div>
701        <footer class="site-footer">
702    <nav class="site-footer__navigation" aria-label="辅助导航">
703        
704    </nav>
705    <div class="site-footer__meta">
706        <a class="site-footer__rss" href="https://lucent.blog/rss/" aria-label="通过 RSS 订阅 Lucent&#x27;s Blog">
707            <svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
708    <circle cx="5" cy="19" r="1"></circle>
709    <path d="M4 11a9 9 0 0 1 9 9"></path>
710    <path d="M4 4a16 16 0 0 1 16 16"></path>
711</svg>
712            <span>订阅</span>
713        </a>
714        <span>&copy; 2026 Lucent&#x27;s Blog</span>
715    </div>
716</footer>
717    </div>
718            
718<script src="https://lucent.blog/dist/Artalk.js" defer></script>
718
719    
719<script src="/assets/built/main.js?v=uCzHSkGMfNrdy2bh" defer></script>
719
720    
721</body>
722</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.