目录

执行启动命令,冲好咖啡回来后,DGX Spark终端里的模型准备工作仍在继续。首次启动约需7分钟。不过,在同一台机器上,第二次启动未必也能在差不多的时间内完成。直接复用PLE文件时,启动时间可能延长到53分钟。

Qwen3.8-Flash-Next的参数规模为125B-A6B,此外还包含51B的PLE。DGX Spark实际可用内存约为121.63GiB,但得益于将PLE存放在SSD上的设计,它仍然能够运行这个模型。本文整理了本实验室验证过的配置,以及启动时容易遇到的问题。

为什么能在DGX Spark上运行#

Flash-Next虽然冠以Qwen3.8系列之名,但被介绍为Qwen4架构的提前公开版本。官方标注为“125B-A6B”,即总参数量为125B,每个token实际使用约6B。此外,还有51B的PLE(n-gram嵌入表),以及用于推测解码的4B MTP头。本文介绍的配置不加载MTP。

PLE虽然庞大,但每个token并不需要访问整个表,而是从16张表中各读取一行。采用NVFP4时,每个token的读取量约为2.5KB。因此,可以将PLE存放在SSD文件中,只读取所需的行。模型主体约有81GB权重驻留内存,PLE后备文件则占用约47.7GiB。

这与将专家权重移到SSD上的情况不同。每次生成token都会用到专家权重,因此等待SSD读取会影响速度。PLE虽然体积庞大,但访问量很小,所以这种方式能够成立。

另一个有利因素是KV缓存。48层中有36层采用Gated DeltaNet,只有剩余12层Qwen Sparse Attention使用KV缓存。实测在128K token时,KV缓存为3.04GB。即使一次性输入大量长文档,也比较容易控制缓存带来的内存压力。

使用的模型与环境#

本实验室使用的检查点为senfu/Qwen3.8-Flash-Next-NVFP4,revision为5d37b3b3711d8406174b96ff950c0aa16324b266。共有421个文件,总大小为128.9GB。磁盘除了存放模型本体,还需要存放PLE后备文件,因此建议预留约200GB可用空间。

运行环境为DGX Spark(GB10、128GB统一内存、内存带宽273GB/s)。驱动使用nvidia-driver-580-open系列的开源内核模块。使用专有驱动时,PLE处理过程中出现了illegal memory access。运行modinfo nvidia | grep -i license,如果结果为Dual MIT/GPL,则是开源驱动;如果为NVIDIA,则是专有驱动。

SGLang从上游源码构建,使用的commit为4fb9b5b5bad41ac7de5586ec812c421fe3aa2b8b。针对Flash-Next的修复于2026年9月5日合入上游,而当时公开的Docker镜像是在前一天构建的,因此本文配置采用源码构建。环境为torch==2.13.0、flashinfer_python==0.6.18。如果构建Rust扩展时提示需要cargo,由于本次用途不需要该扩展,可以通过以下设置跳过。

snippet.txt
SGLANG_BUILD_RUST_EXTS=none

启动前需要设置的环境变量#

先设置以下3个环境变量,再启动服务器。

snippet.txt
export SGLANG_QWEN4_PLE_FILE_SKIP_DEVICE_CHECK=1
export MAX_JOBS=2
export SGLANG_WARMUP_TIMEOUT=3600

第一个变量用于跳过SGLang判断能否将PLE放到SSD上时执行的检查。在GB10上,即使使用开源驱动,检查所依赖的属性也会返回false。但GB10可以通过ATS实现所需的访问,因此跳过检查后,该配置能够正常运行。

MAX_JOBS=2用于限制JIT编译的并行数。使用默认值时,曾出现主机内存耗尽、服务器退出的情况。SGLANG_WARMUP_TIMEOUT=3600则用于解决启动预热在600秒后超时的问题。由于编译和初始化耗时较长,这里将超时时间延长到1小时。

以c=1启动的命令#

以下示例面向交互使用,将并发请求数设为1。请先将模型路径改为自己的存储位置。

snippet.txt
python3 -m sglang.launch_server \
  --model-path ~/models/qwen38-flash-next-senfu \
  --host 0.0.0.0 --port 30000 \
  --quantization modelopt_fp4 \
  --ple-offload-embedding --ple-offload-backend file \
  --mem-fraction-static 0.85 \
  --context-length 32768 --max-total-tokens 32768 \
  --chunked-prefill-size 1024 \
  --max-running-requests 1 --max-mamba-cache-size 1 \
  --disable-radix-cache \
  --watchdog-timeout 3600 \
  --prefill-attention-backend triton --decode-attention-backend trtllm_mha \
  --reasoning-parser qwen3 --tool-call-parser qwen3_coder

本实验室测得,c=1时速度为27 tok/s。在128K上下文的测试中,KV缓存为3.04GB。为便于观察内存占用并调整配置,上面的启动示例将上下文设为32K。若要使用128K,请修改--context-length和--max-total-tokens,并根据实际使用情况检查内存占用。

量化参数为--quantization modelopt_fp4。模型卡推荐的是modelopt_mixed,但本文采用的是已通过上述参数成功启动的配置。

第二次启动耗时53分钟的陷阱#

PLE后备文件会在首次启动时创建,并在重启后保留。当文件已经存在时,再次向其中写入可能导致启动耗时约53分钟。本实验室应用了一个补丁:以4KB窗口在文件的32个位置抽样检查内容,若内容正确,就跳过写入。这样,第二次及后续启动也能在约7分钟内完成。

如果不使用补丁,也可以在启动前删除旧的后备文件,以避免同样的问题。操作前,请先通过所用SGLang的配置确认待删除文件的位置,注意不要将其与模型权重混淆而误删。

最初我们也尝试过将PLE行提取操作转移到CPU端的补丁,但那是为了绕过专有驱动下的问题。切换到开源驱动后,就不再需要这个补丁了。

建议按什么顺序排查#

如果启动卡住,首先确认驱动类型。接着检查3个环境变量是否已设置,以及检查点的revision和SGLang的commit是否一致。最后,确认是否因复用PLE后备文件而导致启动变慢。

通过这套配置,我们在DGX Spark上运行了Flash-Next,并测得c=1时速度为27 tok/s。建议先用32K配置启动,再根据所需的提示词长度和可用内存逐步扩大上下文。

目录