vllm/sglang部署满血版deepseek

内容分享3周前发布
0 0 0

准备

硬件(下面其中之一)

  1. 2机8卡H20
  2. 1机8卡H200

操作系统版本: CentOS Linux release 8.5.2111

安装包(部分安装包为企业私有,仅做部分参考)

  1. NVIDIA-Linux-x86_64-570.86.15.run
  2. cuda_12.6.3_560.35.05_linux.run
  3. nvidia-fabric-manager-570.86.15-1.x86_64.rpm
  4. containerd.io-1.6.32-3.1.el8.x86_64.rpm
  5. docker-ce-26.1.3-1.el8.x86_64.rpm
  6. docker-ce-cli-26.1.3-1.el8.x86_64.rpm
  7. 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

安装环境

  1. 安装驱动
    ./NVIDIA-Linux-x86_64-570.86.15.run

其中的选项按下图中所示选择(添加了部分提示信息的截图)

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

至此,cuda安装完成

  1. 查看显卡状态
    nvidia-smi

vllm/sglang部署满血版deepseek

确认是 8卡H200, 140G显存

  1. 配置环境变量
    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

vllm/sglang部署满血版deepseek

source /root/.bashrc

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

vllm/sglang部署满血版deepseek

启动服务 nvidia-fabricmanager

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

vllm/sglang部署满血版deepseek

  1. 安装 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

vllm/sglang部署满血版deepseek

  1. 安装 nvidia-container-toolkit

先配置 nvidia 相关的安装包数据源

./Nvidia_Helper

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

nvidia-ctk 会修改 docker 配置 /etc/docker/daemon.json
修改前: 不存在这个配置文件
修改后

{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

  1. 验证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信息即为安装成功)

  1. (对于多机部署的)配置ssh免密登录
    ssh-keygen -t rsa
    vi ~/.ssh/authorized_keys
    两台机器相互做免密登录,起模型的时候nccl通信会用到

vllm部署deepseek

  1. 加载镜像(分别为vllm推理引擎和sglang推理引擎)
    docker load -i vllm_vllm-openai_v0_7_3.tar
    docker load -i lmsysorg_sglang_v0_4_4_post1_cu125.tar

  2. 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 &

  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 &

  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中特殊的一个"
    }
  ]
} 

vllm/sglang部署满血版deepseek

一些指标记录

h200 vllm ds-128k 显存占用:

vllm/sglang部署满血版deepseek

vllm/sglang部署满血版deepseek

h200 vllm ds-32k 显存占用:

vllm/sglang部署满血版deepseek

h200 sglang ds 32k 显存占用

vllm/sglang部署满血版deepseek

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

vllm/sglang部署满血版deepseek

注: QwQ-32b是稠密模型,单卡功耗几乎是ds的三倍

一些结论

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

注: 上面的速度评测, 在输入输出均为1000 token,并发在20-50的清苦啊下得出的结论, 不同输入输出长度结论会有较大浮动.

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...