xiaowei-system/skills/devops/self-healing-infrastructure/references/gpu-shared-memory-4gb-coexi...

3.7 KiB
Raw Blame History

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 Q33.6GB+ bge600MB

性能取舍矩阵

配置 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/s27/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

常见陷阱

  1. bge 改 CPU 之后看门狗报"未用 CUDA" — 这是正常状态,不是异常。看门狗 v2 不再把"bge-CPU"当异常。
  2. 改完 bge 显存没释放 — 必须 systemctl --user restart bge-embed,不能只改脚本不重启
  3. llama 重启后显存仍是混合模式 — 7B 全量超过 4GB - 系统占用,部分层必然在 CPU
  4. 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 设计切换验证