Windows上监控OpenELM运行状态的实用方案
一 监控目标与关键指标
- 建议优先覆盖以下三类指标,便于快速定位性能瓶颈与异常:
- GPU:利用率(%)、显存已用/总量(MB/GB)、温度(°C)、功耗(mW)、显存增长率(MB/s)、SM利用率(%)。
- CPU:总体与每核使用率(%)、平均负载、上下文切换次数(次/秒)。
- 内存:已用/总量(GB)、使用率(%)、Swap使用量、页缓存命中率(%)。
- 推理质量与业务:单次推理时延(s)、吞吐(prompts/s)、错误率/异常码占比、输出质量抽样(如BLEU/ROUGE)。这些指标与阈值体系可直接用于日常巡检与告警配置。
二 Windows本地实时监控
- 任务管理器
- 打开方式:Ctrl+Shift+Esc → 切换到“性能”查看CPU/GPU/内存;切到“进程”按CPU或内存排序,定位占用最高的python.exe(推理进程)。
- PowerShell实时采样(每2秒刷新)
- 示例:
- Get-Process python | Select-Object Name, Id, CPU, WorkingSet, PM, NPM
- Get-Counter 'GPU Engine(*)Utilization Percentage' -Continuous | ForEach-Object { $_.CounterSamples | Select-Object InstanceName, CookedValue }
- GPU与显存
- 使用nvidia-smi(PowerShell或CMD):
- nvidia-smi -l 2 # 每2秒刷新
- nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu,power.draw --format=csv -l 2
- 日志与输出
- 将推理或评估脚本的标准输出与错误输出重定向到文件,便于事后检索与告警:
- python your_script.py 2>&1 | Tee-Object -FilePath .run.log -Append
- 若以服务方式运行,可用服务控制台或命令行查询服务状态(服务名替换为你的实际服务):
- services.msc
- sc query YourOpenELMService
- 评估/压测时建议固定--device cuda:0并控制--batch_size,便于复现与对比监控数据。
三 轻量级Python监控脚本
- 结合pynvml(GPU)与psutil(CPU/内存),定期采集并输出关键指标,可接入日志或推送告警。
- 示例(保存为 monitor_openelm.py,按需调整采样间隔与日志路径):
- pip install nvidia-ml-py3 psutil
- 代码示例:
- import time, json, logging, psutil
import pynvml
pynvml.nvmlInit()
logging.basicConfig(filename='openelm_monitor.log', level=logging.INFO,
format='%(asctime)s %(message)s')
def collect():
s = {'cpu_pct': psutil.cpu_percent(interval=0.5),
'mem': psutil.virtual_memory()._asdict(),
'gpu': []}
for i in range(pynvml.nvmlDeviceGetCount()):
h = pynvml.nvmlDeviceGetHandleByIndex(i)
u = pynvml.nvmlDeviceGetUtilizationRates(h)
m = pynvml.nvmlDeviceGetMemoryInfo(h)
t = pynvml.nvmlDeviceGetTemperature(h, pynvml.NVML_TEMPERATURE_GPU)
p = pynvml.nvmlDeviceGetPowerUsage(h) // 1000
s['gpu'].append({'id': i, 'gpu_util': u.gpu, 'mem_used_mb': m.used//(1024*1024),
'mem_total_mb': m.total//(1024*1024), 'temp_c': t, 'power_w': p})
return s
if name == '__main__':
while True:
logging.info(json.dumps(collect()))
time.sleep(2)
- 进阶可计算显存增长率(MB/s)、滑动窗口均值/百分位,用于发现显存泄漏与低GPU利用率等问题。
四 日志与告警落地
- 日志规范
- 统一落盘到如logs/目录,区分run.log(实时输出)、error.log(仅错误)、metrics.log(JSON指标)。
- 评估/压测命令建议始终使用2>&1 | Tee-Object保留完整输出,便于回溯与对比不同参数(如--batch_size、--device cuda:0)下的表现。
- 告警建议
- GPU显存使用率持续>90%或显存增长率长时间为正且斜率较大(疑似泄漏)。
- GPU利用率长时间<30%且吞吐不升(提示瓶颈在CPU/数据预处理/批量策略)。
- 单次推理时延P95超过阈值或错误率突增(结合业务SLO设置)。
五 进阶可观测性
- 指标可视化与长期存储
- 将脚本输出的JSON指标通过Prometheus Pushgateway或OpenTelemetry Collector上报,使用Grafana绘制GPU/CPU/内存趋势面板,并设置阈值告警。
- 质量与反馈闭环
- 定期抽样评估输出质量(如BLEU/ROUGE),并建立用户反馈通道,结合时延/吞吐/错误率形成持续优化闭环。