ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Day 0 部署:昇腾 910B 跑 DeepSeek-V4,GPUStack 配置与压测实录

Day 0 部署:昇腾 910B 跑 DeepSeek-V4,GPUStack 配置与压测实录 1. 昇腾 910B 单机跑 DeepSeek-V4 的真实场景与前置判断昇腾 910B 上跑 DeepSeek-V4这件事在纸面上看是「国产算力 国产开源大模型」的顺理成章但真正落到单机部署时卡点往往不在模型本身而在驱动、CANN、推理引擎和调度平台这四层能不能对齐。DeepSeek-V4 系列基于 MoE 架构推理阶段只激活部分参数但权重体积和显存占用依然不小尤其是长上下文场景下 KV Cache 的膨胀速度很快。昇腾 910B 单机通常以 8 卡形态出现单卡 64GB HBM整机 512GB 显存这个容量跑 DeepSeek-V4 的量化版本是够的但前提是推理引擎能正确识别 NPU 设备、显存池化策略合理、并发请求不会把显存打爆。GPUStack 在这里扮演的角色是「集群控制面 推理引擎编排器」。它本身不直接做推理计算而是负责把 vLLM、SGLang 这类推理引擎以容器方式拉起管理模型权重挂载、端口暴露、API Key 分发和节点健康检查。对于昇腾 910B 单机场景GPUStack 的价值在于你不需要手动写一堆 docker run 命令去挂载 NPU 设备、配置 CANN 环境变量、调 vLLM 的 tensor parallel 参数而是通过一份 YAML 或控制台表单把这些参数固化下来后续换模型、调并发、看指标都在同一个界面里完成。适合谁看这篇手上有昇腾 910B 单机或小集群、想快速验证 DeepSeek-V4 推理可用性的工程团队已经在用 vLLM 或 SGLang 但被 NPU 适配问题折腾过的同学以及需要给内部业务方提供一个「能跑起来、能压出数」的推理端点而不是只停留在 benchmark 截图上的场景。我试过在 910B2 八卡机上从零走一遍踩过的坑主要集中在三个地方CANN 版本和驱动版本不匹配导致 npu-smi 能看到卡但容器里 torch.npu 不可用Ascend Docker Runtime 没配好导致容器启动后找不到 /dev/davinci* 设备GPUStack 注册 Worker 时节点标签和实际 NPU 型号对不上调度器把任务派到了错误的节点。下面按可复制的步骤拆开讲。2. TaoToken 前置准备与 GPUStack 控制面安装在开始昇腾侧配置之前先把模型访问和 API 管理的链路理清楚。DeepSeek-V4 的权重可以从官方渠道获取但如果你希望有一个统一的 API 入口来管理多个模型、做 Key 分发和用量统计TaoToken 的模型对话和 API 网关能力可以先用起来。它的控制台地址是 https://taotoken.net/console API 端点是 https://taotoken.net/api 不额外加 UTM 参数。对于后续要做压测的场景你可以先在 TaoToken 上创建一个测试用的 API Key把 DeepSeek-V4 的调用链路跑通确认请求格式和返回结构再回到本地 GPUStack 做私有化部署的对照。这一步不是必须的但建议做。原因是本地 GPUStack 拉起 DeepSeek-V4 之后你暴露出来的推理端点也是 OpenAI 兼容格式提前用 TaoToken 的 API 文档核对一遍请求体字段model、messages、max_tokens、stream能避免本地部署完成后发现客户端 SDK 对不上。接入文档在 https://taotoken.net/doc API Key 管理在 https://taotoken.net/api-keys 。回到 GPUStack 控制面安装。GPUStack Server 本身不依赖 GPU可以跑在 CPU 节点上也可以直接跑在 910B 节点上。单机场景下我建议直接跑在 910B 节点省去跨节点网络配置。前提是 Docker 已经装好执行docker info能看到正常输出。启动 GPUStack Server 容器sudo docker run -d --name gpustack \ --restart unless-stopped \ -p 80:80 \ --volume gpustack-data:/var/lib/gpustack \ swr.cn-south-1.myhuaweicloud.com/gpustack/gpustack:v2.1.2 \ --debug --bootstrap-password GPUStack123参数逐个说-p 80:80把 Web 控制台暴露在 80 端口如果 80 被占用可以改成-p 9999:80后续访问就用 9999。--volume gpustack-data:/var/lib/gpustack做数据持久化模型服务配置、计量数据、API Key 都存在这个卷里容器重建不会丢。--bootstrap-password是初始化 admin 用户的密码第一次登录后建议改掉。--debug开调试日志排查 Worker 注册失败时很有用。启动后看日志确认服务正常docker logs -f gpustack日志里出现Starting GPUStack server和Server started之类的字样就说明控制面起来了。浏览器访问http://Server主机IP:80用 admin / GPUStack123 登录。登录后第一件事是创建一个 Docker 类型的集群这个集群是后续 Worker 节点的归属容器。集群创建时会给一个 tokenWorker 节点接入时要用。如果你后续要做长期编码或 Agent 类任务需要更稳定的推理后端和更高的并发配额可以了解 TaoToken 的 Coding Planhttps://taotoken.net/coding-plan 。它和本地 GPUStack 不冲突本地负责私有化推理TaoToken 负责外部模型调用和统一网关。3. 昇腾 910B 驱动核对与 GPUStack Worker 接入配置这一节是整篇最容易翻车的地方。昇腾 910B 的软件栈分四层NPU 驱动、CANN 工具包、Ascend Docker Runtime、推理引擎vLLM-Ascend 或 SGLang。GPUStack 在拉起推理容器时会依赖前三层已经就绪。先做驱动版本核对。在目标节点执行npu-smi info输出里会显示驱动版本和固件版本。DeepSeek-V4 这类 MoE 模型对 CANN 版本有要求建议驱动版本不低于 25.5CANN 版本不低于 8.0.RC3。如果版本偏低先升级驱动和 CANN不要跳过这一步直接装 GPUStack否则后面容器里 torch.npu 初始化会报RuntimeError: Initialize device failed。接着检查 Ascend Docker Runtime 是否配置正确sudo docker info 2/dev/null | grep -q ascend echo Ascend Container Toolkit OK || (echo Ascend Container Toolkit not configured; exit 1)如果输出Ascend Container Toolkit OK说明 Docker 已经识别到 ascend 运行时容器里可以访问 NPU 设备。如果输出not configured需要安装 Ascend Docker Runtime。安装包从昇腾社区获取安装后重启 Docker 服务sudo systemctl restart docker然后重新执行上面的检查命令确认。接下来在 GPUStack 控制台添加 Worker 节点。控制台里选择「添加节点」系统会生成一段接入命令类似sudo docker run -d --name gpustack-worker \ --restart unless-stopped \ --privileged \ --network host \ --volume /var/lib/gpustack:/var/lib/gpustack \ --volume /usr/local/Ascend:/usr/local/Ascend \ --volume /usr/local/dcmi:/usr/local/dcmi \ --volume /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ --volume /dev/davinci*:/dev/davinci* \ swr.cn-south-1.myhuaweicloud.com/gpustack/gpustack:v2.1.2 \ --server-url http://ServerIP:80 \ --token 集群Token关键挂载项说明/usr/local/Ascend是 CANN 安装目录容器里推理引擎需要调用这里的算子库/usr/local/dcmi是设备管理接口/dev/davinci*是 NPU 设备节点不挂载容器里看不到卡。--privileged在昇腾场景下通常需要因为推理容器要访问设备文件和共享内存。如果你用 GPUStack 的 YAML 配置方式注册推理后端可以参考下面这份片段路径和字段名按实际环境调整backend: vllm model: deepseek-v4 model_path: /data/models/DeepSeek-V4 device: ascend tensor_parallel_size: 8 max_model_len: 32768 gpu_memory_utilization: 0.9 dtype: bfloat16 trust_remote_code: true extra_env: ASCEND_RT_VISIBLE_DEVICES: 0,1,2,3,4,5,6,7 HCCL_WHITELIST_DISABLE: 1tensor_parallel_size: 8对应八卡max_model_len先设 32768压测稳定后再往上调gpu_memory_utilization在 NPU 上对应显存池化比例0.9 是保守值。ASCEND_RT_VISIBLE_DEVICES显式指定可见设备避免容器里设备编号错乱。Worker 注册成功后在 GPUStack 控制台的节点列表里能看到该节点状态为 ReadyNPU 型号和显存容量会显示出来。如果状态一直是 Pending看 Worker 容器日志docker logs -f gpustack-worker常见原因是 token 过期或 server-url 写错。4. 拉起 DeepSeek-V4 推理服务与验证请求Worker 就绪后在 GPUStack 控制台创建模型服务。选择 DeepSeek-V4推理引擎选 vLLM昇腾场景下 vLLM-Ascend 适配相对成熟模型路径填权重实际挂载路径。如果权重在宿主机/data/models/DeepSeek-V4Worker 容器启动时要确保这个路径被挂载进去否则推理引擎找不到权重文件。启动后观察推理容器日志重点看这几行Loading model weights、NPU blocks initialized、Uvicorn running on http://0.0.0.0:8000。如果卡在Loading model weights超过十分钟可能是权重文件不完整或磁盘 IO 瓶颈如果报HCCL相关错误检查HCCL_WHITELIST_DISABLE和网卡配置。服务起来后GPUStack 会暴露一个 OpenAI 兼容端点通常是http://ServerIP:80/v1-openai/model-name或类似路径具体以控制台显示为准。用 curl 验证curl http://ServerIP:80/v1-openai/deepseek-v4/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer GPUStack API Key \ -d { model: deepseek-v4, messages: [{role: user, content: 用一句话解释 MoE 架构}], max_tokens: 128, temperature: 0.7 }返回里能看到choices[0].message.content就说明推理链路通了。如果返回 401检查 API Key 是否在 GPUStack 控制台正确生成如果返回model not found检查请求体里的 model 名称和控制台注册的名称是否一致。验证通过后用 Python 客户端做一轮简单请求确认流式输出正常from openai import OpenAI client OpenAI( base_urlhttp://ServerIP:80/v1-openai/deepseek-v4, api_keyGPUStack API Key ) resp client.chat.completions.create( modeldeepseek-v4, messages[{role: user, content: 写一个快速排序}], streamTrue ) for chunk in resp: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end)流式输出正常意味着推理引擎的 tokenizer 和 detokenizer 工作正常后续压测才有意义。5. 并发压测与常见报错排查压测用 vLLM 自带的 benchmark 脚本或 locust 都行。我习惯用 vLLM 的benchmark_serving.py指定并发数和请求数python benchmark_serving.py \ --backend openai \ --base-url http://ServerIP:80/v1-openai/deepseek-v4 \ --model deepseek-v4 \ --dataset-name sharegpt \ --num-prompts 200 \ --request-rate 10 \ --max-concurrency 16重点看三个指标TTFT首 token 延迟、TPOT每 token 输出时间、吞吐tokens/s。八卡 910B 跑 DeepSeek-V4 量化版并发 16 时 TTFT 通常在几百毫秒到一秒出头TPOT 在几十毫秒量级具体数值取决于量化精度和上下文长度。压测过程中用npu-smi info观察显存占用和 NPU 利用率如果显存接近打满且利用率上不去说明 batch size 或 max_model_len 设得太大需要回调。常见报错对照401 UnauthorizedAPI Key 错误或没带 Authorization 头。检查 GPUStack 控制台生成的 Key 是否复制完整请求头格式是Bearer key。local proxy failed或connection refused推理容器没起来或端口没暴露。先docker ps看容器状态再看容器日志确认 Uvicorn 是否监听在预期端口。Error reading choices或返回体里 choices 为空通常是请求体格式不对比如 messages 里 role 写错或者 max_tokens 设成了 0。用 curl 最小请求体先验证。OAuth或token expiredGPUStack Worker 注册 token 过期重新在控制台生成接入命令并重启 Worker 容器。HCCL timeout多卡通信超时检查ASCEND_RT_VISIBLE_DEVICES是否和实际卡数一致以及 HCCL 网卡配置。压测完成后把 TTFT、TPOT、吞吐和显存峰值记下来作为后续调参的基线。如果并发上去后吞吐不增反降多半是 KV Cache 碎片化或调度策略问题可以尝试调小max_model_len或开启 vLLM 的 chunked prefill。6. 从验证到长期运行API 管理与模型切换本地 GPUStack 跑通之后日常使用还需要一个统一的 API 入口来管理 Key、切换模型、看用量。TaoToken 的 API Keys 管理页面 https://taotoken.net/api-keys 可以创建多个 Key 分给不同业务方模型对话入口 https://taotoken.net/chat 用来快速验证模型返回是否符合预期。如果你后续要接入 Claude Code 或做 Agent 类开发Anthropic 兼容端点在 https://taotoken.net/claude-code-anthropic Coding Plan 在 https://taotoken.net/coding-plan 。本地 GPUStack 和 TaoToken 的分工可以这样理解GPUStack 负责私有化推理和 NPU 资源调度TaoToken 负责外部模型调用、Key 分发和统一网关。两者都暴露 OpenAI 兼容接口客户端代码只需要改 base_url 和 api_key 就能切换。压测数据用来判断本地 910B 单机能不能扛住业务峰值如果扛不住可以把部分流量切到 TaoToken 上的 DeepSeek-V4做混合部署。最后提醒一点昇腾 910B 的 CANN 和驱动版本更新比较频繁每次升级后建议重新跑一遍npu-smi info和容器内torch.npu.is_available()检查确认推理链路没断。GPUStack 的版本也建议锁定在 v2.1.2 这类经过验证的 tag不要盲目追 latest。
返回列表