# nano-vllm **Repository Path**: daichunxing/nano-vllm ## Basic Information - **Project Name**: nano-vllm - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-10 - **Last Updated**: 2026-11-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

# Nano-vLLM 从零构建的轻量级 vLLM 实现。 ## 关键特性 - 🚀 **快速离线推理** - 推理速度与 vLLM 相当 - 📖 **可读性强的代码** - 约 1,400 行 Python 代码,结构清晰 - ⚡ **优化套件** - 前缀缓存、张量并行、Torch 编译、CUDA Graph 等 ## 实战课程 [nano-vllm 实战课程](docs/llm-inference-visual/) — 从源码走读 LLM 推理引擎:调度、KV cache、注意力、Tensor Parallel、CUDA Graph。8 课逐步展开,每课附带可运行的验证脚本。 ## 安装 ```bash pip install git+https://github.com/ForceInjection/nano-vllm.git ``` ## 模型下载 手动下载模型权重: ```bash huggingface-cli download --resume-download Qwen/Qwen3-0.6B \ --local-dir ~/huggingface/Qwen3-0.6B/ \ --local-dir-use-symlinks False ``` ## 快速开始 参考 `example.py`。API 接口与 vLLM 一致,仅 `LLM.generate` 方法有细微差异: ```python from nanovllm import LLM, SamplingParams llm = LLM("/YOUR/MODEL/PATH", enforce_eager=True, tensor_parallel_size=1) sampling_params = SamplingParams(temperature=0.6, max_tokens=256) prompts = ["Hello, Nano-vLLM."] outputs = llm.generate(prompts, sampling_params) outputs[0]["text"] ``` ## 性能测试 参见 `bench.py`。 **测试配置:** - 硬件:RTX 4070 Laptop (8GB) - 模型:Qwen3-0.6B - 总请求数:256 条 - 输入长度:100–1024 tokens 随机采样 - 输出长度:100–1024 tokens 随机采样 **性能结果:** | 推理引擎 | 输出 Tokens | 耗时 (s) | 吞吐 (tokens/s) | | --------- | ----------- | -------- | --------------- | | vLLM | 133,966 | 98.37 | 1361.84 | | Nano-vLLM | 133,966 | 93.41 | 1434.13 | ## 开发:验证与调试 ### 验证分层 | 层级 | 命令 | 依赖 | | -------- | ---------------------------------------------------------------------------- | ------------------------------------------- | | 单元测试 | `python -m pytest tests/ -v` | 无需 GPU / 模型(纯元数据状态机与拷贝索引) | | 功能验证 | `python docs/llm-inference-visual/scripts/verify_nanovllm.py ` | GPU + 模型 | | 端到端 | `python tests/verify_swap.py ` / `python tests/bench_swap.py ` | GPU + 模型 | `tests/verify_swap.py` 覆盖 KV Cache CPU Offloading 的 GPU 层:B1 KV 逐字节往返相等、B2 单序列 swap 往返逐 token 一致(确定性对比)、B3 强制抢占冒烟(不死锁)、C 观测计数器断言。脚本内部每个 `LLM` 都在独立子进程中运行(引擎的 `exit()` 不释放 KV 显存,同进程连开会互相饿死),设计见 [docs/design/kv-offload.md](docs/design/kv-offload.md)。 ### flash-attn 安装(常见坑) - 预编译 wheel 按 **torch 小版本 + CUDA + cxx11 ABI** 三要素绑定(如 `flash_attn-2.8.3+cu12torch2.8cxx11abiTRUE-cp312-...whl`)。不匹配的轮子能装上、import 时才报 `undefined symbol: _ZN3c10...`——下载前先核对 `torch.__version__` 与 CUDA 版本 - 没有匹配轮子时源码编译(需要 nvcc,A100 填 `8.0`,Hopper 填 `9.0`): ```bash pip install ninja packaging wheel # 从 PyPI 下载 flash_attn-.tar.gz 并解包,进入目录后: MAX_JOBS=48 TORCH_CUDA_ARCH_LIST="8.0" python setup.py bdist_wheel -d dist pip install --no-deps dist/flash_attn-*.whl ``` - 不要用 `pip download` / `pip wheel` 处理 flash-attn 的 sdist:PEP 517 隔离构建环境里没有 torch,会报 `No module named 'torch'` - wheel 文件名必须符合 pip 规范(`名-版本-语言标记-ABI标记-平台.whl`),随意重命名(如 `fa2.whl`)会被拒绝安装 - Python 仅支持 3.10–3.12(`pyproject.toml` 限定 `>=3.10,<3.13`,3.13 不可用) ### 容器化 GPU 验证 用任意含 torch + CUDA 工具链的镜像(如 `pytorch/pytorch` devel 系)搭建即弃验证环境,宿主机零污染: ```bash docker run --rm --gpus all --ipc=host \ -v $PWD:/nano-vllm -v <模型目录>:/models \ \ bash -c "pip install -q --no-deps \ && cd /nano-vllm && pip install -e . --no-build-isolation --no-deps \ && python tests/verify_swap.py /models/Qwen3-0.6B" ``` - `--rm` 即弃:pip 装进容器层的依赖随容器销毁,镜像本体不变;`--no-deps` 保证不升级镜像里已有的 torch - `--ipc=host`:CUDA 与多进程共享内存需要足够的 shm - `--gpus` 不可用的环境(如驱动升级后 CDI 规格与 `--gpus` 挂载不一致)可改用 CDI 设备:`--device nvidia.com/gpu=N`,可用设备名以 `nvidia-ctk cdi list` 为准 - pip 走镜像源(如 `-i https://pypi.tuna.tsinghua.edu.cn/simple`)可显著提速