📌 新手提示:本文定位"进阶一档"——目标读者是已会调 API、想把自己的开源模型部署成服务的学生与开发者。命令全部可直接复制;文末脚本自动装环境、下载模型、启动服务。
前言
上一篇 Ollama 教程解决了"把 AI 跑在个人电脑上"——但真实的生产环境(网站、公司服务)用的是另一类工具,其中的公认主力是 vLLM(GitHub 4 万+ 星,UC Berkeley 发起)。
一句话理解 vLLM:
Ollama 是单机玩具,vLLM 是生产引擎。它把开源大模型(Qwen、DeepSeek、Llama…)变成高性能 API 服务——吞吐量比朴素推理高一个数量级,同时把显存利用压榨到极致(官方特性:PagedAttention 连续批处理、KV 缓存复用)。
用官网定位:“Easy, fast, and cheap LLM serving for everyone”(人人可用的又好又快又省的大模型服务)。
本文基于官方快速开始(https://docs.vllm.ai,海外站点国内访问需科学上网)编写,走完四步:装 vLLM → 离线批量推理 → 一条命令起 OpenAI 兼容服务 → 用任意代码调用它。
一、安装(两条命令)
vLLM 是 Python 包,官方推荐用 uv 建干净环境(uv 是新一代 Python 工具):
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto
你没装 uv?
curl -LsSf https://astral.sh/uv/install.sh | sh一行装(官方方式)。不想用 uv,pip install vllm也行,但官方把 uv 列为推荐——因为它快且环境干净。安装 vLLM 会拉 PyTorch 等大依赖(几百 MB~2GB),慢是正常的;国内可加
-i https://pypi.tuna.tsinghua.edu.cn/simple走清华镜像。
硬件底线:vLLM 依赖 GPU(NVIDIA 显卡,CUDA)。没有 GPU 的同学依然值得读完——上半篇的"为什么用 vLLM"与代码逻辑通用,且 vLLM 也支持 CPU 推理(慢);而 GPU 服务器本身在国内云厂商都有(按小时计费)。
二、离线批量推理(先确认装好了)
官方示例:一次给多个问题,批量出结果(跑通 = 安装成功):
from vllm import LLM, SamplingParams
prompts = [
"Hello, my name is",
"The future of AI is",
"上海的简称是", # 中文也可以
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
llm = LLM(model="facebook/opt-125m") # 125M 参数的小模型,秒下载秒跑,用于验证
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(output.outputs[0].text)
要点:
LLM(model=...):加载模型(首次会从模型仓库下载权重)SamplingParams:采样参数——temperature(随机性,0 保守 / 1 有创意)、top_p(截断采样)llm.generate(多组 prompt):一批一起算,这就是"离线批处理"——吞吐量远高于逐个调用
三、一条命令起服务(核心,重点)
要上线给人用,用 vllm serve(命令式部署,OpenAI 兼容):
vllm serve Qwen/Qwen2.5-1.5B-Instruct
- 模型名字是 Hugging Face(HF)格式:
组织名/模型名,首次自动下载(权重保存于~/.cache/huggingface,约 3GB) - 默认监听
http://localhost:8000,自带 OpenAI 兼容端点:/v1/models、/v1/completions、/v1/chat/completions——官方原话:“可作为 OpenAI API 的直接替代”
验证服务活着:
curl http://localhost:8000/v1/models
然后用你见过的 openai SDK 直接调(换 base_url 大法又双叒来了——和本站 DeepSeek/Ollama 篇同一个套路):
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY", # 本地服务默认不校验 Key
)
resp = client.chat.completions.create(
model="Qwen/Qwen2.5-1.5B-Instruct",
messages=[{"role": "user", "content": "你好!你是谁?"}],
)
print(resp.choices[0].message.content)
这就是 vLLM 最大的价值:你的业务代码(已经按 OpenAI 格式写的)一行不用改,把 base_url 指向 vLLM 就切换到自托管模型。
常用启动参数
| 参数 | 作用 | 示例 |
|---|---|---|
--host / --port | 监听地址与端口 | --host 0.0.0.0 --port 8000(对外开放时用;只信任的局域网/加了鉴权再开公网) |
--api-key 或环境变量 VLLM_API_KEY | 启用请求鉴权(强烈建议对外暴露时开启) | --api-key your-secret |
--max-model-len | 限制上下文长度(超长显存不足时调小) | --max-model-len 8192 |
四、国内下载模型:ModelScope 一行切换
vLLM 默认从 Hugging Face 下载权重——国内访问 HF 不稳定。官方支持一键切到 ModelScope(阿里系国内模型库):
export VLLM_USE_MODELSCOPE=True
vllm serve Qwen/Qwen2.5-1.5B-Instruct
同一个模型,ModelScope 上国内直连下载,速度天壤之别。文末一键脚本已内置这步(国内网络自动开启)。
五、从"玩具"到"生产":三条必改
- 加鉴权:对外开放的
vllm serve --api-key xxx(或设VLLM_API_KEY),否则任何能访问到你端口的人都在白嫖你的 GPU - 端口只对需要的人开:默认
localhost不对外;真要局域网/公网访问,配好防火墙 - 监控显存与并发:
nvidia-smi看显存/GPU 利用率;并发打满时官方参数有--max-num-seqs等,按需调
六、本地部署 vs 云端 API:给新手的话
vLLM 适合:性能敏感(你自己的业务定制推理管线)、数据不出内网、算力成本可控的场景。
但对你个人而言,往往更划算的选择是直接用云端 API:
| 维度 | 自建 vLLM(需 GPU) | 云端 API |
|---|---|---|
| 前期成本 | 显卡/服务器(几千元起) | 注册即用,按 token 计费 |
| 运维 | 自己管 CUDA/显存/并发 | 服务商管 |
| 模型自由 | 任意开源模型 | 取决于服务商(中转站 90+ 模型可选) |
| 稳定性 | 自求多福 | 多上游负载均衡 |
注意:vLLM 和 OpenAI 兼容中转站是同一套协议——你在 vLLM 上调试好的 OpenAI 格式代码,把 base_url 换成中转站地址(如云间 API 中转站 https://cloudzone-api.cyou/ 的 OpenAI 兼容端点),即可直接调用 GPT / Claude / DeepSeek / GLM 等云端模型做效果对比。先云端验证效果,再决定要不要自建,是最不浪费钱的路径。文末脚本配模型中会给你完整的 Y/N 选择。
尾声
你现在的部署技能树已经闭环了:Ollama(个人电脑本地跑)→ vLLM(GPU 服务器生产部署)→ 云端 API(省心省力)。三者都讲 OpenAI 兼容,技能互相迁移。
建议下一步:把 vLLM 起起来后,用本站《提示词工程实战》的模板写个 chat 脚本,体验"自托管 + OpenAI 兼容"的完整链路。如果只是想要效果,直接云间 API(https://cloudzone-api.cyou/)一把 Key 现用,等真有私有化需求再上 vLLM——别让部署成了负担。
附:一键部署脚本
不方便下载的同学可以直接复制下方完整源码,新建文本文档粘贴后改后缀为 .sh(macOS/Linux/WSL)或 .ps1(Windows)运行。也可以下载现成文件:
- 下载
install-vllm.sh(macOS / Linux / WSL):https://cleanresolver.com/scripts/install-vllm.sh - 下载
install-vllm.ps1(Windows):https://cleanresolver.com/scripts/install-vllm.ps1
提示:vLLM 需要 NVIDIA GPU。Windows 用户请在 WSL 里跑(NVIDIA 官方驱动支持 WSL CUDA);没有 GPU 的机器脚本会给出明确提示。
macOS / Linux / WSL(.sh)
#!/usr/bin/env bash
set -u
# ============================================================
# vLLM 生产级部署 一键脚本(macOS / Linux / WSL)
# 公开源码,欢迎审查 —— 不放心可先复制给 AI 判断
# 前置:NVIDIA GPU + CUDA(无 GPU 也可装,CPU 推理较慢)
# 国内自动开启 ModelScope 模型源
# ============================================================
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step() { echo -e "${CYAN}[STEP]${NC} $1"; }
detect_network() {
step "检测网络环境(国内 / 国外)..."
if curl -fsI --max-time 5 "https://claude.ai" >/dev/null 2>&1; then
info "可直连 claude.ai,判定为海外网络"
echo "overseas"
else
warn "无法直连 claude.ai,判定为国内网络环境(将自动切换国内镜像 + ModelScope 模型源)"
echo "domestic"
fi
}
check_gpu() {
step "检查 GPU 环境..."
if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi -L >/dev/null 2>&1; then
info "检测到 NVIDIA GPU:"
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null | head -3
return 0
fi
warn "未检测到 NVIDIA GPU(nvidia-smi 不可用)。vLLM 仍可安装,但推理走 CPU 会明显更慢。"
echo " · 有独显的笔记本/服务器请先装好 NVIDIA 驱动(命令 nvidia-smi 能输出即 OK)"
echo " · Windows 用户请在 WSL 中运行本脚本(NVIDIA 官方支持 WSL CUDA)"
echo " · 没有 GPU 也可以继续(CPU 模式),或考虑用云端 API 更快"
return 1
}
check_python312() {
step "检查 Python 3.12..."
local found=""
for p in python3.12 python3 python3.13; do
if command -v "$p" >/dev/null 2>&1 && "$p" --version 2>&1 | grep -qE "3\.(12|13)"; then
found="$p"; break
fi
done
if [ -n "$found" ]; then
PY="$found"; info "使用 $PY:$($PY --version 2>&1)"; return 0
fi
error "需要 Python 3.12+。请先安装(https://www.python.org/downloads/ 或 distro 包管理器)。"
return 1
}
setup_and_install() {
local net="$1"
step "创建虚拟环境并安装 vLLM(依赖较大,可能耗时 5-15 分钟,可耐心等或先干别的)..."
mkdir -p vllm-serve && cd vllm-serve || return 1
$PY -m venv .venv 2>/dev/null || { error "创建虚拟环境失败"; return 1; }
# shellcheck disable=SC1091
source .venv/bin/activate || { warn "激活虚拟环境失败,继续使用系统环境"; }
local pypi="https://pypi.org/simple"
if [ "$net" = "domestic" ]; then
pypi="https://pypi.tuna.tsinghua.edu.cn/simple"
fi
step "安装 vllm(清华镜像优先,失败回退官方源)..."
if pip install "vllm" -i "$pypi" --timeout 120 >/dev/null 2>&1; then
info "vLLM 安装成功"
return 0
fi
warn "镜像源安装失败,改用官方源重试(依赖较多请耐心)..."
if pip install "vllm" --timeout 120 >/dev/null 2>&1; then
info "vLLM 安装成功(官方源)"
return 0
fi
error "vLLM 安装失败。常见原因与处理:"
echo " 1. 内存不足:vLLM + PyTorch 安装需要 8GB+ 内存,请关掉其他程序"
echo " 2. Python 版本不匹配:要求 3.12+(当前 $($PY --version 2>&1))"
echo " 3. 网络问题:手动执行 python3 -m pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple"
return 1
}
start_service() {
step "生成启动脚本与用法说明(模型下载走 ModelScope 可选)..."
cat > start.sh <<'SHEOF'
#!/usr/bin/env bash
# vLLM 启动示例(模型按需改):
# 国内(ModelScope 源):VLLM_USE_MODELSCOPE=True ./start.sh
# 海外(Hugging Face 源):./start.sh
set -e
cd "$(dirname "$0")"
if [ -f .venv/bin/activate ]; then source .venv/bin/activate; fi
export VLLM_USE_MODELSCOPE=${VLLM_USE_MODELSCOPE:-False}
# 首个模型可换成任意 HF/ModelScope 模型名,如 Qwen/Qwen2.5-1.5B-Instruct、deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
vllm serve Qwen/Qwen2.5-1.5B-Instruct --port 8000
SHEOF
chmod +x start.sh
cat > test_client.py <<'PYEOF'
"""调用本地 vLLM 服务的 OpenAI 兼容客户端(和服务起好后另开终端运行)"""
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
resp = client.chat.completions.create(
model="Qwen/Qwen2.5-1.5B-Instruct",
messages=[{"role": "user", "content": "你好!用一句话介绍你自己。"}],
)
print(resp.choices[0].message.content)
PYEOF
info "已生成 vllm-serve/start.sh 与 vllm-serve/test_client.py"
}
main() {
echo "============================================"
echo " vLLM 生产级部署 一键脚本"
echo " 适用于 macOS / Linux / WSL"
echo "============================================"
echo ""
local NET
NET=$(detect_network)
if [ "$NET" = "domestic" ]; then
export VLLM_USE_MODELSCOPE=True
info "已启用 ModelScope 模型源(VLLM_USE_MODELSCOPE=True),国内下载模型快"
fi
check_gpu || warn "继续安装(CPU 模式可跑但慢;想省事可在文末考虑云端 API 路线)"
if ! check_python312; then exit 1; fi
if ! setup_and_install "$NET"; then
error "环境准备失败,脚本终止。请按上方提示手动处理后重跑。"
exit 1
fi
start_service
echo ""
echo "============================================"
info "全部完成!"
echo " 启动服务: cd vllm-serve && VLLM_USE_MODELSCOPE=True ./start.sh"
echo " 验证服务: curl http://localhost:8000/v1/models"
echo " 测试调用: 另开终端 cd vllm-serve && source .venv/bin/activate && python test_client.py"
echo " 换模型: 编辑 start.sh 里 vllm serve 的模型名"
echo ""
echo " 想省 GPU/精力:云端 OpenAI 兼容 API(如 https://cloudzone-api.cyou/,90+ 模型按量计费)"
echo "============================================"
}
main "$@"
Windows(.ps1)
本脚本面向 WSL 或 Linux 环境(vLLM 官方不支持 Windows 原生运行)。Windows 用户请先在 WSL 中执行 .sh 版本。
# ============================================================
# vLLM 生产级部署 一键脚本(Windows PowerShell 引导器)
# 公开源码,欢迎审查 -- 不放心可先复制给 AI 判断
# 说明:vLLM 官方不支持 Windows 原生运行,本脚本检测 WSL,
# 并把 Linux 安装脚本送入 WSL 内执行(一站式完成)。
# ============================================================
$ErrorActionPreference = "Stop"
function Write-Info { Write-Host "[INFO] $args" -ForegroundColor Green }
function Write-Warn { Write-Host "[WARN] $args" -ForegroundColor Yellow }
function Write-Err { Write-Host "[ERROR] $args" -ForegroundColor Red }
function Write-Step { Write-Host "[STEP] $args" -ForegroundColor Cyan }
# 1. 检测 WSL
Write-Step "检查 WSL 环境..."
if (-not (Get-Command wsl -ErrorAction SilentlyContinue)) {
Write-Err "未找到 wsl 命令。请先安装 WSL:"
Write-Host " PowerShell(管理员)执行:wsl --install"
Write-Host " 重启后安装 Ubuntu 发行版,再运行本脚本。"
exit 1
}
try {
$wslHome = (wsl -e sh -c 'echo $HOME' 2>$null).Trim()
} catch {
$wslHome = "/root"
}
if ([string]::IsNullOrWhiteSpace($wslHome)) { $wslHome = "/root" }
Write-Info "WSL 主目录:$wslHome"
Write-Host "如下载到安装包请放在 Windows 侧,通过 /mnt/c/ 路径访问。"
# 2. 询问是否继续(vLLM 依赖 NVIDIA GPU)
Write-Host ""
Write-Host "vLLM 需要 NVIDIA GPU(在 WSL 里沿用 Windows 驱动,开箱即用)。"
Write-Host "没有 GPU 也可以装(CPU 模式慢),或用云端 OpenAI 兼容 API(如 https://cloudzone-api.cyou/)更省事。"
$continue = Read-Host "继续安装 vLLM?[Y/N]"
if ($continue -ne "Y" -and $continue -ne "y") {
Write-Info "已选择跳过。需要时重新运行本脚本即可。"
exit 0
}
# 3. 把 Linux 脚本注入 WSL 并执行
Write-Step "将安装脚本注入 WSL 并执行(首次执行会在 WSL 内安装 Python 3.12 依赖,耗时较长)..."
$scriptPath = Join-Path $env:TEMP "install-vllm-wsl.sh"
if (-not (Test-Path $scriptPath)) {
Write-Warn "未找到同目录的 install-vllm.sh,请将本 .ps1 与 install-vllm.sh 放在同一目录后重跑。"
Write-Host "(或者手动在 WSL 中执行:curl -fsSL https://cleanresolver.com/scripts/install-vllm.sh -o /tmp/install-vllm.sh && bash /tmp/install-vllm.sh)"
exit 1
}
$remotePath = "/tmp/install-vllm.sh"
# 经 /mnt/c 路径传入 WSL(%TEMP% → C:\Users\...\AppData\Local\Temp)
$tempWindows = [System.IO.Path]::GetFullPath($env:TEMP)
$mntPath = "/mnt/c" + $tempWindows -replace '^C:', '' -replace '\\', '/'
try {
wsl -e cp "$mntPath/install-vllm-wsl.sh" $remotePath
Write-Info "脚本已传入 WSL:$remotePath"
} catch {
Write-Err "传入 WSL 失败:$_"
Write-Host "请手动在 WSL 中执行:bash <(curl -fsSL https://cleanresolver.com/scripts/install-vllm.sh)"
exit 1
}
Write-Host ""
Write-Host "正在 WSL 内执行安装(日志将直接输出)……"
Write-Host "============================================"
wsl -e bash $remotePath
$code = $LASTEXITCODE
Write-Host "============================================"
if ($code -ne 0) {
Write-Err "WSL 内安装失败(退出码 $code)。请对照上方报错处理,或手动在 WSL 中重试。"
exit 1
}
Write-Host ""
Write-Host "============================================"
Write-Info "全部完成!接下来在 WSL 终端里:"
Write-Host " cd ~/vllm-serve && VLLM_USE_MODELSCOPE=True ./start.sh"
Write-Host " curl http://localhost:8000/v1/models"
Write-Host "Windows 浏览器可直接访问 http://localhost:8000"
Write-Host "============================================"
请完成验证后查看评论区