本文记录 Qwen3.8-Flash-Next NVFP4 在单张 RTX PRO 6000 Blackwell 上的 SGLang 部署参数,以及短上下文、32K、128K、262K 的 Prefill 和 Decode 实测结果。

构建 Docker 镜像

首先构建运行镜像。基础镜像使用 lmsysorg/sglang:dev-cu13,保留其中已经适配 CUDA 13 和 Blackwell 的 sgl-kernel、FlashInfer 等依赖,再覆盖安装指定 commit 的 SGLang Python 包。

FROM lmsysorg/sglang:dev-cu13

ARG SGLANG_REPO=https://github.com/LingZ315/sglang.git
ARG SGLANG_COMMIT=3df8e1e7dbc5807696622afe2929b6c33c185ca3

RUN git clone "${SGLANG_REPO}" /tmp/sglang \
    && cd /tmp/sglang \
    && git checkout "${SGLANG_COMMIT}" \
    && pip install --no-deps --no-build-isolation ./python \
    && rm -rf /tmp/sglang

执行构建:

docker build --progress=plain \
  -t your-registry/sglang:qwen38flashnext-fp8kv .

这里使用 --no-deps --no-build-isolation,是为了避免 pip 根据开发分支的依赖声明替换基础镜像中已经适配 GPU 的 CUDA组件。该镜像包含 Qwen3.8-Flash-Next、SM120 FlashInfer 路由和 FP8 QSA KV Cache 相关支持。

正式部署时,建议同时固定基础镜像 digest 和 SGLang commit,确保后续可以复现,避免滚动 tag 变化。

测试环境

项目 配置
GPU NVIDIA RTX PRO 6000 Blackwell,约 96 GB 显存
系统内存 183 GiB
NVIDIA Driver 580.178.04
CUDA 13.0.3
PyTorch 2.13.0+cu130
Triton 3.7.1
FlashInfer 0.6.17
模型量化 ModelOpt NVFP4
KV Cache FP8 E4M3

启动参数

下面使用占位路径和示例镜像名。实际部署时替换模型、HiCache 和镜像地址即可。

docker run -d \
  --name qfn \
  --init \
  --restart on-failure:3 \
  --gpus all \
  --ipc host \
  --shm-size 32g \
  -p 8000:8000 \
  -e SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1 \
  -e TOKENIZERS_PARALLELISM=false \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
  -e SGLANG_HICACHE_FILE_BACKEND_STORAGE_DIR=/hicache \
  -v /path/to/Qwen3.8-Flash-Next-NVFP4:/models/qfn:ro \
  -v /path/to/hicache:/hicache:rw \
  your-registry/sglang:qwen38flashnext-fp8kv \
  sglang serve \
    --model-path /models/qfn \
    --served-model-name qwen3.8-flash-next \
    --tp-size 1 \
    --quantization modelopt_fp4 \
    --attention-backend flashinfer \
    --ple-offload-embedding \
    --kv-cache-dtype fp8_e4m3 \
    --context-length 262144 \
    --mem-fraction-static 0.960 \
    --chunked-prefill-size 8192 \
    --max-running-requests 6 \
    --max-mamba-cache-size 24 \
    --mamba-ssm-dtype bfloat16 \
    --mamba-radix-cache-strategy extra_buffer_lazy \
    --linear-attn-prefill-backend triton \
    --linear-attn-decode-backend flashinfer \
    --hicache-size 46 \
    --hicache-io-backend kernel \
    --hicache-write-policy write_through_selective \
    --hicache-mem-layout page_first \
    --hicache-storage-prefetch-policy timeout \
    --enable-hierarchical-cache \
    --hicache-storage-backend file \
    --hicache-storage-backend-extra-config \
      '{"max_size":"384G","min_free_space":"50G"}' \
    --page-size 64 \
    --enable-metrics \
    --uvicorn-access-log-exclude-prefixes /metrics \
    --enable-cache-report \
    --enable-multimodal \
    --reasoning-parser auto \
    --host 0.0.0.0 \
    --port 8000

这里没有启用 NEXTN/MTP。实测启用 NEXTN 后,主 KV Pool 会从数十万 tokens 降到约 155K,无法处理 250K 输入。

当前 Mamba 配置为:

--max-mamba-cache-size 24
--mamba-ssm-dtype bfloat16
--mamba-radix-cache-strategy extra_buffer_lazy

该配置实测可以同时运行 6 个请求,没有被 SGLang 自动降低并发。

启动结果

模型启动后的主要资源分配:

项目 结果
模型权重 约 82.45 GB
主 KV Pool 532,736 tokens
KV Cache 显存 K 3.05 GB + V 3.05 GB
Mamba Cache 24 slots,约 1.37 GB
最大运行请求 6
GPU 显存余量 约 5.66 GB

250K 请求实测可以正常完成。完整长上下文测试的实际输入约为 261.7K tokens,也能够正确生成 128 tokens。

性能测试

每种上下文分别测试并发 1/2/4/6。每个请求固定生成 128 tokens,并关闭 thinking。

指标口径:

  • Prefill:输入处理吞吐,单位为输入 tokens/s;
  • Decode:SGLang scheduler 日志中的稳态生成吞吐;
  • TTFT:从发出请求到收到第一个输出 token;
  • 端到端输出:包含 Prefill、排队和 Decode 的整体输出吞吐。

Prefill

上下文 输入 tokens/请求 并发 Prefill tokens/s TTFT P95
32K 32,679 1 11,592 2.82s
32K 32,679 2 21,535 2.92s
32K 32,679 4 20,227 6.15s
32K 32,679 6 22,542 7.59s
128K 130,984 1 10,624 12.33s
128K 130,984 2 21,522 12.17s
128K 130,984 4 21,806 22.56s
128K 130,984 6 28,457 24.71s
262K 261,672 1 10,217 25.61s
262K 261,672 2 19,142 26.16s
262K 261,672 4 13,482 73.71s
262K 261,672 6 12,318 121.25s

128K 并发 6 的聚合 Prefill 数字较高,但尾延迟已经明显增加。在线服务不应只根据聚合吞吐选择并发,还要同时考虑 TTFT。

Decode

活跃 Decode 并发 稳态聚合 Decode tokens/s 平均每请求 tokens/s
1 93-99 93-99
2 174-189 87-94
4 335-373 84-93
6 543-547 90-91

不同上下文下,单请求 Decode 速度为:

上下文 Decode tokens/s
短上下文 98-99
32K 95-96
128K 96-97
262K 93-94

从短上下文增加到 262K 后,单请求 Decode 只下降约 6%。并发 6 的稳态聚合 Decode 吞吐约为 545 tokens/s。

端到端输出

端到端吞吐包含输入 Prefill 和排队时间,因此长上下文数值会明显低于纯 Decode。

上下文 C1 C2 C4 C6
短上下文 75.72 129.10 252.25 371.73
32K 30.13 57.10 63.98 76.44
128K 9.35 18.72 19.98 26.14
262K 4.74 8.91 6.48 5.96

单位均为输出 tokens/s。

HiCache 工作情况

当前缓存分为三层:

GPU KV/Mamba Cache
  -> 46 GB 宿主内存 HiCache
  -> 最大 384 GB NVMe 文件缓存

启动时实际分配的宿主缓存约为:

KV host pool: 约 23.8 GB
Mamba host cache: 约 22.2 GB

完成短上下文、32K、128K 和 262K 并发矩阵后:

  • 50 个请求全部成功;
  • 没有 OOM、retract、watchdog 或容器重启;
  • GPU KV Pool 一度只剩约 640 tokens,说明长前缀确实进入缓存;
  • 新请求到来时由 Radix Cache/LRU 淘汰旧前缀,不是显存泄漏;
  • NVMe HiCache 目录增长到数 GB,文件层缓存确实在工作。

对 Agent 场景,多个请求如果携带相同的系统提示词、工具定义和历史前缀,公共前缀只需要缓存一份。这样可以显著减少重复 Prefill 和 GPU KV占用。为了提高命中率,应保持公共前缀的 token 序列完全一致,并把时间戳、请求 ID 等动态字段放到提示词后部。

结论

当前配置在单张 RTX PRO 6000 上实现了:

主 KV Pool: 532,736 tokens
最大并发: 6
最大实测输入: 约 261.7K tokens
单请求 Decode: 约 93-99 tokens/s
并发 6 稳态 Decode: 约 543-547 tokens/s

推荐并发:

场景 建议并发
短上下文 6
32K 4-6
128K 2
262K 1-2

extra_buffer_lazy + 24 Mamba slots 在 KV容量和并发之间取得了较好的平衡。对于 Agent工作负载,固定公共前缀、保持会话粘性路由,并利用 GPU、宿主内存和 NVMe三级 HiCache,可以获得比完全独立长请求更好的实际吞吐和 TTFT。

posted on 2026-08-30 18:19  李宏  阅读(9)  评论(0)    收藏  举报