摘要:Caovan vLLM SM75 Turbo3 v0.4.35 是一款面向 NVIDIA RTX 2080 Ti(Turing / SM75)的 vLLM 外部推理加速插件。本版继续采用已经完成实机验证的 vLLM 0.21.0 + FlashInfer + FP8 KV Cache 技术路线,在 v0.4.33 稳定版基础上增加了四卡自动 MTP=4、少于四卡自动 MTP=3,以及面向首次请求卡顿问题的 Worker 侧冷内核预热机制。

一、v0.4.35 的实机验证结果
本次测试使用以下环境:
| 项目 | 测试配置 |
|---|---|
| 操作系统 | Ubuntu 22.04 |
| GPU | 4 × NVIDIA RTX 2080 Ti 22GB,Compute Capability 7.5 |
| Python | Python 3.10.20(本次新服务器实测;Python 3.10/3.11 均可) |
| PyTorch | 2.11.0+cu130 |
| CUDA Runtime | CUDA 13.0 |
| vLLM | 0.21.0 |
| 插件 | Caovan vLLM SM75 Turbo3 v0.4.35 |
| 模型 | Qwen3.6-27B-AWQ-INT4 |
| 上下文 | 262144 tokens |
| KV Cache | FP8 |
| 张量并行 | TP=4 |
| MTP | 插件自动设置为 MTP=4 |
本次分别测试了两类难度和输出形态差异很大的任务:
- 生成一个可以直接部署的网页版俄罗斯方块游戏,要求界面美观、支持键盘操作和音效;(生成一个网页版的“俄罗斯方块”的游戏,要求UI界面漂亮,可以实际通过键盘进行操作,有音效效果!可以直接上线发布!)
- 完成一道包含空间翻折与二面角最值计算的高中立体几何题。(在平面四边形ABCD中,AB=AC=CD=1,\angle ADC=30^{\circ}, \angle DAB =120^{\circ}。将 \triangle ACD 沿 AC 翻折至 \triangle ACP,其中 P 为动点。求二面角 A-CP-B 的 余弦值的最小值。)
测试结果:两道题均正常完成,代码任务可以完整输出,数学推理结果正确,生成过程中没有出现 OOM、乱码、异常短停或推理中断。
在编译和首次真实请求逐步完成后,第一项长输出任务的日志中出现了多个 100 tokens/s 以上的持续区间,最高一个统计区间达到约 112.7 tokens/s;MTP 平均草稿接受率在部分区间达到约 86%~93%。需要强调,这些数据是特定模型、特定提示词、四卡服务器和当前缓存状态下的运行日志,不等于所有设备都能得到完全相同的速度。
二、为什么 v0.4.35 继续使用 vLLM 0.21.0?
插件开发的目标是提高 RTX 2080 Ti 的实际推理性能,而不是单纯追求最新的 vLLM 版本。
在当前 SM75 环境中,vLLM 0.21.0 可以继续使用:
FlashInfer注意力后端;FP8 KV Cache;- 长上下文下更高的 KV Cache 容量;
- 已经完成多轮实测的 GDN + MTP 插件挂载路径。
而较新的 vLLM 版本在 RTX 2080 Ti 上可能需要把 KV Cache 退回 FP16,显存占用和长上下文解码带宽都会受到影响。因此,v0.4.35 选择在已经验证稳定、速度更有优势的 vLLM 0.21.0 基线上继续优化。
三、v0.4.35 的主要功能
1. 四卡自动使用 MTP=4
插件会结合 CUDA_VISIBLE_DEVICES、实际可见 SM75 显卡数量和 --tensor-parallel-size 判断 MTP 深度:
| 实际参与 TP 的 SM75 显卡数量 | 自动 MTP |
|---|---|
| 1~3 张 | MTP=3 |
| 4 张及以上 | MTP=4 |
只有在 --tensor-parallel-size >= 4,并且确实检测到足够的 SM75 显卡时,插件才会设置 MTP=4,避免因为错误的显卡可见性或 TP 参数而误启用。
2. 保留 FP8 KV Cache 与 FlashInfer
启动参数仍可使用:
--kv-cache-dtype fp8
FP8 KV Cache 可以显著降低 KV Cache 的显存占用,对 128K、262K 等长上下文和多请求并发尤其重要。实际日志中应看到:
Using fp8 data type to store kv cache Using FLASHINFER attention backend
3. Worker 侧冷内核预热
旧版本在首次真实请求时可能临时编译以下 Triton 内核,从而造成首个请求长时间等待:
_zero_kv_blocks_kernel _compute_slot_mapping_kernel _copy_page_indices_kernel
v0.4.35 把关键冷内核预热逻辑接入 Worker 启动阶段,并支持严格模式。这样可以尽量把编译成本放到服务启动阶段,而不是让第一个真实用户承担。
4. GDNCore Real Prefill 与 MTP 解码加速
插件保留 v0.4.33 已经验证稳定的 GDNCore Real Prefill、AcceptanceLock、split-QK 与 fused V/GDN 解码路径,重点减少 SM75 上 MTP 解码阶段的小内核调度和中间显存读写。
5. AutoMem 与 Elastic-KV
用户没有手动指定 --gpu-memory-utilization 时,插件会根据显卡显存、上下文长度、并发数、Batch Token 数和 MTP 深度自动保留安全显存空间。
例如本次四卡、262K、MTP=4 的测试中,插件自动注入了约:
--gpu-memory-utilization 0.868
普通用户建议先让插件自动计算,不要直接照搬其他服务器的显存利用率。
四、Prefill 和首字延迟
这是很多用户非常关心的问题。首先需要区分三个概念:
| 概念 | 含义 |
|---|---|
| Prefill | 模型读取和处理用户输入提示词的阶段。 |
| 首字延迟 / TTFT | 从提交请求到收到第一个输出 Token 的时间。 |
| Decode 速度 | 首个 Token 之后持续生成内容的速度,通常以 tokens/s 表示。 |
v0.4.35 教程提供了独立 Prefill 基准脚本:使用 vLLM 0.21 官方 vllm bench serve,分别测试 2K、4K、8K、16K、32K 输入,输出固定为 1 Token、并发固定为 1,并记录每次请求的 TTFT。随后通过“TTFT = 固定开销 + 输入Token数 / Prefill速度”做线性回归,计算 Prefill tokens/s,同时给出每种上下文长度的 TTFT 中位数和 P90。这样可以把持续 Decode 和大部分固定请求开销分离开,数据比直接读取日志中的 Avg prompt throughput 更可靠。不同服务器、模型、GPU数量和上下文长度结果会不同,建议以脚本生成的实机报告为准。
本次四卡服务器的 Prefill 实测结果
在 4×RTX 2080 Ti 22GB、vLLM 0.21.0、Turbo3 v0.4.35、Qwen3.6-27B-AWQ-INT4、TP=4、MTP=4、FP8 KV Cache、单并发、输出 1 Token 的条件下,得到以下结果:
| 输入长度 | TTFT中位数 | TTFT P90 | 端到端有效Prefill |
|---|---|---|---|
| 2048 tokens | 1.151 秒 | 1.153 秒 | 1780 tokens/s |
| 4096 tokens | 2.274 秒 | 2.280 秒 | 1801 tokens/s |
| 8192 tokens | 3.815 秒 | 3.824 秒 | 2147 tokens/s |
| 16384 tokens | 5.778 秒 | 5.790 秒 | 2836 tokens/s |
| 32768 tokens | 12.203 秒 | 12.209 秒 | 2685 tokens/s |
多长度回归 Prefill 速度:约 2873 tokens/s。
固定开销估计约 0.625 秒,拟合优度
R²=0.9930。R² 接近 1,说明测试结果具有较好的线性一致性。
统计时已经剔除每组测试的第一个正式请求。原因是 vLLM 0.21 的基准预热会复用第一条提示词,主测试随后又包含同一条提示词;开启 Prefix Cache 时,这个样本可能命中缓存,从而获得不真实的超低 TTFT。修正版测试脚本默认发送 8 个正式请求,剔除第一个后保留 7 个有效样本。
五、安装前准备
本文以 Ubuntu 22.04、x86_64 服务器为例。建议先确认 NVIDIA 驱动和显卡识别正常:
nvidia-smi uname -m lsb_release -a

RTX 2080 Ti 的计算能力应为 7.5。安装基础工具:
sudo -v sudo apt update sudo apt install -y wget curl git unzip build-essential ninja-build
检查 CUDA Toolkit 与 ptxas
vLLM 的预编译包会携带主要 CUDA 运行时依赖,但 Triton 编译仍建议系统中存在可用的 ptxas:
which ptxas || true /usr/local/cuda/bin/ptxas --version
本文实测使用 CUDA 13.0,并设置:
TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas
如果该文件不存在,请先按照 NVIDIA 对应 Ubuntu 版本的官方方式安装 CUDA Toolkit。已经配置 NVIDIA CUDA 软件源的系统,可尝试:
sudo apt update sudo apt install -y cuda-toolkit-13-0
六、安装 Miniconda
1. 下载 Miniconda 安装程序
cd /tmp wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
2. 安装到当前用户目录
bash Miniconda3-latest-Linux-x86_64.sh -b -p "$HOME/miniconda3"
参数说明:
-b:批处理模式,不进入交互式安装界面;-p "$HOME/miniconda3":把 Miniconda 安装到当前用户家目录。
3. 加载 Conda
source ~/miniconda3/etc/profile.d/conda.sh
4. 初始化 Bash
conda init bash conda config --set auto_activate_base false
执行完成后可以关闭并重新打开终端,也可以继续手动执行:
source ~/.bashrc
5. 确认 Conda 安装成功
conda --version
七、新建 vLLM 虚拟环境
建议为本插件单独建立环境,不要和其他 vLLM 版本混装。本次客户新服务器使用 Python 3.10.20 已完成正常启动、复杂代码生成和数学推理测试,证明插件可以正常运行在 Python 3.10 环境中。Python 3.11 也可以使用,但并非硬性要求。
source ~/miniconda3/etc/profile.d/conda.sh conda create -n caovan-vllm python=3.10 -y && conda activate caovan-vllm
上面的 caovan-vllm 只是虚拟环境名称,也可以改成 vllm 或其他名称,但后续激活环境时必须使用相同名称。例如:
conda create -n vllm python=3.10 -y && conda activate vllm
确认当前 Python 来自新环境:
which python python --version
升级 Python 安装工具:
python -m pip install --upgrade pip setuptools wheel
八、安装 vLLM 0.21.0
重要:v0.4.35 当前正式验证的主线是 vLLM==0.21.0。不要在同一环境中安装 vLLM 0.24 或其他未验证版本。
安装 vLLM:
source ~/miniconda3/etc/profile.d/conda.sh conda activate caovan-vllm python -m pip install "vllm==0.21.0"
安装过程会同时安装匹配的 PyTorch、Triton、FlashInfer 和其他依赖。安装完成后检查:
python - <<'PY'
import sys
import platform
import torch
import vllm
print("Python version:", platform.python_version())
print("Python full version:", sys.version.replace("\n", " "))
print("Python executable:", sys.executable)
print("PyTorch:", torch.__version__)
print("PyTorch CUDA:", torch.version.cuda)
print("vLLM:", vllm.__version__)
print("CUDA available:", torch.cuda.is_available())
print("GPU count:", torch.cuda.device_count())
for i in range(torch.cuda.device_count()):
p = torch.cuda.get_device_properties(i)
print(
f"GPU {i}: {p.name}, "
f"capability={p.major}.{p.minor}, "
f"VRAM={p.total_memory / 1024**3:.2f} GiB"
)
PY
本文实测结果为:
Python version: 3.10.20 Python full version: 3.10.20 (main, Jun 11 2026, 15:17:37) [GCC 14.3.0] Python executable: /home/user/miniconda3/envs/caovan-vllm/bin/python PyTorch: 2.11.0+cu130 PyTorch CUDA: 13.0 vLLM: 0.21.0 CUDA available: True GPU count: 4 GPU 0: NVIDIA GeForce RTX 2080 Ti, capability=7.5, VRAM=21.48 GiB GPU 1: NVIDIA GeForce RTX 2080 Ti, capability=7.5, VRAM=21.48 GiB GPU 2: NVIDIA GeForce RTX 2080 Ti, capability=7.5, VRAM=21.48 GiB GPU 3: NVIDIA GeForce RTX 2080 Ti, capability=7.5, VRAM=21.48 GiB

实际安装结果可能因官方发布包和平台不同而存在小版本差异。当前已实测 Python 3.10.20 可以正常运行插件;Python 3.10 与 Python 3.11 均属于推荐范围。关键是确认 vLLM 为 0.21.0,并且 GPU 能够被 PyTorch 正确识别。
九、安装 Caovan vLLM SM75 Turbo3 v0.4.35
下载插件:
1. 将插件压缩包上传到用户家目录
假设插件文件位于:
~/caovan-vllm-sm75-turbo3-v0.4.35-external-plugin.zip
2. 解压插件
cd ~ unzip -o caovan-vllm-sm75-turbo3-v0.4.35-external-plugin.zip
3. 激活 vLLM 环境
source ~/miniconda3/etc/profile.d/conda.sh conda activate caovan-vllm
4. 进入插件目录
cd ~/caovan-vllm-sm75-turbo3-v0.4.35
5. 卸载旧版插件
python -m pip uninstall -y caovan-vllm-sm75-turbo3
如果从未安装过旧版,出现“未找到已安装包”的提示可以忽略。
6. 安装 v0.4.35 Wheel
python -m pip install --no-deps --force-reinstall \ ./dist/caovan_vllm_sm75_turbo3-0.4.35-py3-none-any.whl
参数说明:
--no-deps:不让插件重新修改当前已经安装好的 vLLM、PyTorch 和 Triton 依赖;--force-reinstall:即使系统中存在同版本,也强制重新安装完整 Wheel。
十、安装后环境检查
source ~/miniconda3/etc/profile.d/conda.sh
conda activate caovan-vllm
python - <<'PY'
import torch
import vllm
import caovan_vllm_sm75_turbo3 as caovan
print("torch=", torch.__version__)
print("torch CUDA=", torch.version.cuda)
print("vLLM=", vllm.__version__)
print("plugin=", caovan.__version__)
print("CUDA available=", torch.cuda.is_available())
print("GPU count=", torch.cuda.device_count())
for i in range(torch.cuda.device_count()):
print(
i,
torch.cuda.get_device_name(i),
torch.cuda.get_device_capability(i)
)
PY
本文实测结果为:
torch= 2.11.0+cu130 torch CUDA= 13.0 vLLM= 0.21.0 plugin= 0.4.35 CUDA available= True GPU count= 4 0 NVIDIA GeForce RTX 2080 Ti (7, 5) 1 NVIDIA GeForce RTX 2080 Ti (7, 5) 2 NVIDIA GeForce RTX 2080 Ti (7, 5) 3 NVIDIA GeForce RTX 2080 Ti (7, 5)

其中,下面的内容应该包含在每个用户的测试结果中:
vLLM= 0.21.0 plugin= 0.4.35 CUDA available= True
十一、运行插件 Doctor
Doctor 会检查 Python、PyTorch、CUDA、Triton、vLLM、SM75 显卡、插件入口、GDN 接口、模型路径、自动 MTP 和自动显存策略。
四卡、262K 上下文参考命令:
source ~/miniconda3/etc/profile.d/conda.sh conda activate caovan-vllm caovan-sm75-doctor /home/user/models/Qwen3.6-27B-AWQ-INT4 \ --tensor-parallel-size 4 \ --max-model-len 262144 \ --max-num-seqs 4 \ --max-num-batched-tokens 8192

请把模型路径改为自己的路径。四卡时应看到类似:
AutoSpec 结果:MTP=4 vLLM 状态:PASS 插件入口发现:PASS GDN 接口检查:PASS
十二、验证 Turbo3 内核与模型结构(可选步骤)
1. 使用一张 GPU 运行内核验证
CUDA_VISIBLE_DEVICES=0 caovan-sm75-verify
该命令使用合成张量进行结构安全测试,不会加载完整模型。
2. 检查模型配置
caovan-sm75-check-model /home/user/models/Qwen3.6-27B-AWQ-INT4
静态检查通过只代表模型属于兼容候选。插件是否真实生效,仍需结合启动日志和实际请求判断。
十三、四卡完整启动命令
不同用户应根据自己的模型路径、GPU 数量、端口和上下文需求自行设置启动参数。
cd ~
source ~/miniconda3/etc/profile.d/conda.sh
conda activate caovan-vllm
export CUDA_VISIBLE_DEVICES=0,1,2,3
export OMP_NUM_THREADS=12
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export PYTORCH_NVML_BASED_CUDA_CHECK=1
export CAOVAN_REQUIRE_TURBO3=1
export CAOVAN_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/caovan-sm75-turbo3"
export CAOVAN_COLD_KERNEL_WARMUP=1
export CAOVAN_COLD_KERNEL_WARMUP_STRICT=1
unset CAOVAN_FLASHQLA_PRECOMPILE
unset CAOVAN_FLASHQLA_FORCE
unset CAOVAN_FLASHQLA_DISABLE
export TORCHINDUCTOR_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/torchinductor"
export TORCHINDUCTOR_COMPILE_THREADS=1
export TRITON_CACHE_AUTOTUNING=1
export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas
VER="v0.4.35-vllm021"
TS="$(date +%Y%m%d-%H%M%S)"
LOG_DIR="$HOME/caovan-vllm-logs"
LOG_FILE="$LOG_DIR/${VER}-serve-${TS}.log"
mkdir -p "$LOG_DIR"
echo "日志:$LOG_FILE"
caovan-vllm-serve /home/user/models/Qwen3.6-27B-AWQ-INT4 \
--host 0.0.0.0 \
--port 8000 \
--served-model-name Qwen3.6-27B-AWQ-INT4 \
--tensor-parallel-size 4 \
--dtype half \
--max-model-len 262144 \
--max-num-seqs 4 \
--max-num-batched-tokens 8192 \
--kv-cache-dtype fp8 \
--disable-custom-all-reduce \
--enable-prefix-caching \
--mamba-cache-mode align \
--additional-config '{"caovan":true,"caovan_mode":"auto","caovan_require_turbo3":true}' \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
2>&1 | tee "$LOG_FILE"
必须修改的内容:
/home/user/models/Qwen3.6-27B-AWQ-INT4:改成自己的模型路径;Qwen3.6-27B-AWQ-INT4:可改成自己的服务名称;CUDA_VISIBLE_DEVICES和--tensor-parallel-size:按实际显卡数量修改;--port:端口被占用时改成其他端口。
如果你不想生成完整的log日志文件,你可以使用下面的启动参数:
cd ~
source ~/miniconda3/etc/profile.d/conda.sh
conda activate caovan-vllm
export CUDA_VISIBLE_DEVICES=0,1,2,3
export OMP_NUM_THREADS=12
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export PYTORCH_NVML_BASED_CUDA_CHECK=1
export CAOVAN_REQUIRE_TURBO3=1
export CAOVAN_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/caovan-sm75-turbo3"
export CAOVAN_COLD_KERNEL_WARMUP=1
export CAOVAN_COLD_KERNEL_WARMUP_STRICT=1
unset CAOVAN_FLASHQLA_PRECOMPILE
unset CAOVAN_FLASHQLA_FORCE
unset CAOVAN_FLASHQLA_DISABLE
export TORCHINDUCTOR_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/torchinductor"
export TORCHINDUCTOR_COMPILE_THREADS=1
export TRITON_CACHE_AUTOTUNING=1
export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas
caovan-vllm-serve /home/user/models/Qwen3.6-27B-AWQ-INT4 \
--host 0.0.0.0 \
--port 8000 \
--served-model-name Qwen3.6-27B-AWQ-INT4 \
--tensor-parallel-size 4 \
--dtype half \
--max-model-len 262144 \
--max-num-seqs 4 \
--max-num-batched-tokens 8192 \
--kv-cache-dtype fp8 \
--disable-custom-all-reduce \
--enable-prefix-caching \
--mamba-cache-mode align \
--additional-config '{"caovan":true,"caovan_mode":"auto","caovan_require_turbo3":true}' \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder
十四、环境变量详细说明
| 环境变量 | 作用 |
|---|---|
CUDA_VISIBLE_DEVICES=0,1,2,3 |
指定当前服务可以看到哪些 GPU。这里表示使用物理编号 0、1、2、3。 |
OMP_NUM_THREADS=12 |
限制 CPU OpenMP 线程数量,避免多进程环境下线程数过度膨胀。 |
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True |
启用可扩展 CUDA 显存段,降低显存碎片风险。 |
PYTORCH_NVML_BASED_CUDA_CHECK=1 |
让 PyTorch 优先通过 NVML 检查 CUDA 状态,多进程启动时更稳妥。 |
CAOVAN_REQUIRE_TURBO3=1 |
要求 Turbo3 必须正确加载。如果插件核心路径没有生效,阻止静默退回普通路径。 |
CAOVAN_CACHE_DIR |
保存 Caovan 插件缓存、锁文件和预热标记。 |
CAOVAN_COLD_KERNEL_WARMUP=1 |
启用 Worker 侧冷内核预热。 |
CAOVAN_COLD_KERNEL_WARMUP_STRICT=1 |
启用严格预热模式。关键内核预热失败时直接报告错误,避免把故障留到第一个用户请求。 |
unset CAOVAN_FLASHQLA_* |
清除旧 FlashQLA 实验变量,确保使用当前自研 GDNCore 路径。 |
TORCHINDUCTOR_CACHE_DIR |
指定 TorchInductor 编译缓存目录。不要频繁删除,否则下次启动需要重新编译。 |
TORCHINDUCTOR_COMPILE_THREADS=1 |
限制 Inductor 编译线程,降低多 Worker 同时编译造成的 CPU 和内存压力。 |
TRITON_CACHE_AUTOTUNING=1 |
允许 Triton 使用和复用自动调优缓存。 |
TRITON_PTXAS_PATH |
明确指定 CUDA 汇编器 ptxas 的路径。 |
VER / TS / LOG_FILE |
生成包含版本号和时间戳的完整日志文件,便于排错与性能对比。 |
十五、vLLM 启动参数详细说明
| 参数 | 作用与建议 |
|---|---|
caovan-vllm-serve 模型路径 |
使用插件提供的启动入口运行模型。第一个位置参数是本地模型目录或 Hugging Face 模型标识。 |
--host 0.0.0.0 |
监听所有网络接口。只供本机使用时可以改为 127.0.0.1。 |
--port 8000 |
OpenAI 兼容 API 服务端口。 |
--served-model-name |
API 请求中填写的模型名称,可以与本地文件夹名称不同。 |
--tensor-parallel-size 4 |
将模型张量切分到 4 张 GPU。该值必须与实际参与推理的 GPU 数量匹配。 |
--dtype half |
模型非量化计算部分使用 FP16。 |
--max-model-len 262144 |
最大上下文长度为 262144 tokens。上下文越大,KV Cache 和启动规划开销越高。 |
--max-num-seqs 4 |
调度器同时管理的最大序列数量。它不是 MTP 深度。 |
--max-num-batched-tokens 8192 |
每轮调度允许处理的最大 Token 总数。较大值有利于吞吐,但会增加瞬时显存和调度压力。 |
--kv-cache-dtype fp8 |
使用 FP8 保存 KV Cache,降低长上下文显存占用并减少解码阶段的数据读取量。 |
--disable-custom-all-reduce |
禁用 vLLM 自定义 All-Reduce,使用 NCCL/PyNCCL 路径。在部分老卡和复杂拓扑下更稳定。 |
--enable-prefix-caching |
重复前缀请求可以复用已计算的缓存,降低重复 Prefill 成本。 |
--mamba-cache-mode align |
让混合 Attention/Mamba/GDN 模型的缓存页进行对齐。 |
--additional-config |
启用 Caovan 插件自动模式,并要求 Turbo3 路径必须可用。 |
--reasoning-parser qwen3 |
解析 Qwen3 系列模型的思考内容。 |
--enable-auto-tool-choice |
允许模型自动决定是否进行工具调用。 |
--tool-call-parser qwen3_coder |
使用适配 Qwen3 Coder 格式的工具调用解析器。 |
2>&1 | tee "$LOG_FILE" |
把标准输出和错误输出同时显示在终端,并完整写入日志文件。 |
十六、两卡如何启动?
两卡示例:
export CUDA_VISIBLE_DEVICES=0,1
并把启动参数改为:
--tensor-parallel-size 2
少于四张参与 TP 的 SM75 GPU 时,插件自动使用 MTP=3。
两卡完整启动参数(不带生成log日志文件)
cd ~
source ~/miniconda3/etc/profile.d/conda.sh
conda activate caovan-vllm
export CUDA_VISIBLE_DEVICES=0,1
export OMP_NUM_THREADS=12
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
export PYTORCH_NVML_BASED_CUDA_CHECK=1
export CAOVAN_REQUIRE_TURBO3=1
export CAOVAN_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/caovan-sm75-turbo3"
export CAOVAN_COLD_KERNEL_WARMUP=1
export CAOVAN_COLD_KERNEL_WARMUP_STRICT=1
unset CAOVAN_FLASHQLA_PRECOMPILE
unset CAOVAN_FLASHQLA_FORCE
unset CAOVAN_FLASHQLA_DISABLE
export TORCHINDUCTOR_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/torchinductor"
export TORCHINDUCTOR_COMPILE_THREADS=1
export TRITON_CACHE_AUTOTUNING=1
export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas
caovan-vllm-serve /home/user/models/Qwen3.6-27B-AWQ-INT4 \
--host 0.0.0.0 \
--port 8000 \
--served-model-name Qwen3.6-27B-AWQ-INT4 \
--tensor-parallel-size 2 \
--dtype half \
--max-model-len 262144 \
--max-num-seqs 4 \
--max-num-batched-tokens 8192 \
--kv-cache-dtype fp8 \
--disable-custom-all-reduce \
--enable-prefix-caching \
--mamba-cache-mode align \
--additional-config '{"caovan":true,"caovan_mode":"auto","caovan_require_turbo3":true}' \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder
两卡启动参数状态下,两道测试题的表现:
- 生成一个可以直接部署的网页版俄罗斯方块游戏,要求界面美观、支持键盘操作和音效;(生成一个网页版的“俄罗斯方块”的游戏,要求UI界面漂亮,可以实际通过键盘进行操作,有音效效果!可以直接上线发布!)

- 完成一道包含空间翻折与二面角最值计算的高中立体几何题。(在平面四边形ABCD中,AB=AC=CD=1,\angle ADC=30^{\circ}, \angle DAB =120^{\circ}。将 \triangle ACD 沿 AC 翻折至 \triangle ACP,其中 P 为动点。求二面角 A-CP-B 的 余弦值的最小值。)

十七、如何手动对比 MTP=3 和 MTP=4?
四卡环境默认自动使用 MTP=4。需要强制测试 MTP=3 时,在启动前增加:
export CAOVAN_AUTO_SPEC=3
恢复四卡自动 MTP=4:
unset CAOVAN_AUTO_SPEC
公平对比时必须保持同一模型、同一提示词、同一最大输出长度、同一采样参数和相同缓存状态。建议至少测试三轮,并同时记录:
- 持续生成 tokens/s;
- MTP Mean acceptance length;
- Avg Draft acceptance rate;
- 首字延迟;
- 显存占用;
- 输出是否完整、正确和稳定。
十八、如何确认插件真正生效?
启动日志中应重点检查以下内容:
Caovan vLLM SM75 Turbo3 external plugin v0.4.35 speculative_config=auto MTP=4 vllm=0.21.0 Using fp8 data type to store kv cache Using FLASHINFER attention backend [Caovan GDNCore] ACTIVE REAL PREFILL Application startup complete
实际请求后,还可以检查 Caovan 专用内核:
grep -E "caovan_sm75|caovan_gdncore|SpecDecoding metrics|Avg generation throughput" \ ~/caovan-vllm-logs/v0.4.35-vllm021-serve-*.log
十九、测速方法
服务启动并完成一次预热后,可以使用插件自带基准工具:
source ~/miniconda3/etc/profile.d/conda.sh conda activate caovan-vllm caovan-sm75-benchmark \ --model Qwen3.6-27B-AWQ-INT4 \ --max-tokens 768 \ --repeats 3 \ --output ~/caovan-vllm-logs/v0.4.35-benchmark.json
请把模型名称改成自己的 --served-model-name。
该工具会输出每次请求的:
- 完成 Token 数;
- 总耗时;
- 平均 tokens/s;
- 输出字符数;
- 输出内容摘要哈希;
- 全部测试的平均速度和中位数。
当前基准工具测量的是整个非流式请求的平均生成速度,不等同于独立的 Prefill 吞吐或 TTFT 测试。
二十、常见日志说明
1. FA2 不支持 SM75
Cannot use FA version 2 ... compute capability >= 8
RTX 2080 Ti 是 SM75,不支持 FlashAttention 2。只要后续日志正常选择:
Using FLASHINFER attention backend
并最终完成服务启动,该提示不代表整个服务启动失败。
2. 首次启动出现 shared memory broadcast 提示
No available shared memory broadcast block found in 60 seconds
如果它出现在第一次 torch.compile 或 AOT 编译期间,而 Worker 日志仍在继续、最终能够出现 Application startup complete,通常表示某个 Worker 正在执行耗时编译,不一定是死锁。
如果它在 API 已启动之后持续重复,并且请求长时间没有任何输出,则需要检查是否仍有未覆盖的首次请求 JIT、Worker 异常或多卡通信阻塞。
3. 第一个请求仍出现 JIT compilation during inference
v0.4.35 已经预热关键公共内核,但不同模型、不同 Batch、不同输入长度和 MTP 形状仍可能触发新的编译变体。正式上线前执行一次 caovan-sm75-warmup 是当前更稳妥的生产部署方法。
4. 第一次启动很慢,第二次明显更快
这是 TorchInductor、AOT 和 Triton 缓存生效后的正常现象。不要随意删除:
~/.cache/torchinductor ~/.cache/vllm ~/.cache/caovan-sm75-turbo3
删除这些目录会让下次启动重新编译。
二十一、卸载插件
source ~/miniconda3/etc/profile.d/conda.sh conda activate caovan-vllm python -m pip uninstall -y caovan-vllm-sm75-turbo3
插件是独立 Wheel,不需要恢复被覆盖的 vLLM 源码文件。
二十二、总结
Caovan vLLM SM75 Turbo3 v0.4.35 的重点不是追逐最新框架版本,而是在 RTX 2080 Ti 仍然具有实际优势的 vLLM 0.21.0 + FlashInfer + FP8 KV Cache 基线上继续提升性能和稳定性。
本次四卡实测证明:
- 四卡自动 MTP=4 正常生效;
- 262K 上下文与 FP8 KV Cache 可以正常启动;
- 复杂代码生成和数学推理均能完整正确输出;
- 测试过程中没有出现 OOM;
- 预热后长输出可以进入 100 tokens/s 以上区间;
- 第一个冷请求仍可能存在模型特定 JIT,生产环境建议在开放流量前执行一次主动预热。
原创文章,作者:朋远方,如若转载,请注明出处:https://caovan.com/caovan-vllm-sm75-turbo3-v0435-rtx-2080ti-guide/.html


微信扫一扫
