home/tutorial/01 · Week 0 环境

Week 0 · 环境与工具链

目标:周末两天内能在云上 GPU 跑通 vllm serve,并提交一个空白 commit 的 fork PR 走通流程。

这一节不教 AI,只解决"我连环境都跑不起来"这个最劝退的问题。 vLLM 有 C++/CUDA 部分,新手最容易栽在这。读完这页后你应该有: 一份能复现的 Python 环境、一台能开关的云 GPU、一个 fork 好的 vLLM、和一次成功跑通的对话推理。 全程预算控制在 $5 以内。

驱动问题
Apple Silicon Mac 上能真的学 vLLM 吗?还是必须先开云?
先猜,再看答案

能学,能贡献,不能跑大模型推理

  • Mac 上可以:读代码、跑 Python 部分的单测(vLLM 有大量 CPU-only 测试)、写 mini-vLLM、写 blog、改 docs。
  • Mac 上不行:跑 CUDA kernel、benchmark、用 7B+ 模型测延迟、跑 GPU 单测。这些必须上云。
  • 实际节奏:90% 时间本地、10% 时间云上验证。云 GPU 按需开关,每月 $30–80 完全够。

vLLM 也有experimental CPU backend(Intel Xeon),用 oneDNN,能在 Mac/Linux 上跑小模型,但生产 workload 还是 GPU。学习目的:CPU backend 能让你在 Mac 上跑通端到端 demo,看懂调度逻辑。

01硬件实情核对

场景最低推荐预算
读代码 / 跑 CPU 单测 / 写 blog任意笔记本16GB RAM Mac/PC$0
跑 1B fp16 推理 (验证)消费 GPU 8GB (3060, etc.)$0 if own
跑 7B fp16 推理 (验证)A10 24GB (~$0.4/h)A100 40GB$30–80/月
跑 benchmark / 多并发压测A100 40GBA100 80GB / H100 80GB$80–200/月
多卡 TP/PP 实验 (Month 4+)2× A102× A100 NVLink$200+/月
训练 / 大模型微调这不在本路径里。要做就单独申请实习 / 学校 cluster / 抢预算。
💡 GPU 怎么选 provider
Provider类型价格 (A10)价格 (A100 80G)体验
RunPod容器,按秒~$0.30/h~$1.5/hUI 友好,spot 便宜
Vast.ai拍卖市场~$0.20/h~$1.0/h便宜但 host 信誉不一
Lambda LabsVM~$0.75/h~$1.5/h官方 image 全
ModalFaaS~$2.0/h无服务器,按请求计费
TogetherAPI用别人的 vLLM,没法 debug
初学推荐 RunPod spot:UI 简单、按秒计费、镜像快照支持、社群答疑活跃。规则:每次开机最多 2 小时,下机前 push 代码 + 关机。

02本地环境(Mac / Linux 都行)

2.1 工具版本

# Python 3.11 (vLLM 当前支持 3.9-3.12,3.11 最稳)
python --version    # → Python 3.11.x

# uv 是最快的 Python 包管理器,强推(比 pip 快 10-100×)
curl -LsSf https://astral.sh/uv/install.sh | sh

# git 配好用户名 / SSH key
git config --global user.name "WeishuZ"
git config --global user.email "你的邮箱"
ssh-keygen -t ed25519 -C "你的邮箱"        # 然后把 ~/.ssh/id_ed25519.pub 加到 GitHub

2.2 Fork 并 clone vLLM

第一件事:到 vllm-project/vllm 点 fork。然后:

# 你的 fork
git clone git@github.com:WeishuZ/vllm.git
cd vllm

# 加 upstream remote,方便日后 sync 主仓
git remote add upstream https://github.com/vllm-project/vllm.git
git remote -v
# origin    git@github.com:WeishuZ/vllm.git (fetch/push)
# upstream  https://github.com/vllm-project/vllm.git (fetch/push)

# 同步上游 main
git fetch upstream
git checkout main
git merge upstream/main
git push origin main

2.3 安装(本地 CPU-only 模式)

在 Mac 上你不能编译 CUDA 部分,但可以装 CPU 版用来跑 Python 测试和读代码:

uv venv --python 3.11
source .venv/bin/activate

# 方案 A · CPU-only wheel (适合阅读代码 + 单测)
VLLM_TARGET_DEVICE=cpu pip install -e . \
  --extra-index-url https://download.pytorch.org/whl/cpu

# 方案 B · 只装 dev deps,不 build C++(最快,只能读代码不能 run)
pip install -r requirements/dev.txt

# 验证 (方案 A 才行)
python -c "import vllm; print(vllm.__version__)"
⚠ 编译易踩坑
vLLM 的 setup.py 会调 CMake 编译 C++/CUDA 部分。在 Mac 上首次 build 容易挂——报错很正常。具体常见问题:
  • cmake 找不到brew install cmake ninja
  • 编译器版本太旧:用 Xcode 自带的 clang 通常够;Linux 上需要 gcc 9+
  • protobuf 冲突:在 venv 里 pip install protobuf==3.20
  • build 时 OOMMAX_JOBS=2 pip install -e . 限并行
策略:第一次本地跳过 build,纯读源码;等上云再 build 完整版。 Build 文档:docs.vllm.ai/installation

2.4 pre-commit hooks

vLLM reviewer 看到没过 lint 的 PR 会直接关。装上 pre-commit,每次 commit 自动跑 ruff / mypy / typos:

pip install pre-commit
pre-commit install
pre-commit run --all-files   # 第一次跑会慢,之后只检查 diff

# 常见报错快速修
ruff check --fix              # 自动修可修的
mypy vllm/                    # 类型问题,手动修
typos                         # 错别字

2.5 IDE 配置(可选但强推)

VSCode + Cursor / IntelliJ,配几个插件让阅读速度翻倍:

03云上 GPU:第一次跑通

下面以 RunPod 为例(其他 provider 类似)。跟着做,全程不超过 30 分钟。

3.1 开机

  1. RunPod → Deploy → 选 Community Cloud → A10 24GB(spot $0.20–0.30/h)。
  2. 镜像:runpod/pytorch:2.4.0-py3.11-cuda12.4.1-devel-ubuntu22.04
  3. 磁盘:50GB volume 够(模型 ~14GB + 代码 + 缓存)。
  4. SSH 启用,开 port 8000(vLLM 默认)。
  5. 点 Deploy → 30 秒后 SSH 上去。

3.2 装 vLLM

# 在 pod 内
git clone https://github.com/WeishuZ/vllm.git
cd vllm

# 选项 A · 用官方 wheel(推荐,省得 build CUDA)
pip install vllm

# 选项 B · 从源 build(你要改 C++/CUDA 代码时用)
pip install -e . --verbose

# 验证
python -c "import vllm; print(vllm.__version__)"
nvidia-smi                         # 看 GPU 状态

3.3 第一次推理

# 起 OpenAI-compatible server
vllm serve meta-llama/Llama-3.1-8B-Instruct \
  --max-model-len 4096 \
  --gpu-memory-utilization 0.85

# 第一次跑:下载模型 ~14GB,要 2-3 分钟(用了 HF cache 后秒级)
# 等到看到 "Application startup complete." 约 60-90 秒
# 在另一个终端:
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama/Llama-3.1-8B-Instruct",
    "messages": [{"role": "user", "content": "用一句话解释 PagedAttention"}]
  }'
✓ 这一步成功 = Week 0 已完成 70%
你现在有一台能 serve LLM 的机器。立刻看一下日志——vLLM 会打印:
GPU KV cache size: X tokens
Maximum concurrency for Y tokens per request: Z.NNx
这两个数字将在 M2 里被你彻底理解。现在先记下来。

3.4 下机习惯

# 退出 server (Ctrl-C),commit 任何改动
git add -A && git commit -m "wip: notes" && git push

# 立刻在 RunPod 控制台 Stop pod
# 不 stop 一直按时计费!
⚠ 账单事故
忘关 GPU 是最常见的破产事故。建议:
  1. 设手机闹钟 90 分钟提醒。
  2. RunPod 账户里设 spending limit($50/月硬限)。
  3. 把 stop 操作写成 shell alias alias byepod='runpodctl stop pod $POD_ID'
  4. 每次开机前在 calendar 写"$X 上限",到时间 alarm 响。
实战经验:3 个月内至少会忘 1 次。spending limit 是救命的

04故障排查矩阵

常见症状 → 最可能原因 → 排查步骤:

症状原因排查 / 修复
vllm serve 启动 OOM 显存不够装模型 + KV pool --gpu-memory-utilization 0.7--max-model-len 2048,或换更小模型
下载模型 403 HF Llama 需要 access 在 HF 上申请 + huggingface-cli login,或换 Qwen / Mistral
下载慢 HF 镜像没设 HF_ENDPOINT=https://hf-mirror.com(国内)
CUDA out of memory 但 nvidia-smi 显示有空闲 fragmentation 或前一个进程没真正释放 nvidia-smi 看进程,kill -9 残留
vLLM 报 flash-attn not installed flash-attn wheel 与 CUDA 版不匹配 pip install flash-attn --no-build-isolation 或换 backend:VLLM_ATTENTION_BACKEND=XFORMERS
curl 返回 connection refused port 没暴露 或 server 还没起完 等到 "Application startup complete." 再 curl
响应乱码 chat template 没匹配模型 看模型 README 的 chat template,确认 --chat-template 或用 Instruct 版
本地 import vllm 报 illegal instruction 预编译 wheel 不支持你的 CPU 从源 build:pip install -e .
pre-commit 跑很久 第一次要装多个工具 + 全文件扫描 正常。后续只看 diff,秒级。
build vLLM 时 nvcc not found CUDA toolkit 没装 / PATH 没配 which nvcc,没找到就装 cuda-toolkit;container image 选 -devel 后缀

05本地开发循环

如果你完全本地开发,下面这套 loop 最高效:

┌──────────────────┐    ┌──────────────────┐    ┌──────────────────┐
│ Mac: 编辑代码    │ →  │ git push to fork │ →  │ pod: pull + 验证 │
│ (vim / cursor)   │    │ (1s)             │    │ (10s)            │
└──────────────────┘    └──────────────────┘    └──────────────────┘
       ↑                                                  │
       └──────────────────  iterate  ────────────────────┘
把 pod 当远程 runner。本地代码、远程执行。

或者直接 VSCode Remote SSH 进 pod 改代码——简单粗暴,所有 IDE 体验都在 pod 上。

5.1 VSCode Remote SSH 极简设置

# 本地 ~/.ssh/config
Host runpod
    HostName ssh.runpod.io
    Port 12345          # 看 pod console 给的端口
    User root
    IdentityFile ~/.ssh/id_ed25519
    LocalForward 8000 localhost:8000   # 本地能 curl pod 的 server

# VSCode 装 Remote-SSH 扩展
# Command Palette → Remote-SSH: Connect to Host... → runpod

这样在 Mac 上 curl http://localhost:8000/... 就直接打到 pod 的 vLLM server,因为端口被 forward。

06走通第一个 PR 流程(保底 PR)

Month 1 的 KPI 是"第一个 merged PR",无论多小都行。 Week 0 末尾就先跑一遍 PR 流程,把陌生感消掉。

行动
vllm/docs/
打开 vLLM 文档目录,找一个 typo / 措辞不清 / 链接失效 / 代码 example 过时。有,几乎一定有。
把它修了,提一个 docs-only PR。
# 在 fork 里
git checkout -b docs/fix-typo
# 改 docs/source/xxx.md
git add docs/source/xxx.md
git commit -m "docs: fix typo in xxx"
git push -u origin docs/fix-typo

# 然后到 GitHub UI 提 PR,目标是 vllm-project/vllm:main
# 等 CI 跑完(约 10 分钟),把 reviewer 标签贴上
# 注意 DCO 签署:commit message 末尾要有 "Signed-off-by: Your Name "
# 用 git commit -s 自动加

6.1 Reviewer 期望的最低标准

6.2 PR 卡 review 怎么办

07HuggingFace cache 与磁盘

HF model cache 默认在 ~/.cache/huggingface/,大文件多。两个建议:

  1. cache 放在 volume 上,不要放在容器内(pod 关机会丢):
    export HF_HOME=/workspace/.hf_cache
    mkdir -p $HF_HOME
  2. 用 hf_transfer 加速下载
    pip install hf_transfer
    export HF_HUB_ENABLE_HF_TRANSFER=1
    # 下载 Llama 8B 从 ~3 分钟 → ~30 秒

08本页自检

Week 0 结束时这些应该全部 ✓