把 125B 的 MoE 塞进一台老工作站:Strata + Tesla V100 本地部署实录

作者:

在

一、先看结论

项目 结果
模型 Qwen3.8-Flash-Next(125B MoE,每 token 激活约 10 个专家),IQ2_XS 量化
显卡 Tesla V100-PCIE-32GB(sm_70,官方支持矩阵之外的实验路径)
内存 64 GB(实测够用,模型占约 33 GiB 常驻 + n-gram 表 mmap)
上下文 131,072 token(128K),int8 KV + KV 流式(32,768 格常驻显存)
生成速度 中位数 78–80 tok/s,峰值 121.9 tok/s(长输出场景)
预填充 中位数约 1,150–1,320 tok/s,峰值 1,418 tok/s
视觉能力 ✅ 已开启,编码器跑在 GPU 上,单图编码 0.13 秒
磁盘总占用 73 GB

一句话:老架构的计算卡配上大显存,在 Strata 这套“三级存储”架构下反而很划算——显存容量比算力重要。


二、环境清单

硬件 具体识别结果(取自安装器 Step 1 输出)
GPU Tesla V100-PCIE-32GB,32.0 GB VRAM,compute capability 7.0,驱动 573.96
CPU Intel64 Family 6 Model 158 Stepping 13(8 个逻辑核),有 AVX2、无 AVX-512
内存 64 GB
PCIe 实测 host→device 12.4 GB/s
系统 Windows,CUDA 12.x 工具链(关键,后面说为什么必须是 12)

注意 CPU 没有 AVX-512:这是消费级 desktop CPU 的通病,Strata 会自动降级到 AVX2 专家内核
(日志原文:this CPU has no AVX-512: the expert kernels run on AVX-2)。


三、Strata 凭什么能让 V100 跑动 125B

它不是 llama.cpp 那种通用框架,而是为 Qwen3.8-Flash-Next 这一个模型深度定制的引擎。核心思路是把整台电脑当成三级存储:

层级 放什么 实测
显存(热层) attention/mixer、router、shared expert、输出头、MTP 草稿层、KV cache、自适应专家缓存 专家缓存 19,183 槽 / 25.77 GiB
内存(温层) 全部 24,576 个专家(pinned),显存里没有的由 CPU 就地并行计算 常驻 33.02 GiB
硬盘(冷层) n-gram 查找表(约 28.8 GB),mmap 读,每 token 约 16 行 SSD

模型本身的关键参数:48 层,每层 512 个专家,全局 24,576 个专家,每个 token 只路由到约 10 个。
所以每 GPU 显存多装一个专家,CPU 就少算一个 —— 显存容量比算力重要,这正是 V100 32GB 的强项。

再加上两项加速:MTP 投机解码(小草稿层一次猜多个 token,一次前向全部验证)和长文本大块预填充(一次 8,192 token,专家经 PCIe 流式送 GPU,与 attention 重叠)。


四、安装实录

4.1 时间线

时间 动作
10-07 09:55 拿到 strata-windows-x64-cuda12.zip(190 MB,含 CUDA 12 运行库的现成引擎)
10-07 10:2x 第一次 setup.py → Step 1 预检通过,开始下载 68 GB 模型
10-07 11:47 分片 1(39.2 GB)下载完成
10-07 15:14 分片 2(28.8 GB)完成,同时生成 pack(阶段总耗时约 5 小时,主要是下载)
10-07 15:5x–16:3x 补跑 setup 拉取并打包 MTP 草稿层,写出启动脚本
10-07 16:35 引擎首次启动成功,跑通第一批请求
10-08 20:08 下载 mmproj 视觉编码器(865 MiB)
10-08 20:19 配置改造完成
10-08 20:24 带视觉能力的服务启动成功

4.2 预检输出(setup.py --check 原文)

=== Step 1: checking your PC ===
  [!]  older NVIDIA GPUs (Pascal / Volta) can be used (it is the only kind of NVIDIA GPU in this PC):
       experimental, through a second engine built with CUDA 12 (docs/OLDER_GPUS.md)
  [ok] GPU: Tesla V100-PCIE-32GB, 32.0 GB VRAM, compute capability 7.0, driver 573.96
  [ok] CUDA 12: sm_70 is older than CUDA 13 supports (it dropped Pascal and Volta):
       this model runs the experimental CUDA 12 engine
  [ok] RAM: 64 GB
  [ok] CPU: Intel64 Family 6 Model 158 Stepping 13, GenuineIntel (AVX2)

  Q2_0     needs ~48 GB RAM: fits
  IQ2_XS   needs ~48 GB RAM: fits
  IQ3_XXS  needs ~60 GB RAM: fits
  IQ3_S    needs ~62 GB RAM: fits

64GB 内存是道坎:四个尺寸全部装得下。我选了 IQ2_XS(官方推荐档,质量与速度的平衡点),
上下文选 128K(安装器给 32GB 显卡的推荐值),KV 精度 int8(8-bit)。

4.3 MTP 草稿层是单独下载的

模型包里不含投机解码用的草稿层,setup 会额外从原始 Qwen checkpoint 里只拉那几 tensor:

> tools\mtp_fetch.py fetch --out Strata-data\mtp
> tools\mtp_pack.py --src Strata-data\mtp --experts q2_0 --out Strata-data\mtp\mtp-q2_0.gguf
wrote mtp-q2_0.gguf: 0.889 GB of tensor data
> tools\mtp_rt.py --gguf mtp-q2_0.gguf --out Strata-data\mtp\rt
experts.bin 707788800 B, dense.bin 116099072 B, 29 tensors

最终 MTP 目录 6.45 GiB,运行期占 835 MiB 显存(experts 675 / dense 111)。


五、踩过的坑(这部分最值钱)

坑 1:Volta 只能用 CUDA 12 引擎

CUDA 13 砍掉了 Pascal 和 Volta。所以必须走 engine-cuda12/ 这套单独的引擎
(Windows 上就是 strata-windows-x64-cuda12.zip,里面连 NVIDIA CUDA 12 运行库都打包好了,不用自己装 toolkit)。

代价是: wisdom sm_70 上的 MMQ 专家内核走 dp4a(Volta 没有 int8 tensor core),
只能靠 FP16 tensor core 跑 dense 投影。这条路是实验性的,维护者手上没有这张卡,属于“compile-checked + 单人实测”。
实测下来很稳,但心里要有数。

坑 2:首次加载只有 0.18 GiB/s

第一次启动时日志给了这样一句:

strata generate: loaded 33.02 GiB at 0.18 GiB/s
strata generate: hint: ~24x below what this hardware streams from a normal launch.
                 If Strata is started by Task Scheduler or a service, register the task with
                 Priority 4 (Normal) and 'Run with highest privileges'

0.18 GiB/s 意味着 33 GB 要读 3 分钟,而后面几次启动是 2.30 / 2.31 GiB/s(约 14 秒)。
差异来自磁盘冷读 + 进程优先级。如果你打算让它开机自启,记得把计划任务的优先级调到 Normal 并勾选“以最高权限运行”。

坑 3:70 GB 下载的续传问题

setup 的下载器本身是支持断点续传的(Range: bytes= + .part + .done 标记),
但国内直连 Hugging Face 很不稳定。解决办法:

set HF_ENDPOINT=https://hf-mirror.com

setup 会读这个环境变量(和 huggingface_hub 的用法一致)。实测 huggingface.co 直连 12 秒无响应,hf-mirror 正常。

坑 4:安装器被中断会留下“半套配置”

这个坑在本机实打实地撞上了 —— 我在跑 setup.py --setup --vision gpu 时中断了它,结果:

"args": [ ..., "--vision", "--vram-reserve-mib", "700" ],   ← 写了
// 但顶层的 "vision": { ... } 段完全没写                      ← 没写

引擎开了图、却找不到编码器进程,服务直接起不来。这种半成品状态很难排查,
所以改完配置一定要对着 serve/server.py 里 Vision.__init__ 实际消费的 key 复核一遍(详见第七节)。


六、实测数据

6.1 启动过程(一条真实日志)

strata generate: PCIe probe: 12.4 GB/s host->device -> pcie_frac 0.34 (default 0.55)
strata generate: native pack: ... token embedding IQ4_XS in mapped host memory (322 MiB, 0.4 s)
strata generate: 300 native projection matrices, 1474.85 MiB of weights, in 1.7 s
strata generate: KV streaming: 32768 of 131072 cells per QSA layer in VRAM,
                 the K/V in 1.55 GiB of pinned RAM
strata mtp: draft layer loaded, 835 MiB of VRAM, files read in 0.27 s (2879 MiB/s)
strata generate: loaded 33.02 GiB at 2.31 GiB/s
strata generate: expert cache auto: 26.60 GiB free, 700 MiB reserved (+143 MiB for draft head)
                 -> 18322 slots
strata generate: expert cache 19183 slots, 25.77 GiB of VRAM; policy PROFILE, no eviction
strata generate: pre-filled 19183 of 19183 slots in 2.4 s (11382 MB/s); slot 0 verified
strata serve: 462 MiB of VRAM free with everything loaded
  • 专家 profiling 后按路由频率排序预填,19,183 个专家装进显存(占全部 24,576 个的 78%)
  • 32GB 显存被吃到只剩 462 MiB 空闲(已经把能塞的都塞了)
  • 7 个 CPU 核跑专家池,主线程占 0 号核

几个值得注意的点:

6.2 四次会话的速度统计(按启动分段)

会话 请求数 生成 tok/s(min / 中位 / max) 预填充 tok/s(中位 / max) 草稿接受率 专家缓存命中
10-07 16:35 162 48.5 / 79.7 / 121.9 1,158.6 / 1,418.1 77.0% 99.0%
10-07 19:57(短问答) 4 61.0 / 76.2 / 80.4 110.2 / 150.0 68.6% 98.6%
10-08 19:23(短问答) 1 — / 58.0 / — 123.9 64.3% 97.0%
10-08 20:24(开图) 18 58.3 / 78.1 / 103.3 1,321.7 / 1,396.7 82.4% 98.0%

怎么读这张表:

  • 主力场景是长上下文:中位 prompt 长度约 34,000 token,中位输出 1,383 token,最长一次生成了 32,768 token。
  • 短请求跑不到中位速度:几十 token 的短 prompt 只有 58–80 tok/s,因为 2,048 token 的分块才是预填充路径的效率点,
    短 prompt 的 GPU 占用不满;同理短输出没有 draft 积累,第一轮会慢些(官方也标注了这一点)。
  • 投机解码的接受率很关键:长会话里 77%–82%,意味着接近四个草稿 token 里中三个 —— 这是速度的主要来源。
  • 专家缓存命中 98–99%:32GB 显存的价值在这里兑现了,只有不到 2% 的专家要走 PCIe 或 CPU。

6.3 长上下文表现

KV 流式开启后,131,072 的上下文里只有 32,768 格常驻显存,其余放在 1.55 GiB 的 pinned RAM 里:

strata serve: prompt 29499 tokens = 19615 reused + 9884 read in 8161 ms (1211.1 tok/s),
              6540 generated in 66571 ms (98.2 tok/s), drafts accepted 4923 of 5269
strata serve: KV streaming: 99.63% of 287297364 block reads hit VRAM, 4224.3 MiB read from RAM

前缀复用(19,615 token 直接命中缓存)+ KV 命中 99.63% —— 多轮长文档的体感是“后面几轮几乎瞬间开始”。


七、给它加上视觉多模态

7.1 原理:视觉是“外挂”的,不用重下模型

Strata 的视觉走 llama.cpp 的 mtmd 库独立进程 strata-vision.exe(143 MB,随引擎包自带),
配一个 865 MiB 的 mmproj 编码器权重。数据流是:

图片 → strata-vision(mmproj,独立进程)→ 嵌入向量文件 → 引擎 GENI 请求(需 --vision)

所以不需要重新打包模型、不需要重下 70GB,只要三件事。

7.2 先决问题:V100 到底能不能跑 GPU 编码器

官方文档说“现成编码器里有代码的卡是 RTX 20/30/40/50”,Volta 没提。翻引擎包的构建清单:

// engine-cuda12/BUILD.json
"archs": [60, 61, 70, 75, 80, 86, 89],
"vision_archs": [60, 61, 70, 75, 80, 86, 89],
"ptx": true, "cuda": "12.9", "experimental": true

vision_archs 明确包含 sm_70,还带 PTX 兜底。理论可用,于是单独把编码器拉起来试(不启动引擎,只占约 1 GB 显存):

startup : READY 2560                ← 3.5 秒完成加载
encode  : OK 300 20 15 133          ← 640×480 图 → 300 个图像 token(20×15 网格)
耗时    : 0.13 s

实测通过,不用退到 CPU 模式(CPU 模式约 3 秒一张图,而且要改 --threads)。

7.3 配置改造三步

引擎和用户都没动了其模型文件,改的全是 strata-iq2_xs.json:

第一步,args 末尾加两个参数(缺少 --vision 时引擎收到图片嵌入会直接报
ERR this engine was started without --vision):

   "--kv-resident",
-  "32768"
+  "32768",
+  "--vision",
+  "--vram-reserve-mib",
+  "700"
 ]

第二步,顶层新增 vision 段:

"vision": {
  "exe":    "F:\\AI\\Strata\\Strata\\engine-cuda12\\strata-vision.exe",
  "mmproj": "F:\\AI\\Strata\\Strata-data\\models\\IQ2_XS\\mmproj-Qwen3.8-Flash-Next-BF16.gguf",
  "model":  "F:\\AI\\Strata\\Strata-data\\models\\IQ2_XS\\Qwen3.8-Flash-Next-GSQ-RCO-IQ2_XS-00001-of-00002.gguf",
  "gpu": true,
  "max_tokens": 1024
}

第三步,下载 mmproj(865 MiB,HF 直连不通走镜像):

curl -L --noproxy "*" -o mmproj-Qwen3.8-Flash-Next-BF16.gguf ^
  https://hf-mirror.com/ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF/resolve/main/mmproj-Qwen3.8-Flash-Next-BF16.gguf

校验很重要:本机的 mmproj 本地大小 907,543,008 字节,与远端 Content-Length 完全一致,GGUF v3、334 个 tensor。

7.4 开着图的代价(实测对比)

指标 关图 开图 差值
专家缓存槽位 19,183 18,107 −1,076
专家缓存显存 25.77 GiB 24.32 GiB −1.45 GiB
满载后剩余显存 462 MiB 465 MiB —
生成 tok/s(中位) 79.7 78.1 −1.6(约 −2%)
专家缓存命中 99.0% 98.0% −1.0%

官方在 12GB 卡上测的是 −4%,本机只有约 −2% —— 因为 V100 有 32GB,损失的 1.45 GiB 只占缓存的 5.6%。
大显存卡开图几乎白嫖。

7.5 服务启动时的顺序验证

日志里能看到编码器的 stderr 直接汇进了同一个日志文件,位置在引擎启动行之前:

781  load_hparams: Qwen-VL models require at minimum 1024 image tokens
782  load_hparams: if you encounter problems with accuracy, try adding --image-min-tokens 1024
785  strata-vision: model files loaded in 2.5 s
786  strata-vision: warmed up at 1024 image tokens in 0.7 s
787  [strata] 2026-10-08 20:24:06 engine started: ... --vision --vram-reserve-mib 700

即:先加载编码器并预热到 1024 token(合计 3.2 秒),再启动引擎 —— 这样引擎规划专家缓存时才知道要给编码器留出那 700 MiB。

顺带一提,mtmd 提示 Qwen-VL 在指向/计数类任务上建议最少 1024 个图像 token。
本机走 GPU 模式默认上限就是 1024,不需要额外配 min_tokens;
如果你打算拿它看图表、读小字,可以考虑在 vision 段里手工加 "min_tokens": 1024。


八、结论与后续

  1. V100 + 64GB 这套“过时”组合,跑 125B MoE 完全够用,长上下文场景稳定 78 tok/s 上下。
    关键是它命中了 Strata 的设计甜点:显存大 → 专家缓存多 → CPU 少干活。
  2. 老卡要走 CUDA 12 引擎,这是硬约束(CUDA 13 不支持 Volta),Windows 上直接下现成 zip 最省事。
  3. 视觉能力值得开:成本只有约 2% 的速度,换来 0.13 秒一张图的图片理解。
  4. 还想继续压榨的话:跑一次 START-HERE.bat --calibrate(约 5–10 分钟实测本机最优参数,目前仅 NVIDIA),
    以及 --parallel N 开并发(本机 32GB 显存有余量)。

附录:命令速查

REM 预检(不安装,只看能不能跑、能跑哪些尺寸)
setup.py --check

REM 完整安装/重配(一路回车用推荐值)
START-HERE.bat --setup

REM 无交互安装指定配置 + 开 GPU 视觉
set HF_ENDPOINT=https://hf-mirror.com
START-HERE.bat --setup --model IQ2_XS --context 131072 --kv int8 ^
               --vision gpu --vision-tokens 1024 --yes --no-start

REM 日常启动
run-iq2_xs.bat

REM 实测本机最优引擎参数(约 5-10 分钟)
START-HERE.bat --calibrate

附录:本机关键路径

用途 路径
引擎(CUDA 12) Strata\engine-cuda12\strata.exe
视觉编码器 Strata\engine-cuda12\strata-vision.exe
运行配置 Strata\strata-iq2_xs.json
运行日志 Strata\strata-iq2_xs.log
模型分片(64.2 GiB) Strata-data\models\IQ2_XS\
视觉编码器权重(865 MiB) Strata-data\models\IQ2_XS\mmproj-Qwen3.8-Flash-Next-BF16.gguf
打包后的模型(1.44 GiB) Strata-data\packs\iq2_xs\
MTP 草稿层(6.45 GiB) Strata-data\mtp\rt

本文数据全部取自本机 Strata 引擎日志(engine 0.1.40,2026-10-07 至 10-08 共四次会话、185 次请求)。
参考:Strata 仓库 https://github.com/Niko1221/Strata · 量化权重 ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注