準(zhǔn)備
硬件(下面其中之一)
- 2機(jī)8卡H20
- 1機(jī)8卡H200
操作系統(tǒng)版本: CentOS Linux release 8.5.2111
安裝包(部分安裝包為企業(yè)私有,僅做部分參考)
- 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
安裝環(huán)境
- 安裝驅(qū)動(dòng)
./NVIDIA-Linux-x86_64-570.86.15.run
其中的選項(xiàng)按下圖中所示選擇(添加了部分提示信息的截圖)







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

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

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

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

至此,cuda安裝完成
- 查看顯卡狀態(tài)
nvidia-smi

確認(rèn)是 8卡H200, 140G顯存
- 配置環(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

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

啟動(dòng)服務(wù) nvidia-fabricmanager
systemctl enable nvidia-fabricmanager
systemctl start nvidia-fabricmanager
# 查看服務(wù)狀態(tài), 按 q 退出
systemctl status nvidia-fabricmanager

- 安裝 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

- 安裝 nvidia-container-toolkit
先配置 nvidia 相關(guān)的安裝包數(shù)據(jù)源
./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 會(huì)修改 docker 配置 /etc/docker/daemon.json
修改前: 不存在這個(gè)配置文件
修改后
{
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
- 驗(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信息即為安裝成功)
- (對(duì)于多機(jī)部署的)配置ssh免密登錄
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys
兩臺(tái)機(jī)器相互做免密登錄,起模型的時(shí)候nccl通信會(huì)用到
vllm部署deepseek
加載鏡像(分別為vllm推理引擎和sglang推理引擎)
docker load -i vllm_vllm-openai_v0_7_3.tar
docker load -i lmsysorg_sglang_v0_4_4_post1_cu125.tarvllm 啟動(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 &
- 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 &
- 訪問(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è)"
}
]
}'

一些指標(biāo)記錄
h200 vllm ds-128k 顯存占用:


h200 vllm ds-32k 顯存占用:

h200 sglang ds 32k 顯存占用

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

注: QwQ-32b是稠密模型,單卡功耗幾乎是ds的三倍
一些結(jié)論
- 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)致顯存明顯增加.
- 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也需要雙卡. - 對(duì)于ds,sglang首token耗時(shí)遠(yuǎn)低于vllm(sglang常常比vllm耗時(shí)的一半還少), vllm token生成速度略高于sglang(vllm比sglang快約8%)
- 對(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).