GPU 软件

使用 vLLM 部署 LLM 推理服务

在干净的环境中安装 PyTorch 和 vLLM,在单张或 8 张 GPU 上启动兼容 OpenAI 的推理端点,再让它作为服务持续运行。

本页内容
  1. 在 Python 环境中安装 PyTorch 和 vLLM
  2. 启动兼容 OpenAI 的服务器
  3. 用 curl 测试 API
  4. 使用 Hugging Face 令牌访问受限模型
  5. 将 vLLM 作为 systemd 服务运行
  6. 替代方案:vllm/vllm-openai 镜像
  7. 保护推理端点
  8. 故障排查

本指南介绍如何在 FullGPU 服务器上用 vLLM 部署大语言模型(LLM)推理服务:创建 Python 环境,安装 PyTorch 和 vLLM,在单张 GPU 上或跨 8 张 GPU 启动兼容 OpenAI 的推理端点,用 curl 进行测试,并将其作为 systemd 服务运行。选择模型之前,请先用显存计算器估算其显存需求。在 BF16 精度下,权重每个参数约占 2 字节,此外还要为 KV 缓存留出空间。

在 Python 环境中安装 PyTorch 和 vLLM

创建环境

uv 创建环境和安装软件包的速度都很快,还能获取操作系统未自带的 Python 版本:

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv venv ~/venvs/vllm --python 3.12
source ~/venvs/vllm/bin/activate

如果改用标准工具,请先运行 sudo apt install -y python3-venv,再运行 python3 -m venv ~/venvs/vllm 和同一条 source 命令。请把 vLLM 放在单独的环境中,与训练代码分开。

安装软件包

uv pip install vllm --torch-backend=auto
python -c "import torch, vllm; print(torch.__version__,
  torch.cuda.is_available(), vllm.__version__)"

您应该会在两个版本号之间看到 True。vLLM 固定了构建时所依赖的 PyTorch 版本,并会自动为您安装,--torch-backend=auto 则让 uv 选择与您的驱动相匹配的 PyTorch 构建版本。不要在此基础上再安装其他 PyTorch 版本。如果是不含 vLLM 的训练环境,可以用同样的方式单独安装 PyTorch:uv pip install torch --torch-backend=auto。如果使用普通的 pip,请运行 pip install vllm。

启动兼容 OpenAI 的服务器

在单张 GPU 上,7B 级模型很适合作为第一次测试:

vllm serve Qwen/Qwen2.5-7B-Instruct \
  --host 127.0.0.1 --port 8000 \
  --max-model-len 16384 \
  --gpu-memory-utilization 0.90

在 8 卡服务器上,用张量并行把更大的模型拆分到所有 GPU 上:

vllm serve Qwen/Qwen2.5-72B-Instruct \
  --host 127.0.0.1 --port 8000 \
  --tensor-parallel-size 8 \
  --max-model-len 32768

首次启动时会下载权重,可能需要一些时间。日志中出现 Application startup complete 时,服务器即已就绪。权重保存在 ~/.cache/huggingface 中;如果要把它们放在 NVMe 数据盘上,请在启动前运行 export HF_HOME=/data/hf。

选项作用
--tensor-parallel-size共同承载该模型的 GPU 数量。它必须能整除模型的注意力头数;对大多数大型模型来说,设为 8 即可。
--max-model-len每个请求的最长上下文(提示词加输出)。如果 vLLM 报告 KV 缓存无法容纳该最大长度,请调低此值。
--gpu-memory-utilization每张 GPU 的显存中,vLLM 可用于权重和 KV 缓存的比例,默认为 0.9。如果有其他进程使用这张 GPU,请调低此值。
--host监听地址。如果不设置,vLLM 会监听所有网络接口,因此请保留 127.0.0.1。

用 curl 测试 API

curl http://127.0.0.1:8000/v1/models

curl http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "Qwen/Qwen2.5-7B-Instruct",
       "messages": [{"role": "user", "content": "Say hello in five words."}],
       "max_tokens": 32}'

第一条请求应列出该模型。第二条请求返回 JSON,回答位于 choices[0].message.content 中。任何兼容 OpenAI 的客户端,只要把 base URL 设置为 http://127.0.0.1:8000/v1 即可使用。在您的笔记本电脑上,可以通过 SSH 隧道访问它:ssh -N -L 8000:127.0.0.1:8000 gpu1。

使用 Hugging Face 令牌访问受限模型

部分模型(例如 Meta 的 Llama 系列)要求您先在 Hugging Face 上接受许可协议。请用您的账户在模型页面上接受协议,创建一个具有读取权限的访问令牌,然后通过 HF_TOKEN 变量传给 vLLM。在提示符下输入令牌,可以避免它留在 shell 历史记录中:

read -rsp 'Hugging Face token: ' HF_TOKEN && export HF_TOKEN
vllm serve meta-llama/Llama-3.1-8B-Instruct \
  --host 127.0.0.1 --port 8000 --max-model-len 16384

如果下载时出现 401 或 403 错误,说明令牌缺失或有误,或者该账户尚未接受许可协议。

将 vLLM 作为 systemd 服务运行

  1. 把设置和机密信息保存在只有 root 可读的文件中。用 openssl rand -hex 32 生成 API 密钥;vLLM 读取 VLLM_API_KEY 的效果,与传入 --api-key 相同。
    sudo mkdir -p /etc/vllm
    sudo tee /etc/vllm/vllm.env >/dev/null <<'EOF'
    HF_HOME=/data/hf
    HF_TOKEN=hf_your_token_here
    VLLM_API_KEY=replace-with-a-long-random-string
    EOF
    sudo chmod 600 /etc/vllm/vllm.env
  2. 创建 /etc/systemd/system/vllm.service。本示例以 root 身份运行,并使用上面创建的环境;如果使用其他用户账户,请相应调整 User 和各个路径:
    [Unit]
    Description=vLLM OpenAI-compatible server
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    User=root
    EnvironmentFile=/etc/vllm/vllm.env
    ExecStart=/root/venvs/vllm/bin/vllm serve Qwen/Qwen2.5-7B-Instruct \
      --host 127.0.0.1 --port 8000 --max-model-len 16384
    Restart=on-failure
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
  3. 启动服务并跟踪日志:
    sudo systemctl daemon-reload
    sudo systemctl enable --now vllm
    sudo journalctl -u vllm -f
    日志中出现 Application startup complete 后,只要加上请求头 -H "Authorization: Bearer YOUR_KEY",前面的 curl 测试就能再次正常运行。不加这个请求头,应返回 401 Unauthorized。该服务会在崩溃后自动重启,并在开机时自动启动。

替代方案:vllm/vllm-openai 镜像

docker run -d --name vllm --gpus all --ipc=host \
  -p 127.0.0.1:8000:8000 \
  -v /data/hf:/data/hf \
  --env-file /etc/vllm/vllm.env \
  vllm/vllm-openai:latest \
  --model Qwen/Qwen2.5-7B-Instruct --max-model-len 16384

该镜像的入口点就是 vLLM 服务器,因此镜像名称之后的参数会直接传给它。环境变量文件设置了 HF_HOME=/data/hf,所以要挂载这个路径。在生产环境中,请固定一个版本标签,不要使用 latest。在 AMD 服务器上,请使用 ROCm 配置中介绍的 ROCm 镜像。

保护推理端点

个人使用时,让 vLLM 只监听 127.0.0.1,并通过 SSH 隧道访问。如果要通过互联网为应用提供服务,请在前面部署带 TLS 的反向代理,要求提供 API 密钥,并且只暴露 /v1/ 路径:API 密钥保护的是 /v1 路由,/metrics 等其他路由可能仍然开放。防火墙指南介绍了 ufw、Docker 发布的端口,以及 Caddy 或 nginx 的配置。关于容量规划和运行成本,请阅读使用 vLLM 自托管 LLM 推理。

故障排查

  • 启动时出现“CUDA out of memory”错误。请调低 --max-model-len,用 --tensor-parallel-size 把模型分布到更多 GPU 上,或者选择更小的模型或量化模型。用 nvidia-smi 确认没有其他进程占用显存。
  • 注意力头数无法被张量并行度整除。请选择能整除模型头数的并行度,例如用 4 代替 8。
  • 401 Unauthorized. 缺少 Authorization 请求头,或者密钥不匹配。

常见问题

用 vLLM 部署 70B 模型需要什么 GPU?

权重在 BF16 精度下约需 140 GB,在 FP8 精度下约需 70 GB,此外还要为 KV 缓存留出空间。一张 H200 能以 FP8 精度从容运行 70B 模型;在 BF16 精度下,单张 H200 只能勉强装下,因此请使用 B200 或 B300,或者用张量并行把模型拆分到多张 GPU 上。

vLLM 能在 AMD Instinct MI355X 服务器上运行吗?

可以。请使用 AMD 提供的支持 ROCm 的 vLLM 镜像,并加上 ROCm 设备参数,具体见我们的 ROCm 配置指南。vllm serve 的选项完全相同。

如何更新 vLLM?

在同一个环境中运行 uv pip install -U vllm --torch-backend=auto,然后重启服务。如果该推理端点承载着生产流量,请先在单独的环境中测试新版本。

问题仍未解决?

请在控制台提交工单,写明服务器、您运行了什么以及错误输出(如有)。工程师 7×24 小时答复。

提交工单

登录 FullGPU

管理您的 GPU 服务器、余额和账单。

首次使用 FullGPU? 创建账户