1. 为什么要在 GPUStack 上跑 DeepSeek-V4-Flash-0731
DeepSeek-V4-Flash-0731 是 DeepSeek-V4-Flash 的正式版本,架构沿用 Flash 系列,升级点集中在后训练与 Agent 能力。它支持低、高、最高三档推理强度,checkpoint 里内置了 DSpark 投机解码模块,一次可以预测多个候选 token,减少主模型逐 token 解码的等待时间。对做推理服务的人来说,这意味着同样的卡能挤出更高的吞吐。
但模型能不能跑起来、跑得好不好,跟推理框架和硬件平台关系很大。GPUStack 是一个开源的 GPU 集群管理平台,能把多台机器上的 NVIDIA、昇腾等异构算力统一纳管,用一套控制台完成模型部署、实例分配、资源监控。你可以把它理解成一个「模型服务调度台」:模型镜像、启动参数、GPU 分配都在界面上配,底层帮你拉起 vLLM 或 vLLM Ascend 容器。
这篇内容聚焦两套真实环境:单节点 8 卡 NVIDIA H20-3e,和单节点 8 卡昇腾 910B(单卡 64 GB)。我会给出可复制的 GPUStack 部署配置、vLLM 启动参数、单并发吞吐验证命令,以及昇腾 910B 的对照数据采集步骤。适合正在做推理平台选型、需要评估 H20 与 910B 承载能力的工程师。
先说结论方向:H20 单并发实测能到 600+ TPS,KV Cache 容量约 108 GiB;910B 单并发最高接近 100 TPS,KV Cache 约 13.89 GiB。差距主要来自显存容量和平台适配成熟度,不是模型本身的问题。
2. 前置准备:镜像、GPUStack 与访问入口
2.1 镜像选择
H20 环境直接用支持 DeepSeek-V4-Flash-0731 与 DSpark 的 vLLM 官方镜像:
docker pull vllm/vllm-openai:v0.25.0昇腾 910B 环境用 vLLM Ascend 的 nightly 镜像,才能拿到 DeepSeek-V4-Flash-0731 所需的最新适配:
docker pull quay.io/ascend/vllm-ascend:nightly-main两个镜像都比较大,建议提前在节点上拉好,避免 GPUStack 拉起实例时卡在镜像下载阶段。
2.2 GPUStack 纳管节点
GPUStack 支持把不同厂商的算力节点加入同一个集群。H20 节点和 910B 节点分别安装对应版本的 worker,然后在控制台确认设备状态、温度、利用率和显存占用都能正常显示。这一步很关键,因为后面压测时要靠这些指标判断是不是显存打满或者温度降频。
如果你在本地或云端已经有可用的推理服务,也可以先用 API 方式验证模型行为,再决定要不要上集群。TaoToken 的模型对话入口可以快速试 DeepSeek 系列模型的输出风格,接入文档里有兼容 OpenAI 的调用方式,适合在正式部署前做一轮 prompt 和参数验证。
2.3 获取 API Key 与文档
部署完成后,GPUStack 会暴露一个 OpenAI 兼容的 endpoint。你可以用任意 OpenAI SDK 调用。如果同时想对比官方 API 的行为,可以在 TaoToken 控制台创建 API Key,接入文档里给了 base_url 和示例代码。API 地址是https://taotoken.net/api,注意这个地址不带任何查询参数。
对于长期跑编码任务或 Agent 的场景,可以考虑 Coding Plan,它更适合高频、长会话的调用模式,比按次计费更可控。
3. H20 部署配置:8 卡张量并行 + DSpark
3.1 GPUStack 模型服务配置
在 GPUStack 中创建模型服务,选择自定义 vLLM 镜像vllm/vllm-openai:v0.25.0,为实例分配 8 张 H20。推理后端参数如下:
--max-model-len 300000 \ --trust-remote-code \ --kv-cache-dtype=fp8 \ --block-size=256 \ --tensor-parallel-size=8 \ --no-enable-flashinfer-autotune \ --tokenizer-mode=deepseek_v4 \ --tool-call-parser=deepseek_v4 \ --enable-auto-tool-choice \ --reasoning-parser=deepseek_v4 \ --speculative-config '{"method":"dspark","num_speculative_tokens":7,"draft_sample_method":"greedy"}' \ --gpu-memory-utilization 0.9 \ --max-num-seqs 48 \ --enable-prefix-caching环境变量:
VLLM_ENGINE_READY_TIMEOUT_S=3600逐项说明几个容易踩坑的参数。--tensor-parallel-size=8把模型切到 8 张卡上,H20 单卡显存足够,8 路并行能摊开权重和 KV Cache。--kv-cache-dtype=fp8用 FP8 存 KV Cache,直接换来更大的上下文和并发容量,这是 H20 能跑到 108 GiB KV Cache 的关键。--speculative-config启用 DSpark,每轮最多推测 7 个 token,draft_sample_method设为 greedy 保证推测稳定性。
--tokenizer-mode、--tool-call-parser、--reasoning-parser三个都设成deepseek_v4,分别适配分词、工具调用和推理内容解析。少了任何一个,Agent 场景下的 function call 或思维链输出都可能解析失败。
--max-model-len虽然模型支持更长,但生产配置建议压到 300000。原因在下一节会看到:KV Cache 总量有限,开放 1M 上下文会让少量超长请求吃光缓存,其他请求排队延迟飙升。
VLLM_ENGINE_READY_TIMEOUT_S=3600把引擎就绪等待延长到 3600 秒。大模型首次加载和编译很慢,默认超时容易让 GPUStack 误判启动失败。
3.2 启动日志里的关键数字
实例起来后,从启动日志能看到可用 KV Cache 显存约 108.37 GiB,对应 6,837,341 个 token 的 KV Cache 容量。按单请求 500K token 估算,理论最大并发约 13.67。
这个数字说明 H20 的长上下文承载能力很强,但生产上仍建议单请求上限设 300K。因为 500K 只是理论值,实际请求长度分布不均,留出余量才能保证稳定。
4. 验证请求与吞吐测试
4.1 单并发 TPS 验证
用 OpenAI 兼容接口发一个流式请求,统计输出 token 数和耗时。下面是一个可复制的 Python 脚本:
import time from openai import OpenAI client = OpenAI( base_url="http://<gpustack-endpoint>/v1", api_key="<your-gpustack-key>" ) prompt = "用 500 字解释 MoE 模型的专家并行原理。" start = time.time() stream = client.chat.completions.create( model="DeepSeek-V4-Flash-0731", messages=[{"role": "user", "content": prompt}], stream=True, max_tokens=3000 ) token_count = 0 for chunk in stream: if chunk.choices[0].delta.content: token_count += 1 elapsed = time.time() - start print(f"输出 token: {token_count}, 耗时: {elapsed:.2f}s, TPS: {token_count/elapsed:.2f}")在 H20 单并发测试中,输出速度可以达到 600+ TPS。实测下来,这个数字约为 DSV4F 普通 + MTP 的 2 倍、普通 DSV4F 的 4 倍,DSpark 对解码阶段的加速效果比较明显。
4.2 10 × 64K Input / 3K Output 压测
用 10 路并发、每路 64K 输入 / 3K 输出做压力测试,整体运行稳定。结合 KV Cache 容量和实际响应估算,单台 8 卡 H20 节点可以承载约 25 路 64K 上下文并发。
生产建议:单请求最大上下文设 300K,结合业务流量限制超长请求;常规 64K 场景按约 25 路并发做容量规划。
5. 昇腾 910B 部署配置与对照数据采集
5.1 GPUStack 模型服务配置
在 GPUStack 中选择自定义 vLLM Ascend 镜像quay.io/ascend/vllm-ascend:nightly-main,为实例分配 8 张 910B,填写以下启动参数:
--max-model-len=500000 \ --max-num-batched-tokens=8192 \ --gpu-memory-utilization=0.9 \ --max-num-seqs=32 \ --data-parallel-size=1 \ --tensor-parallel-size=8 \ --enable-expert-parallel \ --tokenizer-mode=deepseek_v4 \ --tool-call-parser=deepseek_v4 \ --enable-auto-tool-choice \ --reasoning-parser=deepseek_v4 \ --no-disable-hybrid-kv-cache-manager \ --model-loader-extra-config='{"enable_multithread_load": true, "num_threads": 128}' \ --quantization=ascend \ --block-size=128 \ --speculative-config '{"method": "dspark", "num_speculative_tokens": 7, "enforce_eager": true}' \ --compilation-config='{"cudagraph_mode": "FULL_DECODE_ONLY"}'环境变量:
export HCCL_BUFFSIZE=1024 export TASK_QUEUE_ENABLE=1 export HCCL_OP_EXPANSION_MODE=AIV export OMP_NUM_THREADS=10 export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True export VLLM_ENGINE_READY_TIMEOUT=3600这组配置同样是 8 路张量并行,--enable-expert-parallel开启专家并行,更好适配 MoE 模型。--quantization=ascend启用昇腾侧量化支持。enable_multithread_load用 128 个线程并行加载模型文件,减少大模型权重加载时间,这在 910B 上体感很明显。
DSpark 在当前昇腾后端以 eager 模式运行,所以--speculative-config里加了enforce_eager: true。FULL_DECODE_ONLY把 CANN Graph 优化集中在解码阶段。
环境变量主要做四件事:增大 HCCL 通信缓冲区(HCCL_BUFFSIZE=1024)、开启任务队列(TASK_QUEUE_ENABLE=1)、调整算子展开方式(HCCL_OP_EXPANSION_MODE=AIV)、优化 NPU 显存分配(PYTORCH_NPU_ALLOC_CONF=expandable_segments:True)。
5.2 启动日志与 KV Cache 对照
启动日志显示,910B 实例可用 KV Cache 显存约 13.89 GiB,对应 539,406 个 token 的 KV Cache 容量。按单请求 500K token 计算,理论最大并发约 1.08,也就是单节点基本只能稳定承载 1 路 500K 超长上下文请求。
对比 H20 的 108.37 GiB,差距主要来自单卡显存容量。910B 单卡 64 GB,8 卡合计 512 GB,但模型权重、激活、通信缓冲占掉大部分后,留给 KV Cache 的空间就有限了。
5.3 单并发与并发测试
单并发测试中,910B 输出速度最高接近 100 TPS。对昇腾环境来说,这意味着 DeepSeek-V4-Flash-0731 已经能在昇腾硬件上获得有实际使用价值的生成速度,完成了从可部署到可用的跨越。
10 路并发、每路 64K Input / 3K Output 的测试表明,910B 对超长上下文和高并发的承载能力不如 H20。综合吞吐与稳定性,建议单实例最大上下文设 128K,10 路 32K 并发下运行更稳定,整体推理性能约为 H20 单台的 1/3。
生产建议:单实例优先 128K 最大上下文,常规业务按 10 路 32K 并发规划;需要更高吞吐时,通过 GPUStack 部署多个模型副本组成服务集群,用统一入口做负载均衡。
6. 常见报错与排查
6.1 引擎启动超时
现象:GPUStack 显示实例启动失败,日志停在模型加载阶段。
原因:大模型首次加载和编译时间长,默认就绪超时太短。
处理:H20 设VLLM_ENGINE_READY_TIMEOUT_S=3600,910B 设VLLM_ENGINE_READY_TIMEOUT=3600。注意两个平台的环境变量名不一样,别写混。
6.2 工具调用解析失败
现象:Agent 场景下 function call 返回空或格式错误。
原因:--tool-call-parser或--tokenizer-mode没设成deepseek_v4。
处理:确认三个 parser 参数都配齐:--tokenizer-mode=deepseek_v4、--tool-call-parser=deepseek_v4、--reasoning-parser=deepseek_v4,并加上--enable-auto-tool-choice。
6.3 显存不足 OOM
现象:910B 上启动时报 NPU 显存不足。
原因:--max-model-len设得太大,KV Cache 预留不够。
处理:把--max-model-len从 500000 降到 128000,同时确认--gpu-memory-utilization=0.9没有被调低。如果还不行,减少--max-num-seqs。
6.4 DSpark 在昇腾上不生效
现象:910B 日志提示 speculative 相关警告。
原因:昇腾后端对 DSpark 的支持还在演进,当前以 eager 模式运行。
处理:在--speculative-config里加"enforce_eager": true,不要期待和 H20 一样的加速比。这是平台适配阶段差异,不是配置错误。
6.5 请求排队延迟高
现象:并发上来后响应变慢,但 GPU 利用率不高。
原因:KV Cache 被超长请求占满,其他请求排队。
处理:限制单请求最大上下文,H20 设 300K,910B 设 128K。在网关层对超长请求做拦截或降级。
7. 接入方式与后续验证
部署完成后,GPUStack 暴露的 OpenAI 兼容 endpoint 可以直接接入现有应用。如果你需要先验证模型输出质量再决定部署规模,可以用 TaoToken 的模型对话入口快速试 DeepSeek 系列,接入文档里有完整的 base_url 和 SDK 示例。API 地址是https://taotoken.net/api,创建 Key 在控制台的 API Keys 页面。
对于长期跑编码或 Agent 任务的团队,Coding Plan 比按量计费更适合高频调用场景。如果你用 Claude Code 或 Anthropic 风格的接口,文档里也有对应的接入说明。
实测下来,H20 和 910B 的选型逻辑比较清晰:H20 适合高吞吐、长上下文业务,单节点就能扛 25 路 64K 并发;910B 适合对国产化有要求、且能接受通过多节点横向扩展的场景,单实例控制在 128K 上下文、10 路 32K 并发比较稳。两套环境都能通过 GPUStack 统一纳管,切换成本主要在镜像和启动参数上,模型服务本身的调用方式是一致的。