Chapter 04

安装与 OpenAI 兼容服务

三行命令起一个生产级 OpenAI API 服务,业务代码一行不改就切到自建模型。本章把每个启动参数说清楚,避免你对着文档瞎试。

环境要求

组件最低推荐
Python3.93.10 / 3.11
CUDA11.812.1+
GPUCompute Cap 7.0+(V100 起)A100 / H100 / L40S
PyTorch2.4+2.5+
OSLinux(glibc 2.31+)Ubuntu 22.04
Mac 用户
vLLM 目前对 Apple Silicon(MPS)支持有限,CPU 后端 0.6+ 才实验性上线。本地开发建议用 Ollama,生产再上 Linux + GPU。

安装

# 方式一:uv(推荐,最快)
uv pip install vllm

# 方式二:pip
pip install vllm

# 方式三:源码编译(自定义 CUDA 架构)
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .

装完验证:

python -c "import vllm; print(vllm.__version__)"
# 0.6.x

启动 OpenAI 兼容服务

最小命令:

vllm serve meta-llama/Llama-3-8B-Instruct

默认监听 0.0.0.0:8000,模型从 HuggingFace Hub 下载(私有模型记得先 huggingface-cli login)。

完整常用参数:

vllm serve meta-llama/Llama-3-8B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --served-model-name llama3-8b \                    # API 里用的名字
  --dtype bfloat16 \                                 # A100 / H100 默认
  --max-model-len 8192 \                            # 按业务裁
  --gpu-memory-utilization 0.9 \                    # 吃 90% 显存
  --tensor-parallel-size 1 \                        # 多卡改这里
  --enable-chunked-prefill \
  --enable-prefix-caching \                          # 共享 system prompt
  --api-key "sk-your-secret"                       # 加简单鉴权

启动参数详解

--model (位置参数)
HuggingFace 路径、本地目录、或 ModelScope 路径。例:/data/models/Qwen2-7B
--served-model-name
API 里模型的标识名。默认用 --model 的路径,太长时改短。多个 --served-model-name 可以一条命令注册多个别名。
--dtype
auto(推荐)/bfloat16/float16/float32。A100+ 选 bf16 稳,V100 只能 fp16。
--max-model-len
支持的最大上下文长度。越大 KV 池吃越多,按业务最长 prompt 定。Llama-3 默认 8k,Qwen2-128k 就要看显存够不够。
--gpu-memory-utilization
默认 0.9,即吃 90% 显存给模型 + KV。和其他进程共享卡时调低(0.75)免得挤爆。
--max-num-seqs
并发序列上限,默认 256。聊天场景够用,批量压测可以调高到 1024。
--quantization
加载量化版模型时填 awq / gptq / fp8 / bitsandbytes。详见第 5 章。
--enable-prefix-caching
开启前缀缓存,多请求共享同 prompt 时 KV 可复用,prefill 变快。多轮对话必开。

OpenAI SDK 直接调用

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="sk-your-secret",
)

# chat completion
resp = client.chat.completions.create(
    model="llama3-8b",
    messages=[
        {"role": "system", "content": "你是一个简洁的助手"},
        {"role": "user", "content": "一句话解释 PagedAttention"},
    ],
    temperature=0.7,
    max_tokens=256,
)
print(resp.choices[0].message.content)

# 流式
stream = client.chat.completions.create(
    model="llama3-8b",
    messages=[{"role": "user", "content": "写首诗"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

curl 直接测

curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer sk-your-secret" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3-8b",
    "messages": [{"role": "user", "content": "Hello"}]
  }'

多模型一次性启动

同一 vLLM 服务默认只跑一个 model_path,但可以挂多个 alias:

vllm serve Qwen/Qwen2-7B-Instruct \
  --served-model-name qwen2 qwen2-7b backup-model

三个名字指向同一模型,方便前端按不同别名做路由(比如把旧系统的 "gpt-3.5" 直接映射过来)。

想真正同时跑多个不同模型,需要起多个进程或用 docker-compose 分端口。

Docker 部署

docker run --runtime nvidia --gpus all \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -p 8000:8000 \
  --ipc=host \
  vllm/vllm-openai:v0.6.3 \
  --model meta-llama/Llama-3-8B-Instruct \
  --dtype bfloat16
为什么要 --ipc=host
PyTorch dataloader 和 NCCL 都用 shared memory 通信。默认 Docker 给 /dev/shm 只有 64MB,很容易炸。--ipc=host--shm-size 32g 都行,多卡张量并行尤其必开。

离线批量推理(不用 HTTP)

如果场景是"处理 10 万条问题一次性给结果",起 HTTP 服务是绕路。直接用 LLM 类:

from vllm import LLM, SamplingParams

llm = LLM(
    model="meta-llama/Llama-3-8B-Instruct",
    dtype="bfloat16",
    gpu_memory_utilization=0.9,
    max_model_len=4096,
)

prompts = [
    "将 'Hello World' 翻译成中文:",
    "写一个冒泡排序:",
    "东京在哪个国家?",
] * 3000   # 9000 条

params = SamplingParams(temperature=0.7, max_tokens=256)

outputs = llm.generate(prompts, params)
for out in outputs[:3]:
    print(out.prompt[:50], "→", out.outputs[0].text[:80])

vLLM 内部照样用连续批处理,吞吐和 HTTP 模式一样。单机 9000 条 token<200 的 prompt,A100 上大概 40 秒跑完。

HuggingFace 镜像加速

国内下模型慢,换 HF 镜像:

export HF_ENDPOINT=https://hf-mirror.com
export HF_HOME=/mnt/data/hf-cache       # 大盘装模型
vllm serve Qwen/Qwen2-7B-Instruct

或直接用魔搭社区模型:

export VLLM_USE_MODELSCOPE=True
vllm serve qwen/Qwen2-7B-Instruct

内置 endpoint 一览

路径作用
/v1/chat/completionsOpenAI chat API 兼容
/v1/completionsOpenAI completion API 兼容
/v1/embeddings需要 embedding 模型(BGE 等)
/v1/models列出注册的 model 名
/healthk8s liveness 探针
/metricsPrometheus 指标
/tokenize / /detokenize工具接口,算 token 数很方便

常见启动报错

报错原因修复
CUDA OOM--gpu-memory-utilization 太高或 --max-model-len 太大降到 0.85 / 裁短 max-model-len
Cannot find attribute模型 config 不识别升级 vLLM 或装 transformers main 分支
Model architecture not supported模型太新支持列表,必要时用 HF auto_map
NCCL error on multi-GPU--ipc=host 没加Docker 加上,或 --shm-size 32g
HF 403 / timeout没登录或墙huggingface-cli login / 换镜像

本章小结