准备
硬件(下面其中之一)
- 2机8卡H20
- 1机8卡H200
操作系统版本: CentOS Linux release 8.5.2111
安装包(部分安装包为企业私有,仅做部分参考)
- NVIDIA-Linux-x86_64-570.86.15.run
- cuda_12.6.3_560.35.05_linux.run
- nvidia-fabric-manager-570.86.15-1.x86_64.rpm
- containerd.io-1.6.32-3.1.el8.x86_64.rpm
- docker-ce-26.1.3-1.el8.x86_64.rpm
- docker-ce-cli-26.1.3-1.el8.x86_64.rpm
- Nvidia_Helper
docker_images
- lmsysorg_sglang_v0_4_4_post1_cu125.tar
- vllm_vllm-openai_v0_7_3.tar
- nvidia_cuda_12.6.2-base-ubuntu22.04.tar
安装环境
- 安装驱动
./NVIDIA-Linux-x86_64-570.86.15.run
其中的选项按下图中所示选择(添加了部分提示信息的截图)







- 安装 cuda
./cuda_12.6.3_560.35.05_linux.run

窗口高度调高一点,不然看不着最后一行的输入行. 按下箭头,翻看协议
输入: accept

不勾选 driver(刚才第一步装过了), 按空格或enter 选中/撤销选中

按上下箭头,到 Install, 按 enter 继续

至此,cuda安装完成
- 查看显卡状态
nvidia-smi

确认是 8卡H200, 140G显存
- 配置环境变量
vim /root/.bashrc
添加内容
# CUDA env
export PATH=/usr/local/cuda-12.6/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64:$LD_LIBRARY_PATH

source /root/.bashrc
- 安装 fabric-manager, 并启动服务
rpm -ivh nvidia-fabric-manager-570.86.15-1.x86_64.rpm

启动服务 nvidia-fabricmanager
systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
# 查看服务状态, 按 q 退出
systemctl status nvidia-fabricmanager

- 安装 docker
一起安装
dnf install -y ./containerd.io-.rpm ./docker-ce-.rpm ./docker-ce-cli-*.rpm
一个一个安装(注意顺序)
dnf install containerd.io-1.6.32-3.1.el8.x86_64.rpm
dnf install docker-ce-cli-26.1.3-1.el8.x86_64.rpm
dnf install docker-ce-26.1.3-1.el8.x86_64.rpm
(不再截图)
验证docker版本
docker –version

- 安装 nvidia-container-toolkit
先配置 nvidia 相关的安装包数据源
./Nvidia_Helper

到这一步, ctrl+C 退出, 然后安装 nvidia-container-toolkit
dnf install -y nvidia-container-toolkit

配置docker并重启
nvidia-ctk runtime configure –runtime=docker
systemctl restart docker

nvidia-ctk 会修改 docker 配置 /etc/docker/daemon.json
修改前: 不存在这个配置文件
修改后
{
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
- 验证docker安装
加载验证镜像
docker load -i nvidia_cuda_12.6.2-base-ubuntu22.04.tar
使用镜像验证安装是否成功
docker run –rm –gpus all xxx/nvidia/cuda:12.6.2-base-ubuntu22.04 nvidia-smi
(显示gpu信息即为安装成功)
- (对于多机部署的)配置ssh免密登录
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys
两台机器相互做免密登录,起模型的时候nccl通信会用到
vllm部署deepseek
-
加载镜像(分别为vllm推理引擎和sglang推理引擎)
docker load -i vllm_vllm-openai_v0_7_3.tar
docker load -i lmsysorg_sglang_v0_4_4_post1_cu125.tar -
vllm 启动服务
# 启动主节点容器
# ray, version 2.40.0
docker run -d
--name node_head
--network host
--privileged
--gpus all
--shm-size 10.24g
--entrypoint /bin/bash
-e TP_SOCKET_IFNAME=bond0
-e GLOO_SOCKET_IFNAME=bond0
-e NCCL_SOCKET_IFNAME=bond0
-e NCCL_IB_HCA=mlx5
-e VLLM_HOST_IP=<当前节点ip,作为head节点>
-v /DATA/disk0/models:/root/.cache/huggingface
-v /etc/localtime:/etc/localtime:ro
vllm/vllm-openai:v0.7.3
-c "ray start --block --head --port=6379"
# 启动从节点容器(另外一台机器上)
docker run -d
--name node_worker
--network host
--privileged
--gpus all
--shm-size 10.24g
--entrypoint /bin/bash
-e TP_SOCKET_IFNAME=bond0
-e GLOO_SOCKET_IFNAME=bond0
-e NCCL_SOCKET_IFNAME=bond0
-e NCCL_IB_HCA=mlx5
-e VLLM_HOST_IP=<head节点IP>
-v /DATA/disk0/models:/root/.cache/huggingface
-v /etc/localtime:/etc/localtime:ro
vllm/vllm-openai:v0.7.3
-c "ray start --block --address=<head节点IP>:6379"
进入主节点容器, 启动 vllm 服务
docker exec -it node_head bash
# 启动 vllm 服务
# vllm 0.7.3, Python 3.12.9
nohup vllm serve /root/.cache/huggingface/DeepSeek-R1
--tensor-parallel-size 8
--pipeline-parallel-size 1
--trust-remote-code
--max-model-len 131072
--served-model-name DeepSeek-R1
--gpu-memory-utilization 0.8
--max-num-seqs 512
> /root/.cache/huggingface/logs/"logs_model_service_ds128k_$(date + %Y%m%d_%H%M%S ).log" 2>&1 &
- sglang启动服务
# 启动容器
docker run -d
--network=host
--name sglang
--privileged
--ipc=host
--gpus all
--ulimit memlock=-1
-e SGLANG_SET_CPU_AFFINITY=1
-e TP_SOCKET_IFNAME=bond0
-e NCCL_SOCKET_IFNAME=bond0
-e GLOO_SOCKET_IFNAME=bond0
-v /DATA/disk0/models:/root/.cache/huggingface
lmsysorg/sglang:v0.4.4.post1-cu125
tail -f /dev/null
# 单机8卡,启动sglang
# 日志保存在宿主机目录 /DATA/disk0/models/logs/下,容器中 /root/.cache/huggingface/logs/ 下
# sglang 0.4.4.post1, Python 3.10.12
nohup python3 -m sglang.launch_server
--model-path /root/.cache/huggingface/DeepSeek-R1
--served-model-name DeepSeek-R1
--context-length 131072
--tp 8
--dist-init-addr <主节点IP>:20000
--nnodes 1
--node-rank 0
--trust-remote-code
--host 0.0.0.0
--port 8000
> /root/.cache/huggingface/logs/"logs_model_service_sglang_ds128k_$(date + %Y%m%d_%H%M%S ).log" 2>&1 &
- 访问服务
curl --location http://127.0.0.1:8000/v1/chat/completions
--header Content-Type: application/json
--data {
"model": "DeepSeek-R1",
"stream": false,
"messages": [
{
"role": "user",
"content": "找出2,3,5,7,11,13,15中特殊的一个"
}
]
}

一些指标记录
h200 vllm ds-128k 显存占用:


h200 vllm ds-32k 显存占用:

h200 sglang ds 32k 显存占用

h200 sglang qwq-32b 128k显存占用

注: QwQ-32b是稠密模型,单卡功耗几乎是ds的三倍
一些结论
- h200机器, sglang/vllm引擎, ds16k也需要8卡,无法用7,6,5卡运行(倍数限制),4卡放不下. 8卡可跑128k. 增大上下文长度,显存占用仅少量增加(几十兆),我们还没有测试超长上下文是否会导致显存明显增加.
- h200机器, sglang/vllm引擎, QwQ-32B(128K)单卡可以运行,功耗约是ds单卡的3倍(稠密模型 vs moe模型).
作为对比h20机器,单卡跑不起来QwQ-32B 128K,需要双卡;单卡最多能跑QwQ-32B 32K,64K也需要双卡. - 对于ds,sglang首token耗时远低于vllm(sglang常常比vllm耗时的一半还少), vllm token生成速度略高于sglang(vllm比sglang快约8%)
- 对于ds,H200比H20, token生成耗时几乎只有一半(生成速度快接近1倍), 首token耗时快10%-100%不等
注: 上面的速度评测, 在输入输出均为1000 token,并发在20-50的清苦啊下得出的结论, 不同输入输出长度结论会有较大浮动.


