1. 三台 DGX Spark 跑 DeepSeek V4 Flash NVFP4 到底难在哪
如果你手里正好有三台 DGX Spark,想把 DeepSeek V4 Flash 的 NVFP4 量化权重跑成一个对外可用的 OpenAI-compatible API,那这篇就是按我实际踩过的路径写的。核心检索词先摆出来:三台 DGX Spark 部署 DeepSeek V4 Flash NVFP4,本质是把一个 43 层的 MoE 模型按 Pipeline Parallel 切成 14/14/15 三段,分别放到三台 GB10 机器上,通过 ConnectX-7 组成的 RoCE Ring 做 NCCL 通信,最后只在 rank 0 暴露一个 8000 端口的推理服务。它适合第一次接触多机大模型、Docker、RoCE 或 NCCL 的管理员,也适合已经单机跑过 SGLang、想往多机扩展的人。
难点不在模型本身,而在三件事:第一,三台机器必须被当成一个整体,任意一台退出整个实例都不完整,启停必须协调;第二,NVFP4 在 SM121 上有特定的 kernel 路径,参数写错会出现 HTTP 200 但返回空内容;第三,NCCL 的 bootstrap 走管理网、模型数据走 RoCE,这两条网络职责不能混。我见过太多人把 dist-init 地址写成 RoCE 地址,结果 TCPStore 直接 No route to host。
先把最终拓扑说清楚,后面所有配置都围绕它展开:
客户端 / Agent │ HTTP :8000 OpenAI-compatible API ▼ spark-6 / 192.168.1.128 / rank 0 / PP stage 0 / 14 层 │ ConnectX-7 RoCE Ring,NCCL 模型通信 ▼ spark-7 / 192.168.1.228 / rank 1 / PP stage 1 / 14 层 ▼ spark-8 / 192.168.1.168 / rank 2 / PP stage 2 / 15 层控制面、SSH、TCPStore、Gloo、NCCL bootstrap 全部走管理网enP7s7 / 192.168.1.0/24;模型数据面走三条 ConnectX-7 200 Gb/s 直连组成的 RoCE Ring。节点映射固定,不要交换 rank:
| 节点 | 管理 IP | Rank | Pipeline stage | 层数 | 对外职责 |
|---|---|---|---|---|---|
| spark-6 | 192.168.1.128 | 0 | 0 | 14 | rendezvous、API :8000 |
| spark-7 | 192.168.1.228 | 1 | 1 | 14 | worker |
| spark-8 | 192.168.1.168 | 2 | 2 | 15 | worker、输出层 |
这是一个 TP=1、PP=3、nnodes=3 的分布式实例。模型 43 层分成 14、14、15,任意一台退出整个实例都不完整。新手最容易犯的错是只重启一个 rank,看起来容器健康,实际整个 PP 集群已经不可用。
术语表也顺手给一下,不然后面看参数会懵:
| 术语 | 含义 | 本方案取值 |
|---|---|---|
| Rank | 分布式任务中节点唯一编号 | spark-6/7/8 分别为 0/1/2 |
| TP | Tensor Parallel,同层拆到多 GPU | 1,不跨节点拆层 |
| PP | Pipeline Parallel,不同层放不同节点 | 3,每台一个 stage |
| NCCL | NVIDIA GPU 集合通信库 | 负责三节点模型通信 |
| RoCE | 以太网上承载 RDMA | 走 ConnectX-7 Ring |
| Gloo/TCPStore | 进程发现与控制面通信 | 走管理网 enP7s7 |
| NVFP4 | NVIDIA 4-bit 浮点量化格式 | MoE 专家权重主要格式 |
| SM121 | DGX Spark GB10 的 compute capability | (12, 1) |
已验证的安全运行边界是这样的,生产配置不是模型理论上限,而是这组三机实测后的安全边界:
TP=1 PP=3 PP_LAYER_PARTITION=14,14,15 CONTEXT_LENGTH=12288 # Server 硬窗口 # 生产输入 cap=8192,必须由客户端或网关执行 MEM_FRACTION_STATIC=0.57 MAX_TOTAL_TOKENS=1579520 MAX_RUNNING_REQUESTS=8 CUDA_GRAPH_MAX_BS_DECODE=4 CHUNKED_PREFILL_SIZE=4096 MAX_PREFILL_TOKENS=409612288 不是推荐输入长度,它还要容纳输出、Chat template、reasoning 和 tool schema。生产输入最多 8192 tokens,长请求建议并发 1。12K 重复冷请求和 16K 请求已经触发过系统内存压力门槛,所以不要对外宣传或开放 12K、16K、32K 这些输入能力。
2. TaoToken 统一 Key 接入:为什么多机部署也需要它
三台 DGX Spark 把模型跑起来之后,下一个问题马上来了:你的 Agent、Codex、OpenClaw、各种客户端怎么统一调用?如果每个客户端都直接写http://192.168.1.128:8000/v1加一个本地 key,短期能用,但一旦你要同时接多个模型、多个环境、多个团队成员,key 管理就会变成灾难。这时候用 TaoToken 做统一 Key/API 通道就非常合适。
TaoToken 在这里扮演的角色是统一入口和凭据管理层。你的三台 DGX Spark 集群对外只暴露一个受保护的 API,而所有客户端通过 TaoToken 的统一 Key 去访问,不用在每台客户端上散落不同的服务凭据。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。
先说清楚它解决什么问题。多机部署的痛点不只是推理本身,还有:
第一,凭据分散。三台机器共用同一个SGLANG_API_KEY,这个 key 是服务凭据,不是多租户权限系统。如果你把它直接发给每个客户端,等于把后端完全暴露。TaoToken 的统一 Key 让你在网关层做一次收敛,客户端拿到的是 TaoToken 的 key,而不是后端服务凭据。
第二,模型切换。今天跑 DeepSeek V4 Flash,明天可能想对比别的模型。如果每个客户端都硬编码 base_url 和 model,切换成本很高。通过 TaoToken 的统一通道,客户端配置只需要改 model 字段。
第三,连通性自检。多机集群最容易出的问题是"看起来起来了但实际不通"。TaoToken 的模型对话入口可以帮你快速验证通道是否打通,而不用每次都写 curl。
具体操作上,你需要先拿到 TaoToken 的 API Key。进入控制台创建 key,然后就可以在客户端里配置。对于长期编码和 Agent 场景,建议用 Coding Plan,它更适合持续性的编码任务;如果只是验证模型连通性,用模型对话入口就够了。
这里要强调一个安全边界:TaoToken 是统一接入层,不是让你把后端 8000 端口直接暴露到公网。正确的做法是后端 API 仍然只在可信管理网内,TaoToken 作为受控的统一入口。多用户或跨网访问时,在 API 前增加独立 TLS 反向代理或网关,并实现每客户端身份认证、最大输入 8192 token、默认并发 4、后端总在途不超过 8、长上下文请求并发 1、请求速率和排队上限、超时取消和审计日志脱敏。
如果你要把 Codex 接进来,Codex 需要 Responses API,所以必须用带兼容补丁的派生镜像。配置上关键项是:
model = "deepseek-v4-flash" model_provider = "spark_sglang" model_context_window = 12288 model_auto_compact_token_limit = 8192 [model_providers.spark_sglang] base_url = "http://192.168.1.128:8000/v1" env_key = "SGLANG_API_KEY" wire_api = "responses"先在启动 Codex 的受控 shell 或 credential manager 中提供SGLANG_API_KEY,不要把值写进 TOML。如果你通过 TaoToken 统一通道接入,base_url 就换成 TaoToken 的 API 地址,key 换成 TaoToken 的 key,model 仍然是deepseek-v4-flash。这样客户端侧就不需要知道后端三台机器的具体 IP。
对于 OpenClaw,当前经过验证的 provider 配置是:
api: openai-completions contextWindow: 12288 maxTokens: 4096 apiKey: ${SGLANG_API_KEY}同样,如果你走 TaoToken 统一通道,把 apiKey 换成 TaoToken 的 key,base_url 指向 TaoToken API 即可。复制模板不会也不应该自动启动 OpenClaw,当前三台 OpenClaw service 都保持 disabled/inactive,只有明确要求在指定主机运行时才另行启用。
这里有个硬规则必须记住:实际序列化后的 prompt tokens + max_output_tokens <= 12288,其中 prompt 已包含 chat template、system、tool schema、工具结果和历史消息。网关应该使用服务 tokenizer 计数后再准入,并额外保留模板/协议余量。如果输入接近 8192,就必须相应降低最大输出。
TaoToken 的接入文档里有完整的参数说明和示例,建议对照着配置。如果你在配置过程中遇到 401 或连接问题,先检查 key 是否正确、base_url 是否指向了正确的端点。排障时优先看 API Keys 页面确认 key 状态,再看接入文档核对参数格式。
3. 可复制的 Docker 与 NCCL 配置:从镜像到 .env
这一节是全文最核心的可复制部分。先说镜像固定,本方案冻结 NVIDIA SGLang 26.07 的整套兼容栈:SGLang 0.5.14、FlashInfer 0.6.14、Torch 2.13/CUDA 13.3、NCCL 2.30.7。不要把"更新"误当成"优化",单独升级其中一个组件会失去已经验证的 ABI 和 kernel 组合。
| 对象 | 固定标识 |
|---|---|
| 官方基础镜像 RepoDigest | nvcr.io/nvidia/sglang@sha256:4e2c6f610dca57dd26af9c3045d1935a11d185903cec060d11cec061de2b62f0 |
| 官方基础镜像 config ID | sha256:4f5f4cade001a28b44f3e6289f49eb6e2e3e941e284fa95ee67a53c3d17745a1 |
| 三机当前派生镜像 config ID | sha256:43e76a532b12365232231d0bff2f63b79744f0042a016f04b8d5f7c27bf20386 |
| 平台 | linux/arm64 |
| 兼容补丁 SHA-256 | ceb5ac6536e25e4ce786dd99bbe09d4c2890cf645b74794425c952a1b976c3dc |
派生镜像只给 SGLang Responses 完成事件补充cache_write_tokens: 0,以满足镜像中 openai-python 2.48.0 的 schema。它不升级或替换任何 CUDA/Python 依赖。Codex 使用 Responses API,所以生产接入 Codex 时必须用这个派生镜像。
SM121 必须保留的设置,这几项写错会直接导致空输出:
--moe-runner-backend flashinfer_cutlass --fp4-gemm-backend flashinfer_cutlass --disable-flashinfer-autotune SGLANG_OPT_FLASHMLA_SPARSE_PREFILL=0 SGLANG_SM120_TRITON_FLASHMLA=1 SGLANG_FP8_IGNORED_LAYERS=lm_headlm_head在 checkpoint 中是 BF16 且没有 FP8 scale。如果强行套用 FP8,API 可能返回 HTTP 200 却生成空内容或 BOS。CUTLASS 两项则防止 GB10/SM121 误入不适用的 TRT-LLM routed kernel。
Docker 最小权限的 Compose 关键片段:
services: sglang: image: sha256:43e76a532b12365232231d0bff2f63b79744f0042a016f04b8d5f7c27bf20386 network_mode: host ipc: host gpus: all devices: - /dev/infiniband ulimits: memlock: -1 stack: 67108864 volumes: - /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4:/model:ro - /home/nvidia/workspaces/cache/deepseek-v4/${HOSTNAME}:/cache:rw restart: "no" logging: driver: json-file options: max-size: "100m" max-file: "3"明确不使用:--privileged、seccomp=unconfined、Docker socket 挂载、模型目录读写挂载、宿主 CUDA/NCCL 注入、Ray、SGLang Gateway、Docker overlay network。restart: no是有意设计,单个 rank 自动重启会制造"一个容器看似健康、整个 PP 集群不可用"的假象。
每台的.env文件,公共参数必须一致:
COMPOSE_PROJECT_NAME=deepseek-v4-pp3 MGMT_IFNAME=enP7s7 SERVER_PORT=8000 DIST_INIT_ADDR=192.168.1.128:25001 SGLANG_IMAGE=sha256:43e76a532b12365232231d0bff2f63b79744f0042a016f04b8d5f7c27bf20386 SGLANG_API_KEY=REPLACE_WITH_A_SECRET_VALUE SERVED_MODEL_NAME=deepseek-v4-flash MODEL_DIR=/home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4 PP_LAYER_PARTITION=14,14,15 MEM_FRACTION_STATIC=0.57 MAX_TOTAL_TOKENS=1579520 CONTEXT_LENGTH=12288 CHUNKED_PREFILL_SIZE=4096 MAX_PREFILL_TOKENS=4096 MAX_RUNNING_REQUESTS=8 CUDA_GRAPH_MAX_BS_DECODE=4 WATCHDOG_TIMEOUT=1800 NCCL_DEBUG=INFO REQUIRE_SYNC_CLUSTER=1 MIN_MEM_AVAILABLE_GIB=100节点专属字段:
| 节点 | EXPECTED_HOSTNAME | NODE_RANK | MGMT_IP / SERVER_HOST | CACHE_DIR |
|---|---|---|---|---|
| spark-6 | spark-6 | 0 | 192.168.1.128 | .../cache/deepseek-v4/spark-6 |
| spark-7 | spark-7 | 1 | 192.168.1.228 | .../cache/deepseek-v4/spark-7 |
| spark-8 | spark-8 | 2 | 192.168.1.168 | .../cache/deepseek-v4/spark-8 |
创建.env时权限必须是 0600,owner 必须是可信的 root 或 nvidia:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4/deploy umask 077 node_env="nodes/$(hostname).env" test ! -e "${node_env}" || { echo "REFUSE: ${node_env} already exists"; exit 1; } install -m 600 "${node_env}.example" "${node_env}" mkdir -p /home/nvidia/workspaces/cache/deepseek-v4/$(hostname)API key 至少 32 字符,建议用openssl rand -hex 32生成一次并存入密码管理器。不要把真实 key 写在 Shell 历史、聊天、Git 或文档中。
NCCL 环境变量清单,首轮不要自行设置NCCL_IB_HCA、NCCL_IB_GID_INDEX、NCCL_CROSS_NIC、NCCL_IB_TC、NCCL_IB_SL或 GDR 参数。DGX Spark 不支持 GPUDirect RDMA,跨节点 RoCE 使用 host staging 是平台预期行为。Ring helper 会使用:
NCCL_IB_SUBNET_AWARE_ROUTING=1 NCCL_NET_PLUGIN=none拉取固定基础镜像并验证:
docker pull nvcr.io/nvidia/sglang@sha256:4e2c6f610dca57dd26af9c3045d1935a11d185903cec060d11cec061de2b62f0 docker image inspect \ nvcr.io/nvidia/sglang@sha256:4e2c6f610dca57dd26af9c3045d1935a11d185903cec060d11cec061de2b62f0 \ --format 'id={{.Id}} platform={{.Os}}/{{.Architecture}}'期望基础 config ID 是sha256:4f5f4cade...45a1,平台为linux/arm64。不要只使用会漂移的26.07-py3tag。
4. 验证请求与成功结果:从 NCCL 到 API 逐条确认
配置写完不代表能用,这一节给你逐条验证命令。顺序是先主机 NCCL,再容器 NCCL,最后 API 语义。
主机 NCCL helper 只用于网络验收,不挂入 SGLang 容器。为保证复现,固定到审阅过的 playbook commit:
set -Eeuo pipefail mkdir -p /home/nvidia/workspaces/nccl-validation cd /home/nvidia/workspaces/nccl-validation PLAYBOOK_COMMIT=1fb66f059ee427c5a3678b3117ef73aab042b458 curl -fsSL "https://raw.githubusercontent.com/NVIDIA/dgx-spark-playbooks/${PLAYBOOK_COMMIT}/nvidia/nccl/assets/setup.sh" -o setup.sh curl -fsSL "https://raw.githubusercontent.com/NVIDIA/dgx-spark-playbooks/${PLAYBOOK_COMMIT}/nvidia/nccl/assets/launch.sh" -o launch.sh printf '%s %s\n' \ 32665e12b12c9a3eb3f9ac043993f442df9215e47b42d0b93f511e113c1b5cc7 setup.sh \ a6c2e69b234f3455283f354b9f21b13cd2665d69a563e69aa2f51f49a31c00f3 launch.sh \ | sha256sum -c - eval "$(ssh-agent -s)" trap 'ssh-agent -k >/dev/null 2>&1 || true' EXIT ssh-add /home/nvidia/.ssh/id_ed25519_shared bash setup.sh 192.168.1.228 192.168.1.168 bash launch.sh --topology ring \ 192.168.1.128 \ 192.168.1.228 \ 192.168.1.168 ssh-agent -k trap - EXIT通过条件:三 rank 完成、不 hang、数值正确,日志没有unknown event type (18)、mlx5 fatal/reset、AER、link reset。
模型完整性检查,三台分别执行:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4 du -sh . find . -maxdepth 1 -type f -name 'model-*.safetensors' | wc -l test -r model.safetensors.index.json再让 index 自己检查被引用的分片:
import json from pathlib import Path root = Path(".") with (root / "model.safetensors.index.json").open(encoding="utf-8") as f: index = json.load(f) files = sorted(set(index["weight_map"].values())) missing = [name for name in files if not (root / name).is_file()] empty = [name for name in files if (root / name).is_file() and (root / name).stat().st_size == 0] print(f"shards={len(files)} missing={len(missing)} empty={len(empty)}") raise SystemExit(1 if len(files) != 46 or missing or empty else 0)正确结果为 46 个 shard、无 missing、无空文件,当前总字节为 168281985176。
三层预检,三台分别执行:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4/deploy ./scripts/preflight.sh nodes/$(hostname).env ./scripts/container-smoke.sh nodes/$(hostname).env三机一致性门禁,只在 spark-6 执行:
./scripts/cluster-preflight.sh期望最后输出:
PASS: ranks are unique and all common image, secret-hash, runtime, and model-index fields match最终容器 NCCL Gate,模型启动前从 spark-6 执行:
./scripts/cluster-down.sh nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv ./scripts/cluster-nccl-smoke.sh通过条件:
CLUSTER_NCCL_SMOKE PASS ranks=0,1,2 transport=IB ...每个日志必须包含 NET/IB HCA 选择,不能出现 Socket 数据面、unknown event type、NCCL ERROR、Traceback 或数据错误。NCCL 2.30.7 在本平台每个 HCA 可能有一条固定的ibv_query_port_speed ... errno 93能力查询 warning,验收器只允许这一条精确 warning。
启动三节点模型:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4 sudo deploy/systemd/install.sh --now以后开机由deepseek-v4-pp3.service等待三台节点和 RoCE 就绪后整组启动。手工维护时才执行:
bash deploy/scripts/cluster-up.sh等待真正就绪,首次加载约 168 GB 权重需要数分钟:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4/deploy ./scripts/wait-ready.sh nodes/spark-6.env成功会输出:
Rank 0 API is ready: http://192.168.1.128:8000一键 API 验收:
./scripts/verify-api.sh nodes/spark-6.env它会检查/health和执行真实 forward 的/health_generate、/v1/models中的deepseek-v4-flash、确定性数值语义、Chat Completions SSE 流式结束标记、DeepSeek V4 reasoning_content、function tool-call 解析。最后必须看到:
PASS: all DeepSeek V4 API verification gatesAgent 协议验收:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4 source deploy/scripts/lib.sh load_env nodes/spark-6.env python3 deploy/integrations/verify_agent_endpoints.py期望:
PASS chat-completions PASS responses-sse-completed PASS anthropic-messages PASS all-agent-endpoints如果你通过 TaoToken 统一通道接入,验证方式更简单:用模型对话入口发一条测试请求,确认能正常返回内容。这一步能快速判断是后端问题还是客户端配置问题。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节按真实报错来。多机部署最容易卡在几个固定位置,我把现象、原因、处理列成表,你对照着查。
| 现象 | 最可能原因 | 正确处理 |
|---|---|---|
| preflight 报多个 169.254/16 | 旧重叠 IPv4LL 路由仍在 | 回到 Cluster Assistant/Netplan Ring,不用手写 HCA 绕过 |
| TCPStore No route to host | 管理网、端口或 dist-init 错误 | 确认 enP7s7 和 192.168.1.128:25001 |
| NCCL 只有 Socket | RoCE 没有被最终容器发现 | 停止部署,查 Sync 计划、HCA、/dev/infiniband 和日志 |
| unknown event type (18) | 旧 NCCL/旧镜像或 RDMA 异常 | 核对派生 image ID、NCCL 2.30.7、mlx5 日志 |
| no kernel image / SM121 unsupported | 镜像依赖被覆盖 | 核对固定镜像,移除 pip overlay |
| trtllm_batched_gemm_runner.cu:305 | SM121 误入 TRT-LLM routed backend | 恢复两个 flashinfer_cutlass 参数并三机协调重启 |
| API 200 但内容为空/BOS | BF16 lm_head 被错误量化 | 恢复 SGLANG_FP8_IGNORED_LAYERS=lm_head,重跑语义 Gate |
| 提高 CUDA Graph BS 后启动失败 | 新 batch graph/kernel 路径未通过验收 | 回滚 CUDA_GRAPH_MAX_BS_DECODE=4 |
| 启动时 OOM、持续 swap 或 PSI | context/mem/并发过高 | 停三 rank,恢复最终参数 |
| rank 0 /health 不就绪 | 某 worker 卡住或退出 | 同时查看三机 status 和脱敏日志 |
| 工具调用未解析 | parser、客户端 schema 或模型配置错误 | 保持 deepseekv4 tool parser,运行 verify-api.sh |
| Codex 收不到 response.completed | 使用了未打补丁的基础镜像 | 核对派生 image ID,运行 Agent 协议探针 |
| AER、Xid、HCA reset、link flap | 供电、线缆、固件或硬件风险 | 立即停止压测,保留诊断,检查电源/线缆 |
现在说几个和 TaoToken 接入相关的报错。
401 Unauthorized:这是最常见的。如果你通过 TaoToken 统一通道访问,先检查 TaoToken 的 key 是否正确、是否过期。如果直连后端,检查SGLANG_API_KEY是否在三台.env中一致。注意.env里SGLANG_API_KEY=REPLACE_WITH_A_SECRET_VALUE这个占位符必须替换成真实值,很多人忘了改。另外,key 不要带引号,dotenv 每行采用KEY=value单行格式。
local proxy failed:这个通常出现在客户端配置了代理但代理不可达时。检查你的客户端是否设置了HTTP_PROXY或HTTPS_PROXY环境变量,如果后端在管理网内,应该把192.168.1.0/24加入NO_PROXY。如果你通过 TaoToken 访问,确认网络能正常到达 TaoToken 的 API 端点。
reading choices 相关报错:这通常是响应格式解析问题。如果你用的是派生镜像之前的版本,Responses API 的完成事件缺少cache_write_tokens: 0,openai-python 2.48.0 会解析失败。核对派生 image ID 是否为sha256:43e76a...20386,运行 Agent 协议探针确认PASS responses-sse-completed。
OAuth 相关报错:如果你在 Codex 里看到 OAuth 错误,通常是因为 Codex 尝试用 OAuth 流程但你的后端是本地 API key 模式。确认 Codex 配置里env_key = "SGLANG_API_KEY",并且启动 Codex 的 shell 里已经 export 了这个变量。不要把 key 写进 TOML 文件。
遇到问题先保存诊断:
cd /home/nvidia/workspaces/models/DeepSeek-V4-Flash-NVFP4/deploy ./scripts/node-status.sh nodes/$(hostname).env ./scripts/node-logs.sh nodes/$(hostname).env --no-follow ./scripts/collect-diagnostics.sh nodes/$(hostname).env不要以增大 timeout、关闭错误检查、强制 Socket、禁用 RDMA 或提高 swap 的方式把故障"隐藏"为成功。
还有一个容易忽略的点:如果你在配置 TaoToken 时遇到连通性问题,先确认后端 API 本身是通的。用curl直接打后端:
curl -s http://192.168.1.128:8000/health curl -s http://192.168.1.128:8000/v1/models \ -H "Authorization: Bearer ${SGLANG_API_KEY}"如果后端通但 TaoToken 不通,问题在网关层;如果后端本身不通,先回到第 4 节排查。
6. 把三台 DGX Spark 接进 TaoToken 统一通道
最后这一节说清楚接入路径。你的三台 DGX Spark 集群跑起来之后,对外只暴露 rank 0 的 8000 端口。这个端口只应该在可信管理网内。TaoToken 作为统一接入层,帮你把凭据管理和模型切换收敛到一个地方。
具体操作步骤:
第一步,确认后端 API 可用。在 spark-6 上执行./scripts/verify-api.sh nodes/spark-6.env,看到PASS: all DeepSeek V4 API verification gates才算后端就绪。
第二步,拿到 TaoToken 的 API Key。进入控制台创建,建议为不同用途创建不同的 key,方便后续审计和轮换。
第三步,配置客户端。以 Codex 为例,把 base_url 指向 TaoToken 的 API 端点,key 用 TaoToken 的 key,model 保持deepseek-v4-flash。这样客户端不需要知道后端三台机器的具体 IP,也不需要持有后端服务凭据。
第四步,验证连通性。用模型对话入口发一条测试请求,确认返回正常。如果失败,先检查 key 和 base_url,再检查后端是否可达。
对于长期编码和 Agent 场景,建议用 Coding Plan,它更适合持续性的编码任务,有更稳定的配额和更长的会话支持。如果你只是偶尔验证模型,用模型对话就够了。
接入文档里有完整的参数说明、错误码解释和示例代码,建议对照着配置。API Keys 页面可以管理你的 key,包括创建、查看状态和轮换。
这里再强调一次安全边界:TaoToken 是统一接入层,不是让你把后端 8000 端口直接暴露到公网。正确的架构是后端 API 在可信管理网内,TaoToken 作为受控的统一入口。多用户或跨网访问时,在 API 前增加独立 TLS 反向代理或网关,并实现每客户端身份认证、最大输入 8192 token、默认并发 4、后端总在途不超过 8、长上下文请求并发 1、请求速率和排队上限、超时取消和审计日志脱敏。
生产限额必须保持:输入 cap 8192 tokens,交互默认并发 4,后端最大在途 8,长上下文并发 1。256→128 合成形状建议稳态到达率 <=0.10 req/s,同一形状 0.20 req/s 仅允许短暂排队,0.30 req/s 是 SLA WARN 不作为交互默认。其他真实工作负载必须重新压测 arrival 曲线。
如果你要把这套部署交给团队使用,最短验收清单是这样的:三机 hostname、管理 IP、rank 一一对应;key-based SSH 无交互通过;三机模型路径相同,index 引用 46 个 shard;六子网 Ring 无重叠 IPv4LL,四个逻辑 HCA/node Up,物理链路 200 Gb/s;三机拥有相同派生 image ID;三份.env权限 0600,公共运行参数和秘密匹配;单机 preflight、container smoke、cluster preflight 全部通过;cluster-nccl-smoke.sh 三 rank 为 NET/IB 且数据正确;cluster-up.sh 成功,wait-ready.sh 返回 Ready;verify-api.sh 和 verify_agent_endpoints.py 全部 PASS;Gateway/客户端限制生产输入 8192、默认并发 4、最大在途 8。
完成本教程不代表可以跳过变更管理。任何 OTA、网络、镜像、模型、context、内存比例、并发或 CUDA Graph 变更,都会使相关历史 PASS 失效,必须按对应 Gate 重新验证。