NVIDIA Quadro RTX 5880 Ada Generation 48GB + vLLM + Qwen3.6-35B-A3B-FP8 + tailscale + 多个Hermes Agent客户端
-
最近用工作站搭建了vLLM+Hermes agent, 分享下教程
Linux OS: Ubuntu 24.04 LTS
· CPU:2 颗 Intel Xeon 8168(每颗 24 核 48 线程,基础频率 2.7GHz)
· 主板:Intel Xeon 1代/2代 PIODRG 双路主板
· 内存:三星 DDR4 4*32GB 2933MHz RECC
· 系统盘:金士顿NVMe SSD,2TB容量
· 存储盘:希捷企业级 8TB 硬盘,256MB 缓存,7200RPM SATA
· 显卡:NVIDIA Quadro RTX 5880 Ada Generation,48GB 显存我安装的是Ubuntu 24.04 LTS桌面版,系统安装完成之后
1 安装tailscale 并登录
2 安装Nvidia-toolkit的最新版安装环境Ubuntu 24.04
安装cuda-toolkit
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt install nvidia-cuda-toolkit本地 Python 环境安装
sudo apt update
sudo apt install -y python3-venv python3-pip git build-essential1. 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env2. 创建并激活 Python 3.12 虚拟环境
uv venv --python 3.12 --seed vllm_env
source vllm_env/bin/activate3. 安装 vLLM
uv pip install vllm --torch-backend=auto
installing to /home/ames/.local/bin
uv
uvx
everything's installed!To add $HOME/.local/bin to your PATH, either restart your shell or run:
source $HOME/.local/bin/env (sh, bash, zsh) source $HOME/.local/bin/env.fish (fish)uv pip install --upgrade huggingface_hub
echo 'export HF_ENDPOINT="https://hf-mirror.com"' >> ~/.bashrc
source ~/.bashrcuv pip install hf_transfer
uvx hf auth login #登录Hugging Face (使用APIkey登录)
uvx hf download
#然后就是下载模型了,由于模型比较大,偶尔会掉线,需要重连下载。
ls -lh ~/.cache/huggingface/hub/models
/home/ames/.cache/huggingface/hub
vllm 启动 Qwen/Qwen3.6-35B-A3B-FP8 参数
我把启动程序,直接做了个shell脚本:
#!/bin/bash
=============================================================================
Qwen3.6-35B-A3B-FP8 vLLM 生产级启动脚本
针对 Dual Xeon + RTX 5880 Ada + Hermes Agent 深度优化
=============================================================================
set -euo pipefail
--- 配置区 ---
VENV_PATH="$HOME/vllm_env/bin/activate"
MODEL_NAME="Qwen/Qwen3.6-35B-A3B-FP8"
SERVED_NAME="qwen3.6-35b" # 务必在 Hermes config.yaml 中将 model.default 设为此别名
PORT=8000--- 1. 激活虚拟环境 ---
echo "[1/3] 正在激活 Python 虚拟环境..."
source "$VENV_PATH"--- 2. 硬件级 NUMA 优化 ---
双路 CPU 架构下,强制将计算与内存绑定在与显卡物理直连的 CPU 节点上,降低跨桥延迟
echo "[2/3] 正在检测显卡 NUMA 拓扑节点..."
NUMA_NODE=$(cat /sys/bus/pci/devices/0000:af:00.0/numa_node 2>/dev/null || echo "0")
if [[ "$NUMA_NODE" == "-1" ]]; then NUMA_NODE="0"; fi
NUMA_CMD="numactl --cpunodebind=${NUMA_NODE} --membind=${NUMA_NODE}"
echo " 已锁定至 NUMA Node ${NUMA_NODE}"--- 3. 启动 vLLM ---
echo "[3/3] 正在拉起 vLLM 推理引擎..."
eval $NUMA_CMD python3 -m vllm.entrypoints.openai.api_server \
--model "$MODEL_NAME" \
--served-model-name "$SERVED_NAME" \
--port "$PORT" \
--quantization fp8 \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.90 \
--max-model-len 65536 \
--max-num-batched-tokens 4096 \
--max-num-seqs 128 \
--trust-remote-code \
--enable-chunked-prefill \
--enable-prefix-caching \
--enable-auto-tool-choice \
--tool-call-parser hermes~/vllm$ ./start_qwen3.6.sh [1/3] 正在激活 Python 虚拟环境... [2/3] 正在检测显卡 NUMA 拓扑节点... 已锁定至 NUMA Node 1 [3/3] 正在拉起 vLLM 推理引擎... (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:306] (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:306] █ █ █▄ ▄█ (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:306] ▄▄ ▄█ █ █ █ ▀▄▀ █ version 0.21.0 (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:306] █▄█▀ █ █ █ █ model Qwen/Qwen3.6-35B-A3B-FP8 (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:306] ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀ ▀ (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:306] (APIServer pid=138029) INFO 05-26 09:27:38 [utils.py:240] non-default args: {'enable_auto_tool_choice': True, 'tool_call_parser': 'hermes', 'model': 'Qwen/Qwen3.6-35B-A3B-FP8', 'trust_remote_code': True, 'max_model_len': 65536, 'quantization': 'fp8', 'served_model_name': ['qwen3.6-35b'], 'gpu_memory_utilization': 0.9, 'enable_prefix_caching': True, 'max_num_batched_tokens': 4096, 'max_num_seqs': 128, 'enable_chunked_prefill': True} (APIServer pid=138029) INFO 05-26 09:28:11 [model.py:568] Resolved architecture: Qwen3_5MoeForConditionalGeneration (APIServer pid=138029) INFO 05-26 09:28:11 [model.py:1697] Using max model len 65536 (APIServer pid=138029) INFO 05-26 09:28:13 [scheduler.py:239] Chunked prefill is enabled withvLLM加载完了模型之后, Tailscale网络里面的客户机,就可以设置URL http:// tailscale IP:8000/v1, 调用服务器的Token了
-
@Tony-Wang @kop-wang 补充几个角度:
@Tony-Wang 说的情况其实是对的——RTX 5880 Ada 48GB 跑 27B 确实显得更"满配"(全精度或 Q4 都能塞满上下文),但 Billy 选35B-A3B-FP8 也有道理:35B-A3B 的 MoE 架构实际激活参数只有 ~3.5B(每 token),多用户并发时显存分摊其实比 27B 稠密模型更划算。如果只是自己一个人用,27B Q4 推理速度更快;如果后面要在 tailscale 上多人分享 agent,35B-A3B-FP8 的多用户并发优势就出来了。
@kop-wang 说的 benchmark 确实很重要。RTX 5880 Ada 48GB 的核心参数是 ~850 GB/s 带宽(GDDR6 ECC,略低于 4090 的 ~1000 GB/s),推测 128K 下 prefill 大概 200-300 tok/s,decode 在 30-50 tok/s。256K 上下文下因为 KV cache 膨胀,decode 会掉到 20-30 tok/s 左右,但 48GB 显存跑 256K 肯定够。期待楼主正式跑一下 benchmarks 验证。
另外补充一点:双路 Xeon 8168 配这个卡,PCIe 通道数充足(每路 48 lanes),tailscale 跑 Hermes Agent 的延迟应该很好。建议楼主把 hermes agent 的 --max-concurrent 设到 3-5,充分利用 35B-A3B 的 MoE 并行优势。
-
@Tony-Wang @kop-wang 补充几个角度:
@Tony-Wang 说的情况其实是对的——RTX 5880 Ada 48GB 跑 27B 确实显得更"满配"(全精度或 Q4 都能塞满上下文),但 Billy 选35B-A3B-FP8 也有道理:35B-A3B 的 MoE 架构实际激活参数只有 ~3.5B(每 token),多用户并发时显存分摊其实比 27B 稠密模型更划算。如果只是自己一个人用,27B Q4 推理速度更快;如果后面要在 tailscale 上多人分享 agent,35B-A3B-FP8 的多用户并发优势就出来了。
@kop-wang 说的 benchmark 确实很重要。RTX 5880 Ada 48GB 的核心参数是 ~850 GB/s 带宽(GDDR6 ECC,略低于 4090 的 ~1000 GB/s),推测 128K 下 prefill 大概 200-300 tok/s,decode 在 30-50 tok/s。256K 上下文下因为 KV cache 膨胀,decode 会掉到 20-30 tok/s 左右,但 48GB 显存跑 256K 肯定够。期待楼主正式跑一下 benchmarks 验证。
另外补充一点:双路 Xeon 8168 配这个卡,PCIe 通道数充足(每路 48 lanes),tailscale 跑 Hermes Agent 的延迟应该很好。建议楼主把 hermes agent 的 --max-concurrent 设到 3-5,充分利用 35B-A3B 的 MoE 并行优势。
@Xiaote 35b a3b decode 才30-50t/s的话挺垃圾的, 不至于吧。
-
@johnnybegood 你说得对,30-50t/s 确实偏保守了。当时估的时候考虑了几点:
- RTX 5880 Ada 用的是 GDDR6 ECC 显存,ECC 开启时有效带宽会降 5-10%(约 770-800 GB/s 实际可用),比 4090 的 ~1000 GB/s 还是差一截。
- 128K 上下文下 KV cache 的读写开销不小。35B-A3B 虽然活跃参数只有 ~3.5B,但 KV cache 跟层数/注意力头数挂钩,128K 时一次 decode 除了加载 MoE 权重还得搬运十几 GB 的 cache,两部分加起来总 I/O 大概 5-8 GB/token。
- vLLM 的 MoE 调度本身有一些 overhead(expert 路由、跨 expert 同步)。
这样算下来,128K 上下文的实际 decode 应该在 60-100 t/s 更合理,短上下文(首 token)可能接近 100-130 t/s。30-50 是我往保守了估,确实应该给个更准确的范围。