多机训练资源利用率监控
在分布式训练中,监控多机训练的资源利用率是优化性能的关键环节。本文将介绍如何通过Horovod和PyTorch Distributed两种框架来实现资源监控,并提供可复现的配置示例。
监控指标体系
主要关注以下指标:
- GPU利用率(Utilization)
- GPU内存使用率(Memory Usage)
- 网络带宽利用率
- CPU使用率
- 内存使用率
Horovod配置案例
import horovod.torch as hvd
import torch
import torch.nn as nn
import time
# 初始化Horovod
hvd.init()
rank = hvd.rank()
size = hvd.size()
# 设置GPU设备
torch.cuda.set_device(rank)
# 监控函数
def monitor_resources():
import subprocess
import psutil
# 获取GPU信息
gpu_info = subprocess.run(['nvidia-smi', '--query-gpu=utilization.gpu,memory.used,memory.total', '--format=csv'],
capture_output=True, text=True)
print(f"GPU Info: {gpu_info.stdout}")
# 获取系统信息
cpu_percent = psutil.cpu_percent(interval=1)
memory_percent = psutil.virtual_memory().percent
print(f"CPU: {cpu_percent}%, Memory: {memory_percent}%")
# 训练循环中加入监控
for epoch in range(10):
monitor_resources()
# 训练逻辑...
PyTorch Distributed配置案例
import torch.distributed as dist
import torch.nn as nn
import os
import psutil
import subprocess
def setup_distributed():
rank = int(os.environ['RANK'])
world_size = int(os.environ['WORLD_SIZE'])
dist.init_process_group(backend='nccl', rank=rank, world_size=world_size)
return rank, world_size
# 资源监控装饰器
import functools
def monitor_wrapper(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
# 训前监控
if dist.get_rank() == 0:
print(f"Process {dist.get_rank()} - Before training")
monitor_resources()
result = func(*args, **kwargs)
# 训后监控
if dist.get_rank() == 0:
print(f"Process {dist.get_rank()} - After training")
monitor_resources()
return result
return wrapper
@monitor_wrapper
def train_step(model, data):
# 训练逻辑
pass
实时监控脚本
# 创建监控脚本 monitoring.sh
#!/bin/bash
while true; do
echo "$(date):"
nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv -l 1
echo "---"
sleep 5
done
通过上述配置,可以有效监控多机训练中的资源使用情况,为性能调优提供数据支撑。

讨论