vllm/sglang部署滿血版deepseek

準(zhǔn)備

硬件(下面其中之一)

  1. 2機(jī)8卡H20
  2. 1機(jī)8卡H200

操作系統(tǒng)版本: CentOS Linux release 8.5.2111

安裝包(部分安裝包為企業(yè)私有,僅做部分參考)

  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

安裝環(huán)境

  1. 安裝驅(qū)動(dòng)
    ./NVIDIA-Linux-x86_64-570.86.15.run

其中的選項(xiàng)按下圖中所示選擇(添加了部分提示信息的截圖)

image.png
image.png
image.png
image.png
image.png
image.png
image.png
  1. 安裝 cuda
    ./cuda_12.6.3_560.35.05_linux.run
image.png

窗口高度調(diào)高一點(diǎn),不然看不著最后一行的輸入行. 按下箭頭,翻看協(xié)議
輸入: accept

image.png

不勾選 driver(剛才第一步裝過(guò)了), 按空格或enter 選中/取消選中

image.png

按上下箭頭,到 Install, 按 enter 繼續(xù)

image.png

至此,cuda安裝完成

  1. 查看顯卡狀態(tài)
    nvidia-smi
image.png

確認(rèn)是 8卡H200, 140G顯存

  1. 配置環(huán)境變量
    vim /root/.bashrc
    添加內(nèi)容
# CUDA env
export PATH=/usr/local/cuda-12.6/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64:$LD_LIBRARY_PATH
image.png

source /root/.bashrc

  1. 安裝 fabric-manager, 并啟動(dòng)服務(wù)
    rpm -ivh nvidia-fabric-manager-570.86.15-1.x86_64.rpm
image.png

啟動(dòng)服務(wù) nvidia-fabricmanager

systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
# 查看服務(wù)狀態(tài), 按 q 退出
systemctl status nvidia-fabricmanager
image.png
  1. 安裝 docker
    一起安裝
    dnf install -y ./containerd.io-.rpm ./docker-ce-.rpm ./docker-ce-cli-*.rpm

一個(gè)一個(gè)安裝(注意順序)
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

(不再截圖)
驗(yàn)證docker版本
docker --version

image.png
  1. 安裝 nvidia-container-toolkit

先配置 nvidia 相關(guān)的安裝包數(shù)據(jù)源

./Nvidia_Helper

image.png

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

image.png

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

image.png

nvidia-ctk 會(huì)修改 docker 配置 /etc/docker/daemon.json
修改前: 不存在這個(gè)配置文件
修改后

{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}
  1. 驗(yàn)證docker安裝

加載驗(yàn)證鏡像
docker load -i nvidia_cuda_12.6.2-base-ubuntu22.04.tar
使用鏡像驗(yàn)證安裝是否成功
docker run --rm --gpus all xxx/nvidia/cuda:12.6.2-base-ubuntu22.04 nvidia-smi
(顯示gpu信息即為安裝成功)

  1. (對(duì)于多機(jī)部署的)配置ssh免密登錄
    ssh-keygen -t rsa
    vi ~/.ssh/authorized_keys
    兩臺(tái)機(jī)器相互做免密登錄,起模型的時(shí)候nccl通信會(huì)用到

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 啟動(dòng)服務(wù)

# 啟動(dòng)主節(jié)點(diǎn)容器
# 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=<當(dāng)前節(jié)點(diǎn)ip,作為head節(jié)點(diǎn)> \
    -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"

# 啟動(dòng)從節(jié)點(diǎn)容器(另外一臺(tái)機(jī)器上)
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節(jié)點(diǎn)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節(jié)點(diǎn)IP>:6379"

進(jìn)入主節(jié)點(diǎn)容器, 啟動(dòng) vllm 服務(wù)

docker exec -it node_head bash

# 啟動(dòng) vllm 服務(wù)
# 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啟動(dòng)服務(wù)
# 啟動(dòng)容器
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

# 單機(jī)8卡,啟動(dòng)sglang
# 日志保存在宿主機(jī)目錄 /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 <主節(jié)點(diǎn)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. 訪問(wèn)服務(wù)
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中特殊的一個(gè)"
    }
  ]
}'
image.png

一些指標(biāo)記錄

h200 vllm ds-128k 顯存占用:


image.png

image.png

h200 vllm ds-32k 顯存占用:


image.png

h200 sglang ds 32k 顯存占用


image.png

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


image.png

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

一些結(jié)論

  1. h200機(jī)器, sglang/vllm引擎, ds16k也需要8卡,無(wú)法用7,6,5卡運(yùn)行(倍數(shù)限制),4卡放不下. 8卡可跑128k. 增大上下文長(zhǎng)度,顯存占用僅少量增加(幾十兆),我們還沒(méi)有測(cè)試超長(zhǎng)上下文是否會(huì)導(dǎo)致顯存明顯增加.
  2. h200機(jī)器, sglang/vllm引擎, QwQ-32B(128K)單卡可以運(yùn)行,功耗約是ds單卡的3倍(稠密模型 vs moe模型).
    作為對(duì)比h20機(jī)器,單卡跑不起來(lái)QwQ-32B 128K,需要雙卡;單卡最多能跑QwQ-32B 32K,64K也需要雙卡.
  3. 對(duì)于ds,sglang首token耗時(shí)遠(yuǎn)低于vllm(sglang常常比vllm耗時(shí)的一半還少), vllm token生成速度略高于sglang(vllm比sglang快約8%)
  4. 對(duì)于ds,H200比H20, token生成耗時(shí)幾乎只有一半(生成速度快接近1倍), 首token耗時(shí)快10%-100%不等

注: 上面的速度評(píng)測(cè), 在輸入輸出均為1000 token,并發(fā)在20-50的清苦啊下得出的結(jié)論, 不同輸入輸出長(zhǎng)度結(jié)論會(huì)有較大浮動(dòng).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容