candle vLLM

高效、易用的本地大语言模型(LLM)推理与服务平台,提供 OpenAI 兼容的 API 服务。
English | 简体中文

--- ## ✨ 为什么选择 Candle-vLLM? | | 特性 | 详情 | |---|---|---| | **⚡** | 极致性能 | 原生 Flash Attention、FlashInfer、CUDA Graphs、持续批处理、前缀缓存。| | **🗜️** | 极致 KV 压缩 | TurboQuant(`2–4 位` KV 缓存)以极小的质量损失将上下文扩展至 **4.7 倍** | | **🌍** | 跨平台 | CUDA(Linux)、Metal(macOS),统一代码库,统一 API | | **🏭** | 生产就绪 | OpenAI 兼容 API 服务、内置 ChatGPT 风格 Web UI、MCP 工具调用、流式输出 | | **📦** | 部署简单 | 一键安装脚本、Docker 镜像或源码编译 | | **🔧** | 高度可扩展 | 基于 trait 的架构,支持快速实现新的模型 | | **🖥️** | 多 GPU & 多节点 | 多进程及多线程张量并行,TCP 多节点推理 | --- ## 🚀 快速开始 ### 📦 安装 **方案 1 — 一键安装(DEB 或二进制)** ```bash curl -sSL https://ericlbuehler.github.io/candle-vllm/install.sh | bash ``` **方案 2 — 从源代码构建** ```bash git clone git@github.com:EricLBuehler/candle-vllm.git cd candle-vllm # CUDA(11+, 12+, 13.0)— sm_70/sm_75 需去除 flashinfer,cutlass cargo install --features cuda,nccl,flashinfer,cutlass --path . # macOS/Metal cargo install --features metal --path . ``` **方案 3 — Docker** ```bash # 可指定 SM 版本和 CUDA 版本:./build_docker.sh "cuda,nccl,flashinfer,cutlass" sm_90 13.0.0 ./build_docker.sh "cuda,nccl,flashinfer,cutlass" ``` --- ### ▶️ 运行 **使用 HuggingFace 模型 ID:** ```bash candle-vllm --m Qwen/Qwen3.6-27B-FP8 --ui-server candle-vllm --m unsloth/Qwen3.5-122B-A10B-GGUF --f Q3_K_S --d 0,1 --ui-server candle-vllm --m zai-org/GLM-5.2-FP8 --d 0,1,2,3,4,5,6,7 --ui-server ``` **使用本地模型路径:** ```bash # 本地 Safetensors 目录 candle-vllm --d 0,1,2,3,4,5,6,7 --m /home/data/GLM-5.2-FP8/ --ui-server # 本地 GGUF 文件(单文件或分片) candle-vllm --d 0,1 --m /home/data/model-Q4_K_M.gguf --ui-server # 本地目录(自动检测 GGUF 文件) candle-vllm --d 0,1 --m /home/data/Qwen3.5-35B-A3B-GGUF/ --ui-server ``` > **提示:** 添加 `--ui-server` 可启动内置 ChatGPT 风格 Web UI。UI 服务端口为 API 端口减一(例如 API 为 `2000`,UI 为 `1999`)。 --- ## 📈 性能 > 单请求解码速度(输入 4k,输出 1k,`Hopper` 80G) | # | 模型 | BF16(解码速度 / 单请求) | 量化 | |---|---|---|---| | 1 | **LLAMA** | 119 tks/s (8B) | 163 tks/s (8B, Q4K), 171 tks/s (8B, **Marlin**) | | 2 | **Mistral** | 122 tks/s (7B) | 181 tks/s (7B, Q4K), 190 tks/s (7B, **Marlin**) | | 3 | **Phi3/Phi4** | 153 tks/s (3.8B) | 196 tks/s (3.8B, Q4K) | | 4 | **QWen2/Qwen3 Dense** | 127 tks/s (8B) | 154 tks/s **(8B, Q4K)** | | 5 | **QWen3 MoE** | 102 tks/s **(30B)** | 124 tks/s **(30B, Q4K)** | | 6 | **QWen3-Next MoE** | 80 tks/s **(80B, BF16, tp=2)** | TBD | | 7 | **QWen3.5/3.6 Dense** | 36 tks/s **(27B, BF16)** | ~49 tks/s **(27B, Q4K / FP8)** | | 8 | **QWen3.5/3.6 MoE** | 90 tks/s **(35B)** | 105 tks/s **(35B, Q4K)** | | 9 | **Yi** | 168 tks/s (6B) | 199 tks/s (6B, Q4K) | | 10 | **StableLM** | 251 tks/s (3B) | - | | 11 | **Gemma-2/Gemma-3** | 103 tks/s (9B) | 130 tks/s (9B, **Marlin**) | | 12 | **DeepSeek V2/V3/V3.2/R1** | TBD | ~20 tks **(AWQ 671B, tp=8, offloading)** | | 13 | **QwQ-32B** | 51 tks/s **(32B, tp=2)** | 70 tks/s **(32B, Q4K)** | | 14 | **GLM4** | 96 tks/s **(9B)** | 139 tks/s **(9B, Q4K)** | | 15 | **GLM4.7 Flash** | TBD | 82 tks/s **(31B, Software NVFP4)** | | 16 | **LLama4** | TBD | 47 tks/s **(107B, Software NVFP4)** | | 17 | **Gemma4** | (26B) 83 tks/s | 82 tks/s **(26B, Software NVFP4)** | | 18 | **MiniMax-M2.5/M2.7** | TBD | 72 tks/s **(229B, Software NVFP4, TP=2)** | | 19 | **GLM-5.2** | TBD | 支持 **(FP8, tp=8)** |
演示视频 — GPU 与 Apple Silicon **GPU**(A100, BF16, QWen3-8B 推理模型)上的聊天演示 **Apple Silicon**(M4, 16GB 统一内存, Q2K, QWen3-8B)上的聊天演示
--- ## 🧠 功能特性 - 提供 OpenAI 兼容的 API 服务,用于部署 LLM - 生成过程中支持流式(stream)传输 - 使用 PagedAttention 高效管理 KV 缓存 - 持续批处理(continuous batching,不同时间段的请求 decoding 阶段聚合为批量处理) - 原位(In-situ)量化(及原位 Marlin 格式转换) - 支持 `GPTQ/Marlin` 格式量化(4 位) - 支持 `Mac/Metal` 设备 - 支持 `多 GPU` 推理(包括 `多进程` 和 `多线程` 模式) - 支持 `多节点` 推理(基于 TCP 协调) - 支持分块 Prefilling(默认块大小 8K) - 支持 CUDA Graph - 支持 Model Context Protocol(MCP)和 OpenAI 兼容工具调用 - 支持 Prefix Caching - 支持硬件 FP8 模型推理加速(SM90+, Qwen3 系列,Block-wise FP8 量化) - 支持 FP8 KV Cache(兼容 FlashInfer、FlashAttention 及 Prefix Cache,适用于所有 CUDA 和 Metal 平台) - 支持 TurboQuant KV Cache(turbo8/turbo4/turbo3),使用原生 Flash 注意力内核实现高压缩比 KV 缓存 - 支持 Flashinfer 后端 - 支持通过命令行参数 `--yarn-scaling-factor` 手动设置 YaRN RoPE 缩放因子 - 支持 MXFP4/NVFP4 模型 - 支持 DeepSeek V3.2 和 GLM-5.2 FP8 模型 --- ## 📘 使用方法 ### 运行模型 > **提示:** 默认启动 OpenAI 兼容 API 服务(`http://localhost:2000`)。添加 `--ui-server` 可同时启动内置 ChatGPT 风格 Web UI。 ```bash # FP8 模型 + Web UI candle-vllm --m Qwen/Qwen3.6-27B-FP8 --ui-server # Hopper 上加速 GDN 预填充,精度略有损失 SM90_LOWER_PRECISION_GDN_PREFILL=1 candle-vllm --m Qwen/Qwen3.5-35B-A3B-FP8 # GLM-5.2 FP8 模型 candle-vllm --d 0,1,2,3,4,5,6,7 --m zai-org/GLM-5.2-FP8 --ui-server # 未量化 Safetensors(多 GPU) candle-vllm --d 0,1 --w /home/Qwen3-30B-A3B-Instruct-2507/ # ISQ 即时量化 candle-vllm --m Qwen/Qwen3.6-27B --isq q4k # FP4 模型 candle-vllm --m GadflyII/GLM-4.7-Flash-NVFP4 --ui-server # GGUF 模型 candle-vllm --m unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF --f Qwen3-30B-A3B-Instruct-2507-Q4_K_M.gguf --ui-server # 手动 YaRN 缩放 candle-vllm --m Qwen/Qwen3.6-35B-A3B --yarn-scaling-factor 4.0 --ui-server ```
FP8 / FP4 模型 ```bash # FP8 模型(block-wise 量化,需启用 cutlass 特性) candle-vllm --m Qwen/Qwen3.6-27B-FP8 --ui-server # GLM-5.2 FP8 模型 candle-vllm --d 0,1,2,3,4,5,6,7 --m zai-org/GLM-5.2-FP8 --ui-server # MacOS/Metal 上的 FP8(Dense) candle-vllm --m Qwen/Qwen3-4B-Instruct-2507-FP8 --ui-server # FP4 模型(MXFP4/NVFP4,暂不支持 MLX 量化格式) candle-vllm --m GadflyII/GLM-4.7-Flash-NVFP4 --ui-server # MXFP4 candle-vllm --m nm-testing/Qwen3-30B-A3B-MXFP4A16 --ui-server ```
GGUF 模型 ```bash # 本地 GGUF 文件(推荐使用 --m) candle-vllm --m /home/data/Qwen3-30B-A3B-Instruct-2507-Q4_K_M.gguf --ui-server # 本地 GGUF 文件(--f 传统方式) candle-vllm --f /home/data/Qwen3-30B-A3B-Instruct-2507-Q4_K_M.gguf --ui-server # 本地目录(自动检测 GGUF,按需加载 mmproj 视觉文件) candle-vllm --m /home/data/Qwen3.5-35B-A3B-GGUF/ --ui-server # 从 HuggingFace 下载(精确文件) candle-vllm --m unsloth/Qwen3-30B-A3B-Instruct-2507-GGUF --f Qwen3-30B-A3B-Instruct-2507-Q4_K_M.gguf --ui-server # 从 HuggingFace 下载(子文件夹 — 下载远程路径下所有 GGUF 文件) candle-vllm --m unsloth/Qwen3.5-122B-A10B-GGUF --f Q3_K_S --d 0,1 --ui-server # 本地多分片 GGUF(从本地路径自动发现分片文件) candle-vllm --m /home/data/model-00001-of-00003.gguf --d 0,1 --ui-server # Apple Silicon 上的 GGUF candle-vllm --m /home/qwq-32b-q4_k_m.gguf --ui-server candle-vllm --m Qwen/QwQ-32B-GGUF --f qwq-32b-q4_k_m.gguf --ui-server ``` **多分片 GGUF:** 分片 GGUF 文件(如 `model-00001-of-00005.gguf`)支持自动发现 — 本地(从同一目录)和远程(从 HuggingFace 仓库)均可。当 `--f` 为子文件夹名(不以 `.gguf` 结尾)时,会下载该远程子文件夹中的所有 GGUF 文件。视觉塔辅助文件(`mmproj*.gguf`)在多模态模型中按需加载。
ISQ 原位量化 运行未量化模型时只需添加 `--isq` 参数: ```bash candle-vllm --m Qwen/Qwen3.6-27B --isq q4k ``` 可选值:`q4_0`, `q4_1`, `q5_0`, `q5_1`, `q8_0`, `q2k`, `q3k`, `q4k`, `q5k`, `q6k`
GPTQ / AWQ / Marlin 模型 ```bash # Marlin 兼容的 GPTQ(4 位,128 分组,desc_act=False) candle-vllm --m thesven/Llama-3-8B-GPTQ-4bit # 将未压缩模型转换为 Marlin 兼容格式 python3 examples/convert_marlin.py --src /home/DeepSeek-R1-Distill-Qwen-14B/ --dst /home/DeepSeek-R1-Distill-Qwen-14B-GPTQ_4bit-128g candle-vllm --w /home/DeepSeek-R1-Distill-Qwen-14B-GPTQ_4bit-128g # 将 AWQ 转换为 Marlin 兼容格式 python3 examples/convert_awq_marlin.py --src /home/Meta-Llama-3.1-8B-Instruct-AWQ-INT4/ --dst /home/Meta-Llama-3.1-8B-Instruct-AWQ-INT4-Marlin/ --bits 4 --method awq --group 128 --nk False candle-vllm --d 0 --w /home/Meta-Llama-3.1-8B-Instruct-AWQ-INT4-Marlin/ # 直接使用 Marlin 格式模型 candle-vllm --w /home/DeepSeek-R1-Distill-Qwen-14B-GPTQ-Marlin/ ```
--- ### 🗜️ TurboQuant KV 缓存 TurboQuant 通过 Walsh-Hadamard 变换压缩 KV 缓存,实现更高吞吐量和更长上下文: | 模式 | 描述 | KV 缓存压缩比 | 推荐用途 | |------|------|--------------|---------| | `turbo8` | FP8 K + 4-bit V | ~2.6x | 最佳质量-压缩比平衡 | | `turbo4` | 4-bit K + 4-bit V | ~3.7x | 质量与显存节省兼顾 | | `turbo3` | 3-bit K + 4-bit V | ~4.7x | 最大限度节省显存 | ```bash # Turbo4(4-bit KV 缓存,约 3.7 倍压缩) candle-vllm --w /data/Qwen3.5-27B-FP8/ --kvcache-dtype turbo4 # Turbo8(FP8 K + 4-bit V,约 2.6 倍压缩) candle-vllm --w /data/Qwen3.5-27B-FP8/ --kvcache-dtype turbo8 # Turbo3(3-bit K + 4-bit V,约 4.7 倍压缩) candle-vllm --w /data/Qwen3.5-27B-FP8/ --kvcache-dtype turbo3 # FP8 KV Cache candle-vllm --w /data/Qwen3.5-35B-A3B-FP8/ --kvcache-dtype fp8 ``` > **注意**:TurboQuant 使用原生 Flash 注意力内核(flashinfer 自动禁用)。支持 CUDA(SM70+)和 Metal(Apple Silicon)两种平台。MLA 模型(DeepSeek、GLM4/GLM-5.2)因 KV 压缩布局不兼容会自动回退到标准 KV 缓存。 --- ### 🖥️ 多 GPU 推理
多进程模式(推荐) ```bash # 两块 GPU 运行 QwQ-32B BF16 candle-vllm --d 0,1 --w /home/QwQ-32B/ # 两块 GPU 运行 QwQ-32B 4 位 AWQ python3 examples/convert_awq_marlin.py --src /home/QwQ-32B-AWQ/ --dst /home/QwQ-32B-AWQ-Marlin/ --bits 4 --method awq --group 128 --nk False candle-vllm --d 0,1 --w /home/QwQ-32B-AWQ-Marlin/ ``` **注意:** GPU 数量(`--d`)必须为 2 的幂次方(例如 2、4 或 8)。
多线程模式(调试用途) ```bash # 添加 --multithread 参数 candle-vllm --multithread --d 0,1 --w /home/QwQ-32B/ # 问题排查 export NCCL_P2P_DISABLE=1 # 禁用 P2P 以避免非法内存访问 ```
--- ### 🌐 多节点推理 跨多台机器分布式推理,基于 TCP 的 NCCL 引导,无需 MPI。 ```bash # 在主节点 (192.168.1.100) 上运行: candle-vllm --d 0,1,2,3,4,5,6,7 --w /data/DeepSeek-R1-AWQ-Marlin/ \ --num-nodes 2 --node-rank 0 --master-addr 192.168.1.100 --master-port 29500 # 在工作节点 (192.168.1.101) 上运行: candle-vllm --d 0,1,2,3,4,5,6,7 --w /data/DeepSeek-R1-AWQ-Marlin/ \ --num-nodes 2 --node-rank 1 --master-addr 192.168.1.100 --master-port 29500 ``` 所有节点需本地存放模型权重,并通过 TCP 连接 `--master-port`(默认 29500)。 | 参数 | 说明 | |------|------| | `--num-nodes N` | 集群中的节点总数 | | `--node-rank R` | 本节点的排名(0 = 主节点) | | `--master-addr ADDR` | 主节点的 IP 地址 | | `--master-port PORT` | NCCL ID 交换端口(默认:29500) | --- ### 📐 NUMA 绑定
显示命令 ```bash sudo apt-get install numactl # 8 张 GPU,2 个 NUMA 节点 MAP_NUMA_NODE=0,0,0,0,1,1,1,1 numactl --cpunodebind=0 --membind=0 candle-vllm --d 0,1,2,3,4,5,6,7 --w /home/data/DeepSeek-V2-Chat-AWQ-Marlin # 4 张 GPU MAP_NUMA_NODE=0,0,0,0 numactl --cpunodebind=0 --membind=0 candle-vllm --d 0,1,2,3 --w /home/data/DeepSeek-V2-Chat-AWQ-Marlin ``` `numactl --cpunodebind=0 --membind=0` 指定 master 进程的 NUMA 绑定,必须与 `MAP_NUMA_NODE` 相匹配。
--- ## ⚙️ 命令行参数 | 参数 | 说明 | |------|------| | `--h` | 绑定地址(默认 `0.0.0.0`),支持 `host`、`host:port`、`[ipv6]:port`、`tcp://host[:port]`、`file:///path`、`socket:///path`、`unix:///path` | | `--p` | 当 `--h` 未包含端口时使用的 TCP 服务端口(默认 `2000`) | | `--d` | 设备 ID(如 `--d 0,1`) | | `--m` | 模型来源:HuggingFace 模型 ID、本地目录或本地 `.gguf` 文件。目录中自动检测 GGUF 或 Safetensors | | `--w` | 本地权重目录(Safetensors 或 GGUF)。新命令建议使用 `--m <本地目录>` | | `--f` | GGUF 文件或子文件夹:`--m 仓库 --f 文件.gguf`(精确文件),`--m 仓库 --f 子文件夹`(下载路径下所有 GGUF),或本地 GGUF 路径 | | `--dtype` | 数据类型(`bf16`, `f16`) | | `--isq` | 原位量化:`q4_0`, `q4_1`, `q5_0`, `q5_1`, `q8_0`, `q2k`, `q3k`, `q4k`, `q5k`, `q6k` | | `--kvcache-dtype` | KV 缓存量化:`auto`, `fp8`, `turbo8`, `turbo4`, `turbo3` | | `--kv-fraction` | 模型加载后按剩余显存比例自动计算 KV 缓存大小(默认 `0.6`) | | `--mem` | 固定 KV 缓存预算(MB) | | `--prefill-chunk-size` | 预填充分块大小(默认 8K,`0` 为禁用) | | `--max-gen-tokens` | 每次响应最大输出 token 数(默认:max_sequence_len 的 1/5) | | `--frequency-penalty` | 频率惩罚(−2.0 到 2.0) | | `--presence-penalty` | 存在惩罚(−2.0 到 2.0) | | `--yarn-scaling-factor` | YaRN RoPE 上下文扩展因子 | | `--enforce-parser` | 强制指定工具解析器后端:`qwen_coder`, `qwen`, `json`, `mistral` | | `--ui-server` | 启动内置 ChatGPT 风格 Web UI | | `--multithread` | 使用多线程模式(调试用途) | | `--num-nodes` | 集群中节点总数(多节点推理) | | `--node-rank` | 本节点排名(0 = 主节点) | | `--master-addr` | 主节点 IP 地址 | | `--master-port` | NCCL ID 交换端口(默认 `29500`) | | `--disable-prefix-cache` | 禁用前缀缓存(默认开启) | | `--prefix-cache-max-tokens` | 前缀缓存大小上限 | | `--disable-cuda-graph` | 禁用 CUDA Graph 捕获(CUDA 构建默认开启) | **绑定示例:** ```bash candle-vllm --h 127.0.0.1 --p 8000 --m Qwen/Qwen3.6-27B-FP8 candle-vllm --h 127.0.0.1:8000 --m Qwen/Qwen3.6-27B-FP8 candle-vllm --h '[::1]:8000' --m Qwen/Qwen3.6-27B-FP8 candle-vllm --h unix:///tmp/candle-vllm.sock --m Qwen/Qwen3.6-27B-FP8 ``` --- ## 📚 文档 | 指南 | 说明 | |---|---| | [Rust Crate 用法](docs/rust_crate.md) | 作为 Rust 库使用 | | [Embedding 模型](docs/embedding.md) | 文本嵌入 API | | [MCP & 工具调用](docs/mcp_tool_calling.md) | Model Context Protocol 集成 | | [工具调用解析](docs/tool_parsing.md) | 工具调用检测与解析 | | [Prefix Cache](docs/prefix_cache.md) | 自动 KV 缓存复用 | | [多模态模型](docs/multimodal.md) | 视觉语言模型 | **在 Candle-vLLM 后端下使用 Agent:** [xbot](docs/xbot.md) · [OpenCode](docs/opencode.md) · [Kilo Code](docs/kilocode.md) --- ## 🛠️ 开发计划 * [x] OpenAI 兼容 API 服务器(流式输出) * [x] 持续批处理 * [x] Flash Attention(CUDA) * [x] FlashInfer 后端 * [x] CUDA Graph * [x] 分块预填充 * [x] 前缀缓存(CUDA 和 Metal) * [x] 多 GPU 推理(多进程及多线程) * [x] 多节点张量并行推理(基于 TCP 的 NCCL,无需 MPI) * [x] 原位量化(GGML/GGUF + Marlin) * [x] FP8 KV Cache(CUDA 和 Metal,所有后端) * [x] TurboQuant KV Cache(2–4 位压缩) * [x] FP8 模型(Block-wise,SM90+) * [x] MXFP4/NVFP4 模型支持 * [x] DeepSeek V3.2 和 GLM-5.2 FP8 模型支持 * [x] MCP 集成与工具调用 * [x] 内置 ChatGPT 风格 Web UI --- ## 📚 参考 - Python 实现:[`vllm-project`](https://github.com/vllm-project/vllm) - [`vllm` 论文](https://arxiv.org/abs/2309.06180) ## 报告问题 如果遇到任何问题,请创建 [issue](https://github.com/EricLBuehler/candle-vllm/issues)。