Week 0 · 环境与工具链
目标:周末两天内能在云上 GPU 跑通 vllm serve,并提交一个空白 commit 的 fork PR 走通流程。
这一节不教 AI,只解决"我连环境都跑不起来"这个最劝退的问题。 vLLM 有 C++/CUDA 部分,新手最容易栽在这。读完这页后你应该有: 一份能复现的 Python 环境、一台能开关的云 GPU、一个 fork 好的 vLLM、和一次成功跑通的对话推理。 全程预算控制在 $5 以内。
先猜,再看答案
能学,能贡献,不能跑大模型推理。
- 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 40GB | A100 80GB / H100 80GB | $80–200/月 |
| 多卡 TP/PP 实验 (Month 4+) | 2× A10 | 2× A100 NVLink | $200+/月 |
| 训练 / 大模型微调 | 这不在本路径里。要做就单独申请实习 / 学校 cluster / 抢预算。 | ||
| Provider | 类型 | 价格 (A10) | 价格 (A100 80G) | 体验 |
|---|---|---|---|---|
| RunPod | 容器,按秒 | ~$0.30/h | ~$1.5/h | UI 友好,spot 便宜 |
| Vast.ai | 拍卖市场 | ~$0.20/h | ~$1.0/h | 便宜但 host 信誉不一 |
| Lambda Labs | VM | ~$0.75/h | ~$1.5/h | 官方 image 全 |
| Modal | FaaS | — | ~$2.0/h | 无服务器,按请求计费 |
| Together | API | — | — | 用别人的 vLLM,没法 debug |
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__)"
- cmake 找不到:
brew install cmake ninja - 编译器版本太旧:用 Xcode 自带的 clang 通常够;Linux 上需要 gcc 9+
- protobuf 冲突:在 venv 里
pip install protobuf==3.20 - build 时 OOM:
MAX_JOBS=2 pip install -e .限并行
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,配几个插件让阅读速度翻倍:
- Python (Microsoft) + Pylance · 跳转到定义、查类型
- CUDA C++ · 高亮 .cu 文件
- Git Lens · 看每行的 blame,知道这行代码"为什么被加进来"——读 vLLM 历史变更必备
- Project Manager · vLLM + 你的 fork + mini-vLLM 切换
03云上 GPU:第一次跑通
下面以 RunPod 为例(其他 provider 类似)。跟着做,全程不超过 30 分钟。
3.1 开机
- RunPod → Deploy → 选 Community Cloud → A10 24GB(spot $0.20–0.30/h)。
- 镜像:
runpod/pytorch:2.4.0-py3.11-cuda12.4.1-devel-ubuntu22.04。 - 磁盘:50GB volume 够(模型 ~14GB + 代码 + 缓存)。
- SSH 启用,开 port 8000(vLLM 默认)。
- 点 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"}]
}'
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 一直按时计费!
- 设手机闹钟 90 分钟提醒。
- RunPod 账户里设 spending limit($50/月硬限)。
- 把 stop 操作写成 shell alias
alias byepod='runpodctl stop pod $POD_ID'。 - 每次开机前在 calendar 写"$X 上限",到时间 alarm 响。
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 ────────────────────┘
或者直接 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 流程,把陌生感消掉。
# 在 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 期望的最低标准
- PR 标题前缀:
[Doc]·[Bugfix]·[Core]·[Kernel]·[Hardware][AMD]。看一眼最近 10 个 merged PR 学风格。 - 描述里至少写:"改了什么 / 为什么改 / 怎么验证"。模板就在
.github/PULL_REQUEST_TEMPLATE.md。 - CI 必须全绿。pre-commit 红的话回去本地
pre-commit run --all-files修。 - 第一次提 PR 会被要求签 DCO(Developer Certificate of Origin),照 bot 提示来:
git rebase --signoff。 - 非 trivial PR 通常要测试。看
tests/目录类似 case 的写法。
6.2 PR 卡 review 怎么办
- 5 天没人看 → 礼貌 ping 一次:
@reviewer-name PTAL when you have a moment, thanks! - 10 天还没看 → 到 vLLM 官方 Slack 的
#vllm-dev频道发链接 - 不要纠结一个 PR 卡住——同时推进下一个,多个 PR 并行
07HuggingFace cache 与磁盘
HF model cache 默认在 ~/.cache/huggingface/,大文件多。两个建议:
- cache 放在 volume 上,不要放在容器内(pod 关机会丢):
export HF_HOME=/workspace/.hf_cache mkdir -p $HF_HOME - 用 hf_transfer 加速下载:
pip install hf_transfer export HF_HUB_ENABLE_HF_TRANSFER=1 # 下载 Llama 8B 从 ~3 分钟 → ~30 秒