8×H200 部署 DeepSeek-V4.1-Flash,并发 8 就极慢,首字延迟数分钟,GPU SM 100% 但 generation tput 为 0

机器是8张H200,2T内存,本地NVMe放的模型。vLLM用的nightly镜像,部署的DeepSeek-V4.1-Flash。启动参数大概是这样:

--tensor-parallel-size 8 --enable-expert-parallel
–max-model-len 1048576 --max-num-seqs 64
–enable-prefix-caching
–speculative-config ‘{“method”:“dspark”,“num_speculative_tokens”:5,…}’
–mm-encoder-tp-mode data
-e VLLM_USE_RUST_FRONTEND=1

还挂了SimpleCPUOffloadConnector

现在问题是:并发才8个请求,就卡得不行。New API那边看日志全是“首字不适用”,frt=-1000,就是vLLM压根没吐第一个token出来。等个2到15分钟,客户端直接超时断了,completion_tokens=0。

vLLM自己的日志里 Reqs Running: 8,但 Avg generation tput: 0.0 toks/s,GPU KV cache used 才1%左右。Prefix cache hit rate也是抽风,一会98%一会0%。

nvidia-smi看,SM跑满100%,但mem才6%到28%,PCIe接收倒是有2.5到7 GB/s。GPU温度功耗都正常,ECC也全是0。之前有张卡报过Xid 95,重置后没再犯。

请求的prompt都巨长,几万到几十万token,reasoning_effort基本都是high或max。我怀疑是超长上下文把prefill队列堵死了,decode根本排不上,所以generation tput才是0。也可能Engram表放CPU内存,PCIe来回搬数据太慢。

试过去掉KV offload,没用。Rust前端启动时还提示有些参数不生效。CUDA Graph捕获的时候一堆空图警告,但最后显示都100%完成了。

有没有人遇到过类似情况?是不是必须把max-model-len降下来?或者换回Python前端?还是说Engram这块目前就是坑?求指点,感谢!

3 个赞

用sglang部署吧

docker run --gpus all \

–privileged --ipc=host \

–shm-size 512g -v $(pwd):/workspace --network=host \

-e VLLM_ENGINE_READY_TIMEOUT_S=3600 \

-e VLLM_USE_RUST_FRONTEND=1 \

vllm/vllm-openai:deepseekv41-flash-0909 /workspace/dsv4.1 \

–tokenizer-mode deepseek_v41 \

–tensor-parallel-size 8 \

–tool-call-parser deepseek_v41 \

–enable-auto-tool-choice \

–reasoning-parser deepseek_v41 \

–mm-encoder-tp-mode data \

–trust-remote-code \

–kv-cache-dtype fp8_ds_mla \

–enable-prefix-caching \

–enable-prompt-tokens-details \

–enable-expert-parallel \

–speculative-config ‘{“method”:“dspark”,“num_speculative_tokens”:5,“draft_sample_method”:“probabilistic”,“rejection_sample_method”:“block”,“enable_adaptive_verification”:true}’ \

–gpu-memory-utilization 0.9518 --max-num-seqs 32 --seed=0 \

–default-chat-template-kwargs ‘{“thinking”: true, “reasoning_effort”: “high”}’ \

–compilation-config ‘{“mode”:1,“cudagraph_mode”:“FULL_DECODE_ONLY”}’

我的参数,用的还是deepseekv41-flash-0909的docker,没更新nightly。
SimpleCPUOffloadConnector这个建议关掉,我这个版本的docker开了直接崩。

1 个赞
  1. 并发场景首字慢可以配 --long-prefill-token-threshold [N] 避免单批次吃满全部预算
  2. 显存够的情况下同时加大 --max-num-batched-tokens [N] 增大单批次处理量
  3. 合理配置 kvcache 外挂,单机简单使用推荐使用 lmcache,能避免高缓存命中场景算力频繁浪费在 prefill 上
  4. 楼下提到的 PD 分离,最彻底
  5. 尝试其他引擎,比如其他楼提到的 SGLang,另外你卡架构比较新,TokenSpeed 之类的也可以试试,这个我卡太老了用不了没试过,但是效果看上去很牛逼
2 个赞

Prefill和Decode一起做会有这个bug,换成PD吧,应该2张H200做Prefil就可以

1 个赞

用sglang + hicache 吧

1 个赞

之前用过sglang部署GLM5.3flash,他有个小bug,输出时间戳是浮点数,newapi接受int,会解析错误

1 个赞

那是newapi的问题吧,而且也可以自己加一个中间件解决。

1 个赞

去掉-e VLLM_USE_RUST_FRONTEND=1 ,现在这个rust前端还不成熟

这个是尝试后加上的,同样的指令fastapi前端调用模型会报工具调用错误,输出直接截断了

我也想试试,但是没有硬件啊!

啥家庭啊,直接就把ds4.1部署上了

用PD分离架构,P和D的参数要分别调下。

之前早期遇到过你说的这个类似的情况,一般是这个vllm版本在解读模型的chat_template模板的时候有bug。python前端大部分版本都没有这个问题。试一下最新的v0.30.0-cu129 镜像吧,如果你不是CUDA 13.0+的话。只有fastapi调用有问题的话,就让gpt修复一下,问题不大

我用的启动命令是
docker run -itd --name deepseek-v41-flash-v5 --gpus all --ipc=host -p 8992:8992 -v /data/models:/data/models -e VLLM_ENGINE_READY_TIMEOUT_S=3600 vllm-deepseek-v41-cu129:diagnostic /data/models/DeepSeek-V4.1-Flash --served-model-name deepseek-v4-flash DeepSeek-V4-Flash-0731 DeepSeek-V4-Flash DeepSeek-V4.1-Flash deepseek_v41 --port 8992 --trust-remote-code --tokenizer-mode deepseek_v41 --enable-expert-parallel --tensor-parallel-size 8 --gpu-memory-utilization 0.78 --max-model-len auto --tool-call-parser deepseek_v41 --enable-auto-tool-choice --reasoning-parser deepseek_v41 --mm-encoder-tp-mode data --speculative-config '{"method":"dspark","num_speculative_tokens":5,"draft_sample_method":"probabilistic","rejection_sample_method":"block","enable_adaptive_verification":true}'
vllm-deepseek-v41-cu129:diagnostic 这个镜像是6天前的cu129-nightly镜像改的,因为官方的有点bug见 [Bugfix][KV Connector] Preserve PyTorch family during Docker dependency install - Pull Request #56967 - vllm-project/vllm - GitHub

佬们,有参考的pd分离指令么

你们是有H200集群吗?单机的话PD分离收益不高啊,而且4卡一个实例的话应该部署不起来

你只有8卡,你PD分离的话,需要4卡承载权重和KV、CUDA运行时等,你的显存是否够哦。H200显存应该是141GB,4卡则是564GB,4.1flash参数量552B,权重精度我看配置文件貌似是fp8的,意味着需要552GB加载权重,你就剩下12GB的空间做KV、CUDA运行时、prefill,貌似不够哦

四卡 A800_80GB 320GB 显存 Engram 挂 CPU 我试过勉强能跑起来,但是非常极限,1M 上下文、64 并发不用想了,玩具级别

H200 好像是 141GB 的?Engram 挂 CPU,四卡 564GB 跑好像绰绰有余


PD 分离楼上有说 6 卡 decode,2 卡 prefill 的,6 不是 2 的整数次方不知道行不行,Ascend 肯定不行,英伟达没试过 6 卡插个眼

PS: 我记得引擎的话好像没什么限制,一般 2 的整数倍应该就行,具体多少可以要看架构,tensor_parallel_size 参数需能被模型层数整除,否则会报错,正常情况 2 的整数次方肯定可以。


话说我出个模型层数为质数的大参模型是不是基本上没人跑的起来了 :thinking:

目前我们 SGLang 的部署参数,仅供参考

MODEL_ID="deepseek-v4.1-flash"
MODEL_DIR="/models/DeepSeek/DeepSeek-V4.1-Flash"
export SGLANG_ENABLE_JIT_DEEPGEMM=1
export SGLANG_JIT_DEEPGEMM_FAST_WARMUP=1
export SGLANG_ENABLE_DSV41_ENGRAM_HOST_TABLE=1

SGLANG_ARGS=(
    --model-path "${MODEL_DIR}"
    --served-model-name "${MODEL_ID}"
    --trust-remote-code
    --reasoning-parser auto
    --tool-call-parser auto
    --grammar-backend xgrammar
    --enable-cache-report
    --enable-metrics
    --uvicorn-access-log-exclude-prefixes /metrics /health /v1/loads
    --host 0.0.0.0
    --port 21080
    # Basic
    --tp 8
    --enable-dp-attention
    --dp-size 8
    --enable-dp-lm-head
    --ep-size 8
    --mem-fraction-static 0.80
    # Optimization
    --moe-runner-backend flashinfer_mxfp4
    --flashinfer-mxfp4-moe-precision fp8
    --cuda-graph-max-bs-decode 256
    --max-running-requests 256
    --chunked-prefill-size 16384
    --max-prefill-tokens 16384
    --page-size 256
    # Schedule
    --schedule-policy dfs-weight
    --radix-eviction-policy slru
)

sglang serve "${SGLANG_ARGS[@]}"

开启了 DP Attention,需要搭配 SMG 一起部署。

552B,510GB 有 200GB 左右的 Engram 可以卸载到 CPU,564GB 好像其实还挺充裕的? :thinking: