CentOS上PyTorch资源分配优化策略
在CentOS系统上高效分配PyTorch资源(尤其是GPU和内存),需结合硬件配置、软件优化、数据加载及监控等多维度调整,以下是具体方法:
nn.DataParallel将输入数据分割到多个GPU并行计算,简单易用但存在GIL瓶颈,效率较低。nn.parallel.DistributedDataParallel实现进程级并行,效率高且支持多机扩展。需配合torch.distributed.launch启动脚本,设置CUDA_VISIBLE_DEVICES指定GPU。export PATH=/usr/local/cuda/bin:$PATH、export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH添加环境变量,确保PyTorch识别GPU。torch.cuda.amp模块,在训练时自动切换FP16(半精度)和FP32(单精度),减少显存占用(约50%)并加速计算,同时保持模型精度。示例代码:from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for data, target in dataloader:
data, target = data.to('cuda'), target.to('cuda')
optimizer.zero_grad()
with autocast(): # 自动选择FP16/FP32
output = model(data)
loss = criterion(output, target)
scaler.scale(loss).backward() # 梯度缩放防止溢出
scaler.step(optimizer) # 更新参数
scaler.update() # 调整缩放因子
del tensor释放内存,并调用torch.cuda.empty_cache()清理GPU缓存,避免显存碎片。batch_size(如从64减至32)可显著减少显存/内存消耗,但需权衡训练速度和模型泛化能力(过小的batch可能导致收敛变慢)。accumulation_steps = 4
for i, (data, target) in enumerate(dataloader):
data, target = data.to('cuda'), target.to('cuda')
output = model(data)
loss = criterion(output, target)
loss = loss / accumulation_steps # 梯度缩放
loss.backward()
if (i + 1) % accumulation_steps == 0: # 累积指定步数后更新参数
optimizer.step()
optimizer.zero_grad()
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
并在/etc/fstab中添加/swapfile swap swap defaults 0 0,确保重启后生效。vm.swappiness(默认60,范围0-100),降低其值(如设为10)减少系统对交换空间的依赖,优先使用物理内存;调整vm.overcommit_memory(设为1,允许内存超额分配),优化内存分配策略:echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # 生效配置
torch.nn.parallel.DistributedDataParallel结合模型分片)或参数卸载(将优化器参数卸载到CPU,如PyTorch Lightning的cpu_offload=True),减少内存压力。DataLoader的num_workers参数(设为CPU核心数的50%-100%,如4核CPU设为2-4)启用多进程加载,避免数据加载阻塞训练。pin_memory=True,将数据预加载到页锁定内存(DMA缓冲区),加快CPU到GPU的数据传输速度(尤其适用于GPU训练)。nvidia-smi实时查看GPU显存使用率、进程占用情况(如nvidia-smi -l 1每秒刷新)。free -h查看系统内存使用情况,ps aux --sort=-%mem找出内存占用高的进程,或使用PyTorch的torch.cuda.memory_summary()查看GPU内存分配详情。torch.compile功能可优化模型执行效率,减少资源占用。