TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

DeepSeek-V4-Flash 用 SGLang 部署

用 SGLang 部署 DeepSeek-V4-Flash 的 OpenAI 兼容接口:RTX PRO 6000 走官方 Docker,4 张 H200 走 Python 环境。

这篇适合谁

适合有多卡 GPU 服务器、想用 SGLang 托管 DeepSeek-V4-Flash 的读者。读完你能启动一个兼容 OpenAI 接口的服务,测通普通对话、流式输出、思考模式和工具调用,并知道首次部署最容易卡在哪里。

SGLang 和 DeepSeek-V4-Flash 是什么

SGLang 是一个开源的大模型推理服务框架。它提供 OpenAI 兼容接口,已有的 OpenAI 客户端代码通常只需要改一下地址就能调用[1]。

DeepSeek-V4-Flash 是 DeepSeek 官方发布的 Instruct 模型,权重在 Hugging Face 上,约 149GB,分成 46 个 safetensors 分片。其中 MoE 专家是 FP4 精度,Attention 和 Dense 层是 FP8 精度[2]。

先按硬件选路线

本文有两条路线。RTX PRO 6000 Blackwell 走官方 Docker 镜像;4 张 141GB 的 H200 走 Python 环境,这也是实测使用的配置[1]。

RTX PRO 6000 的官方验证配置用两张 96GB 显卡,TP=2,MoE 后端是 FlashInfer MXFP4。这套配置只支持 Flash 模型,并且不要开启 HiCache 或 MegaMoE[1][3]。大多数云服务器没有 Docker 运行时,这种情况直接走 Python 路线[1]。

两条路线最终提供的接口相同,区别在于环境从哪里来。Docker 路线把 SGLang 和 CUDA 依赖放在官方镜像里,启动前只需确认宿主机能运行 Docker,并能把 GPU 交给容器[1]。Python 路线则要自己建环境,装好 SGLang 和 sglang-kernel,并确认 PyTorch 与 CUDA 版本对得上。实测的 H200 环境是 Python 3.12 加 PyTorch 2.11.0+cu130,换机器时要先核对这个组合[1]。

这里的 --tp 指张量并行的卡数,决定模型被切分到几张卡上。Docker 路线设为 2,H200 路线设为 4,它要和你交给进程的卡数对应。模型本身约 149GB,超过单张 141GB 的 H200,所以单卡放不下,必须多卡切分[1][2]。

下载模型并检查

模型只下载一次。下载前先确认磁盘空间足够,权重本身就约 149GB。普通网络用 Hugging Face CLI;国内网络可以改用 ModelScope[1][2]。

hf download deepseek-ai/DeepSeek-V4-Flash \
    --local-dir /root/autodl-fs/models/DeepSeek-V4-Flash
modelscope download \
    --model deepseek-ai/DeepSeek-V4-Flash \
    --local_dir /root/autodl-fs/models/DeepSeek-V4-Flash

下载完成后,应有 46 个分片,没有 .incomplete 残留文件,目录总大小约 149GB,并且有 model.safetensors.index.json 索引文件[1]。

ls "$MODEL_PATH"/model-*.safetensors | wc -l
ls "$MODEL_PATH"/*.incomplete 2>/dev/null || echo "no incomplete"
du -sh "$MODEL_PATH"
test -f "$MODEL_PATH/model.safetensors.index.json" && echo "index OK"

用 nvidia-smi 和 nvidia-smi topo -m 检查显卡和拓扑[1]。下载完成后可以逐项核对下面这份清单:

  • 模型目录里有 46 个 model-*.safetensors 分片。
  • 没有 .incomplete 残留文件。
  • 目录总大小约 149GB,并且有 model.safetensors.index.json。
  • nvidia-smi 能看到计划使用的全部显卡。

清单全部通过后再启动服务,能省下很多排查时间。

nvidia-smi
nvidia-smi topo -m

路线一:RTX PRO 6000 用官方 Docker 镜像

先拉取镜像[1]:

docker pull lmsysorg/sglang:latest

启动命令里的 --gpus '"device=0,1"' 只会用到 0 号和 1 号卡,即使服务器有 4 张 RTX PRO 6000 也一样。需要换卡时,修改这个设备列表。容器的端口是 30000,模型以只读方式挂载。命令里还设置了 --reasoning-parser deepseek-v4 和 --tool-call-parser deepseekv4,分别用于拆分思考内容和解析工具调用[1]。

docker run --rm \
  --gpus '"device=0,1"' \
  --shm-size 32g \
  --ipc=host \
  -p 30000:30000 \
  -v /data/models/DeepSeek-V4-Flash:/models/DeepSeek-V4-Flash:ro \
  lmsysorg/sglang:latest \
  sglang serve \
    --trust-remote-code \
    --model-path /models/DeepSeek-V4-Flash \
    --served-model-name deepseek-v4-flash \
    --tp 2 \
    --moe-runner-backend flashinfer_mxfp4 \
    --mem-fraction-static 0.92 \
    --cuda-graph-max-bs-decode 32 \
    --reasoning-parser deepseek-v4 \
    --tool-call-parser deepseekv4 \
    --host 0.0.0.0 \
    --port 30000

路线二:4 张 H200 用 Python 环境

创建 Python 3.12 环境。实测使用的是 PyTorch 2.11.0+cu130。下面的命令先设置 uv 缓存,改用清华 PyPI 镜像,安装 SGLang,再从 cu130 索引重装 sglang-kernel[1]。

conda create -n sglang python=3.12 -y
conda activate sglang

export UV_CACHE_DIR=/dev/shm/uv-cache-sglang
export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple
export UV_LINK_MODE=copy
mkdir -p "$UV_CACHE_DIR"

python -m pip install --upgrade pip
python -m pip install uv
uv pip install --prerelease=allow sglang
uv pip install --force-reinstall sglang-kernel \
  --index-url https://docs.sglang.ai/whl/cu130/

安装后检查 CUDA 是否可用,并确认 DeepSeek-V4 的解析器存在[1]。

python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.device_count())"
python -m sglang.launch_server --help | grep -o "deepseek-v4" | head

H200 可以直接加载官方的 FP4 与 FP8 混合权重。实测命令使用 --tp 4,显存静态分配比例为 0.85,上下文先设为 131072(即 128K),MoE 后端用 Marlin W4A16[1]。命令还开启了 EAGLE 推测解码,推测步数为 3,top-k 为 1,每次草稿 token 为 4[1]。

先设置环境变量:

conda activate sglang

export CUDA_VISIBLE_DEVICES=0,1,2,3
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

再启动服务:

sglang serve \
  --model-path /root/autodl-fs/models/DeepSeek-V4-Flash \
  --served-model-name deepseek-v4-flash \
  --trust-remote-code \
  --tp 4 \
  --host 0.0.0.0 \
  --port 30000 \
  --mem-fraction-static 0.85 \
  --context-length 131072 \
  --moe-runner-backend marlin \
  --reasoning-parser deepseek-v4 \
  --tool-call-parser deepseekv4 \
  --speculative-algorithm EAGLE \
  --speculative-num-steps 3 \
  --speculative-eagle-topk 1 \
  --speculative-num-draft-tokens 4

首次启动会慢很多,因为要加载模型、预热内核并捕获 CUDA Graph。日志出现下面几行,说明服务已经就绪[1]。

Application startup complete.
Uvicorn running on http://0.0.0.0:30000
The server is fired up and ready to roll!

调用接口

接口地址是 http://127.0.0.1:30000/v1,api_key 可以随便填。请求里的 model 字段必须是 deepseek-v4-flash,也就是启动命令里 --served-model-name 设定的名字,否则服务端找不到对应模型[1]。客户端这样创建[1]:

from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:30000/v1", api_key="EMPTY")

开启思考模式,需要传 extra_body={"chat_template_kwargs": {"thinking": True}}。思考内容会出现在流式增量的 reasoning_content 字段里[1]。工具调用的测试会发送一个 get_weather 函数定义,询问北京的天气,然后打印返回的 tool_calls[1]。

思考模式和工具调用是两类不同的输出。思考内容单独放在 reasoning_content 里,最终回答仍在 content 中,所以客户端可以选择只展示回答,也可以把思考过程展示出来。工具调用则返回模型想调用的函数名和参数,真正执行函数、再把结果回传给模型的工作,要由你的应用来完成[1]。这一点在做 Agent 时尤其重要,因为模型只负责决定调用什么,并不会自己去执行。

常见问题

这套路线的代价主要在首次部署上。环境准备、模型下载和启动等待加在一起,通常比写客户端代码花的时间多得多。把每一步的输出保存下来,比如 nvidia-smi 的结果和启动日志,出问题时能更快定位原因。

首次启动慢是正常的。模型加载、内核预热和 CUDA Graph 捕获都要时间,在日志出现就绪三行之前不要急着测试,也不要反复重启,否则每次都要重新来一遍[1]。

如果显存紧张,可以先降低 --mem-fraction-static 的比例,或者缩短 --context-length,两者都会减少 KV 缓存的占用。这两个参数在本文的实测配置里分别是 0.85 和 131072[1]。

最容易忽略的是设备列表。四张 RTX PRO 6000 的服务器,如果不改命令,仍然只用 0 号和 1 号卡[1]。模型加载完成后,用 nvidia-smi 查看每张卡的显存占用;请求期间再看 GPU 利用率,确认各卡都在工作[1]。

官方的配置说明可以参考 SGLang 的 DeepSeek-V4 Cookbook[3]。

下一步

服务跑通以后,可以先用上面的客户端代码,换成你自己的提示词,观察流式输出、思考内容和工具调用在真实请求里的表现。想进一步调整并行方式、缓存或推测解码参数,先读 SGLang 的 DeepSeek-V4 Cookbook,再改启动命令,每次只改一个参数,便于回退[3]。

本文改编自 Datawhale 开源项目 self-llm 中的 DeepSeek-V4-Flash SGLang 部署教程[1],原文以 Apache-2.0 许可证发布。

来源

  1. 1
    02-DeepSeek-V4-Flash SGLang 部署Datawhale self-llm (Apache-2.0)
  2. 2
  3. 3

引用本页: DeepSeek-V4-Flash 用 SGLang 部署. TellWorld, https://www.tellworld.net/zh/practice/practice-deepseek-v4-flash-sglang. 更新于 2026-11-14

相关动态