监控运行大模型的显存占用率的方式
监控运行大模型的显存占用率的方式:“临时观察 → 终端可视化 → 生产级监控报警”
1)最轻量:nvidia-smi 实时观察(无需安装)
• 连续采样关键信息(适合临时看是否“打满”)
nvidia-smi --query-gpu=index,utilization.gpu,utilization.memory,memory.used,memory.total,power.draw,temperature.gpu \--format=csv,noheader -l 1
• 面向时序的监控模式:
# 每秒输出功耗/利用率/显存等,-i 指定要看的卡
nvidia-smi dmon -s pucmT -i 0,1,2,3
# 逐进程维度看利用率(谁在吃GPU)
nvidia-smi pmon -s umt -i 0,1,2,3
2)终端 TUI/CLI 工具(更好看、易排查)
• nvtop(TUI)
apt-get install -y nvtop
nvtop
• nvitop(Python 版 TUI,支持进程/显存/显卡拓扑)
pip install nvitop
nvitop
• gpustat(极简列表 + 进程)
pip install gpustat
gpustat --watch -i 1
3)一键“满载告警”脚本(本机阈值判断)
判定规则(可改):GPU 利用率 ≥95% 且显存使用 ≥90% 连续 30 秒即判“满载”。
#!/usr/bin/env bash
# gpu-fullcheck.sh
CARDS="0,1,2,3" # 要监控的卡
THRESH_UTIL=95
THRESH_MEM=90
WINDOW=30 # 连续 N 秒ok=0
while true; doline=$(nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv,noheader -i ${CARDS})# 如果任一GPU未达标就重置计数all_full=1echo "$line" | while IFS=',' read -r util mem_used mem_total; dou=$(echo $util | tr -dc '0-9')mu=$(echo $mem_used | tr -dc '0-9')mt=$(echo $mem_total | tr -dc '0-9')memp=$(( 100 * mu / mt ))if [ "$u" -lt "$THRESH_UTIL" ] || [ "$memp" -lt "$THRESH_MEM" ]; thenall_full=0breakfidoneif [ "${all_full}" -eq 1 ]; thenok=$((ok+1))elseok=0fiif [ "$ok" -ge "$WINDOW" ]; thenecho "[FULL] GPUs saturated (util>=${THRESH_UTIL}% and mem>=${THRESH_MEM}% for ${WINDOW}s)."exit 0fisleep 1
done
用法:bash gpu-fullcheck.sh
想更严格就把 THRESH_UTIL/THRESH_MEM/WINDOW 调高。
4)生产级:Prometheus + Grafana + DCGM Exporter(强烈推荐)
• DCGM(NVIDIA Data Center GPU Manager)能暴露完整 GPU 指标给 Prometheus,做看板 + 告警。
• 启动 Exporter(Docker):
docker run -d --gpus all --restart=always --name dcgm-exporter -p 9400:9400 \nvcr.io/nvidia/k8s/dcgm-exporter:latest
• Prometheus 抓取(示例 prometheus.yml 片段):
scrape_configs:- job_name: 'dcgm'static_configs:- targets: ['localhost:9400']
• 告警规则(示例):
groups:
- name: gpurules:- alert: GPUHighUtilizationexpr: DCGM_FI_DEV_GPU_UTIL > 95for: 5mlabels: { severity: warning }annotations:description: "GPU util >95% for 5m on {{ $labels.hostname }} (gpu {{ $labels.uuid }})"- alert: GPUMemoryHighexpr: (DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL) > 0.90for: 5mlabels: { severity: warning }annotations:description: "GPU memory >90% for 5m on {{ $labels.hostname }} (gpu {{ $labels.uuid }})"
• Grafana 直接导入社区 DCGM 仪表盘(含利用率、显存、功耗、温度、PCIe 带宽、Xid 错误等),就有时序图 + P95/P99叠加分析。
5)性能归因/压测辅助
• Nsight Systems/Compute:深入到内核层面看 SM 占用、内存带宽、瓶颈类型(是否真的“算力打满”而不是被内存/PCIe 卡住)。
• gpu-burn / stress 工具:用于基准“打满”验证(别在生产上跑,容易把温度/功耗拉满)。
⸻
给你的小结
• 临时:nvidia-smi dmon / pmon + 我上面的满载脚本就够用了。
• 常态化:上 DCGM Exporter + Prometheus + Grafana,再加告警阈值(>95% 利用率、>90% 显存、功耗/温度叠加)= 可视化+报警闭环。
• 结合你跑 vLLM 的场景,建议把 GPU 指标与 vLLM 的 Prometheus 指标(如请求队列、prefill/decoding 直方图)一起进 Grafana,才能判断“排队导致的高延迟”还是“算力真打满”。