3.7 KiB
3.7 KiB
4GB 显存多 GPU 服务共存方案(2026-09-01 实测)
场景:RTX 3050 Laptop 4GB 显存 + bge-embed + llama.cpp 7B 同时跑。
显存分配(实测数据)
GPU 总显存: 4096 MiB
├── Xorg / cinnamon / desktop: ~170 MiB
├── bge-embed (Vulkan/CUDA): ~600 MiB
├── llama.cpp 7B (Vulkan GPU 全量): ~2700 MiB
└── 剩余可用: ~626 MiB
4GB 显存装不下 7B Q3(3.6GB)+ bge(600MB)。
性能取舍矩阵
| 配置 | llama 7B 速度 | bge embedding | 备注 |
|---|---|---|---|
| 双方都跑 GPU(不现实,OOM) | — | — | 4GB 显存装不下,会 fallback |
| bge GPU + llama CPU | 9 t/s | 0.5s | v1 默认 |
| bge CPU + llama GPU(推荐) | 24-25 t/s(27/29 层全 GPU,-ngl 27 -fit off) |
2-3s | v2 平衡方案 |
| bge CPU + llama 半 GPU | 12 t/s | 2-3s | 旧状态(已淘汰) |
| 都跑 CPU | 9 t/s | 2-3s | 退化方案 |
切换步骤(v1 → v2)
# 1. 备份当前 bge 脚本
cp /home/muc/.hermes/scripts/bge_embed_server.py /home/muc/.hermes/scripts/bge_embed_server.py.bak.gpu
# 2. 改 providers 列表
sed -i 's/providers=\["CUDAExecutionProvider", "CPUExecutionProvider"\]/providers=["CPUExecutionProvider"]/' \
/home/muc/.hermes/scripts/bge_embed_server.py
# 3. 重启
systemctl --user restart bge-embed
sleep 10
curl -s http://localhost:8000/health # 应含 "CPUExecutionProvider"
# 4. llama-server 重启释放 + 重新加载更多层到 GPU
systemctl --user restart llama-server-7b
sleep 15
nvidia-smi --query-gpu=memory.used --format=csv,noheader # 应 ~2700MB
# 5. 测速度
time curl -s -X POST http://localhost:8080/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"local","messages":[{"role":"user","content":"写诗"}],"max_tokens":100}'
# 应 ~7-8s (14-15 t/s)
关键诊断
# 1. 看 llama 是否真的全 GPU
nvidia-smi --query-gpu=memory.used --format=csv,noheader
# 全 GPU: 2700-3000 MiB
# 混合模式: 1500-2000 MiB(部分层 CPU)
# 2. 看 7B prompt 处理 vs token 生成速度
journalctl --user -u llama-server-7b --no-pager -n 50 | grep "print_timing"
# prompt eval 200+ t/s = GPU OK
# token generation 10-15 t/s = 全 GPU 模式(受限于 4GB 显存)
# 3. 看 bge 状态
curl -s http://localhost:8000/health | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['providers'])"
# v2 设计: ['CPUExecutionProvider'] ← 这是正常的,不要慌
决策树
4GB 显存笔记本 + bge + llama 同时跑?
├─ 是 → bge 改 CPU (v2),llama 全 GPU 推理,~14 t/s
├─ 否,只跑 bge → bge 用 CUDA 推理 (v1),~600MB 显存,~0.5s/embedding
├─ 否,只跑 llama → llama 全 GPU 推理(无 bge 抢显存)
└─ 显存 ≥ 6GB → bge + llama 都可以全 GPU
常见陷阱
- bge 改 CPU 之后看门狗报"未用 CUDA" — 这是正常状态,不是异常。看门狗 v2 不再把"bge-CPU"当异常。
- 改完 bge 显存没释放 — 必须
systemctl --user restart bge-embed,不能只改脚本不重启 - llama 重启后显存仍是混合模式 — 7B 全量超过 4GB - 系统占用,部分层必然在 CPU
- Vulkan 不工作 — 编译时漏装
libvulkan-dev+glslc+spirv-headers三个包,必报错
相关 references
llama-vulkan-build-guide-20260901.md— Vulkan 编译细节systemd-tmpfiles-trap-20260901.md— /tmp 路径陷阱(同类问题)../bge-embed-crash-loop-fix/SKILL.md— bge 服务管理../bge-embed-crash-loop-fix/references/cuda-lib-reuse-pattern.md— CUDA 13 库复用(如果想切回 v1)
2026-09-01 | v1→v2 设计切换验证