最近,大語言模型(LLM)的部署已經(jīng)成為 AI 開發(fā)者繞不開的核心技能。而 VLLM 作為一款高性能、低延遲的推理引擎,在大模型推理領(lǐng)域迅速崛起。今天,我就帶大家從零開始,在 Ubuntu 22.04 + RTX 4090 + Docker 環(huán)境下,部署 DeepSeek模型,并讓它跑起來!
這篇文章適合那些想快速上手 vLLM 的開發(fā)者,文章涵蓋了顯卡驅(qū)動、CUDA、Docker 環(huán)境的安裝,以及 vLLM 的完整運行流程。讓我們開始吧!
什么是 VLLM?
VLLM(Very Large Language Model Inference)是一個 高性能、優(yōu)化顯存管理 的大模型推理引擎。它的目標是 最大化推理吞吐量,并降低顯存消耗,讓大語言模型(LLMs)在 單卡或多 GPU 服務(wù)器 上運行得更高效。
VLLM 的核心優(yōu)勢:
高吞吐量:支持批量推理,減少 token 生成延遲,高效 KV
緩存管理:優(yōu)化 GPU 顯存,支持 更長的上下文
多 GPU 支持:Tensor Parallel 加速推
OpenAI API 兼容:可以作為 本地 API 服務(wù)器 運行
環(huán)境準備
在正式部署 VLLM 之前,我們需要先確保機器環(huán)境可用,包括 顯卡驅(qū)動、CUDA、Docker 等核心組件。
01、確保系統(tǒng)環(huán)境
我們使用 Ubuntu 22.04,建議先更新系統(tǒng)并重啟系統(tǒng):
sudo?apt update && sudo apt upgrade -y
sudo reboot
02、安裝 NVIDIA 顯卡驅(qū)動
在 Ubuntu 22.04 中,禁用原有的 GPU 驅(qū)動(尤其是默認的 nouveau 驅(qū)動或已安裝的舊版 NVIDIA 驅(qū)動)非常重要,以避免與新的 NVIDIA 驅(qū)動 發(fā)生沖突。執(zhí)行如下命令禁用原有GPU驅(qū)動后,重啟系統(tǒng)。
sudo?tee?/etc/modprobe.d/blacklist-nouveau.conf <<EOF
blacklist nouveau
options nouveau modeset=0
EOF
sudo update-initramfs -u
執(zhí)行上面命令后,重啟系統(tǒng):
sudo?reboot
重啟后,執(zhí)行如下命令安裝推薦的 NVIDIA 驅(qū)動:(以 RTX 4090 為例)
sudo?apt install -y nvidia-driver-535
安裝完后 NVIDIA 驅(qū)動后,進行重啟:
sudo?reboot
然后再次運行 nvidia-smi,如果能正確顯示顯卡信息,就說明驅(qū)動安裝成功。
03、安裝 CUDA
VLLM 需要 GPU 加速,而 CUDA 是核心庫之一。我們使用 CUDA 12.1(推薦版本):
wget?https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo?dpkg -i cuda-keyring_1.0-1_all.deb
sudo?apt update
sudo?apt install -y cuda-toolkit-12-1
驗證 CUDA 是否正確安裝:
nvcc?--version
04、安裝 cuDNN
cuDNN 是深度學(xué)習(xí)加速庫,我們執(zhí)行如下命令安裝cuDNN:
wget?https://developer.download.nvidia.com/compute/cudnn/9.8.0/local_installers/cudnn-local-repo-ubuntu2204-9.8.0_1.0-1_amd64.deb
sudo?dpkg -i cudnn-local-repo-ubuntu2204-9.8.0_1.0-1_amd64.deb
sudo?cp /var/cudnn-local-repo-ubuntu2204-9.8.0/cudnn-*-keyring.gpg /usr/share/keyrings/
sudo?apt-get update
sudo?apt-get -y install cudnn
05、安裝Docker
執(zhí)行下面命令,安裝Docker:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo?chmod?a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo?
??"deb [arch=$(dpkg --print-architecture)?signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu
??$(. /etc/os-release && echo?"${UBUNTU_CODENAME:-$VERSION_CODENAME}")?stable" |
? sudo?tee?/etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get?install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
執(zhí)行如下命令,運行Docker:
sudo?systemctl start docker
06、安裝NVIDIA Container Toolkit
NVIDIA Container Toolkit?是一款用于在容器化環(huán)境中高效運行 GPU 加速應(yīng)用 的工具,通常與 Docker 配合使用,能夠讓開發(fā)者將基于 NVIDIA GPU 的應(yīng)用程序打包到容器中并在支持 NVIDIA GPU 的服務(wù)器上運行。NVIDIA Container Toolkit?使得我們可以 在容器內(nèi)使用 GPU,實現(xiàn)高效的并行計算,特別適用于 深度學(xué)習(xí)、高性能計算(HPC) 和 圖形渲染 等任務(wù)。
NVIDIA Container Toolkit本質(zhì)上是一個為 NVIDIA GPU 提供容器化支持的工具包,它能讓 Docker 容器直接訪問 GPU 資源,而無需繁瑣的配置。
執(zhí)行如下命令,安裝NVIDIA Container Toolkit:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
? && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list |
? ? sed?'s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g'?|
? ? sudo?tee?/etc/apt/sources.list.d/nvidia-container-toolkit.list
sed?-i?-e '/experimental/?s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get?update
sudo apt-get?install?-y nvidia-container-toolkit
安裝完成后,對Docker進行配置并重啟Docker:
sudo?nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
07、拉取VLLM鏡像
執(zhí)行如下命令安裝VLLM鏡像:
docker pull vllm/vllm-openai
08、下載模型
我們本次使用模型:DeepSeek-R1-Distill-Qwen-7B進行測試,模型下載頁面:https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B如果你下載不了,請使用鏡像網(wǎng)站進行下載:
你也可以使用如下命令進行下載:
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-7B --local-dir ?/root/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
/root/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B:為下載模型存儲路徑,依據(jù)實際情況自己定義。
運行模型
我們使用docker compose進行VLLM鏡像運行,文件如下:
version:?'3.9'
services:
? vllm_service:
? ? image: vllm/vllm-openai:latest
? ? container_name: vllm_deepseek_7b
? ? restart: always
? ? deploy:
? ? ? resources:
? ? ? ? reservations:
? ? ? ? ? devices:
? ? ? ? ? ? - driver: nvidia
? ? ? ? ? ? ? count: all
? ? ? ? ? ? ? capabilities: [gpu]
? ? ports:
? ? ? -?"8000:8000"
? ? volumes:
? ? ? - /root/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B:/app/model
? ??command: [
? ? ??"--served-model-name",?"DeepSeek-R1:7b",
? ? ??"--trust-remote-code",
? ? ??"--enforce-eager",
? ? ??"--gpu-memory-utilization",?"0.8",
? ? ??"--model",?"/app/model/",
? ? ??"--host",?"0.0.0.0",
? ? ??"--port",?"8000",
? ? ??"--max-model-len",?"10000",
? ? ??"--api-key",?"12345678",
? ? ??"--tokenizer",?"/app/model/"
? ? ]
下面是 VLLM 容器啟動時傳入的命令參數(shù):
--served-model-name "DeepSeek-R1:7b"
設(shè)置模型名稱為 DeepSeek-R1:7b。這是在容器內(nèi)加載的模型名稱。
--trust-remote-code
允許容器信任遠程代碼執(zhí)行。這在使用外部模型時很有用,但在安全性較為敏感的情況下需謹慎使用。
--enforce-eager
啟用急切執(zhí)行模式(Eager Execution)。在某些情況下,急切執(zhí)行模式可以幫助調(diào)試和查看模型的每個操作的結(jié)果。
--gpu-memory-utilization "0.8"
指定容器使用 GPU 顯存的比例。在此配置中,0.8 表示容器將使用 GPU 顯存的 80%。
--model "/app/model/"
指定模型文件的位置,即掛載到容器中的 /app/model/ 目錄。這個路徑將指向你的 DeepSeek 模型。
--host "0.0.0.0"
設(shè)置容器的綁定地址為 0.0.0.0,這意味著容器將接受來自所有 IP 地址的請求。
--port "8000"
設(shè)置容器服務(wù)監(jiān)聽的端口為 8000,也就是你通過 localhost:8000 或宿主機的 IP 地址和端口來訪問該容器提供的 API 服務(wù)。
--max-model-len "10000"
該參數(shù)設(shè)置模型能夠處理的最大輸入文本長度,通常這個值的設(shè)置需要根據(jù)模型和任務(wù)的需求來進行調(diào)節(jié)。
--api-key "12345678"
設(shè)置訪問 API 的密鑰,這個密鑰通常用于驗證客戶端請求的合法性和安全性。你可以將其替換為實際的 API 密鑰。
--tokenizer "/app/model/"
設(shè)置 分詞器 的路徑,在這里,分詞器位于 /app/model/ 目錄下,這個目錄包含了模型的相關(guān)資源文件,包括分詞器。
其它參數(shù)可參考官方說明。
VLLM在多張GPU上運行
在運行 vLLM 時,使用 --tensor-parallel-size 參數(shù)指定 GPU 數(shù)量。例如,如果你有 2 張 RTX 4090,可以這樣運行:
只需在上面的命令中加入:
"--tensor-parallel-size",?"2"
這樣,VLLM 會自動將計算任務(wù)拆分到 2 張顯卡上。你可以通過 nvidia-smi 觀察顯存占用情況。如果你有 4 張 GPU,可以將 --tensor-parallel-size 設(shè)為 4,以獲得更高的計算吞吐量。
KV 緩存優(yōu)化
在 Transformer 結(jié)構(gòu)中,每次生成新 token 時,模型需要重新計算所有之前的 token(自回歸推理)。這會導(dǎo)致長文本推理速度越來越慢。KV 緩存(Key-Value Cache) 是一種優(yōu)化策略,它將計算過的 Key(鍵)和 Value(值)存儲起來,避免重復(fù)計算,從而加速推理。
vLLM 的 Paged KV 緩存
vLLM 采用了一種 Paged KV 緩存 技術(shù),相比傳統(tǒng)的 KV 緩存,它能更高效地管理顯存,避免顯存碎片化,提高推理效率。
特點:
動態(tài)分配內(nèi)存 —— 僅在需要時分配緩存,減少不必要的顯存占用
支持流式生成 —— 適用于長文本對話,避免顯存溢出
減少重復(fù)計算 —— 加快推理速度,特別適用于長文本生成
開啟 KV 緩存優(yōu)化
vLLM 默認開啟 KV 緩存,但如果要手動調(diào)整 KV 緩存的大小,可以使用 --max-num-batched-tokens 參數(shù)。如果你的模型處理長文本較多,建議調(diào)大 --max-num-batched-tokens,但要注意 GPU 顯存的使用情況。
VLLM 常用參數(shù)簡介
參數(shù)類別 | 關(guān)鍵參數(shù) | 作用 |
---|---|---|
核心設(shè)置 | --model 、--tensor-parallel-size |
選擇模型 & 多 GPU 并行 |
顯存管理 | --gpu-memory-utilization 、--dtype |
控制顯存占用 |
推理優(yōu)化 | --max-num-batched-tokens 、--enable-kv-cache |
提高吞吐量 & KV 緩存優(yōu)化 |
API 服務(wù)器 | --port 、--host |
控制 vLLM API 監(jiān)聽地址 |
輸出控制 | --max-tokens 、--temperature |
控制輸出質(zhì)量 |
如果你在使用 VLLM 過程中遇到?顯存溢出(OOM)?或?推理速度慢?的問題,可以嘗試調(diào)整:
降低?--max-num-batched-tokens
調(diào)整?--gpu-memory-utilization
(一般設(shè)為 0.85~0.95)使用?--dtype float16
?減少顯存占用在多 GPU 服務(wù)器上增加?--tensor-parallel-size