Ubuntu下优化PyTorch的I/O性能
一 存储与文件系统
df -h /dev/shm/etc/fstab添加行:tmpfs /dev/shm tmpfs defaults,size=4096M 0 0sudo umount /dev/shm && sudo mount /dev/shmdf -h /dev/shm二 DataLoader与数据预取
DataLoader的num_workers设为大于0并合理调优(通常设为CPU物理核心数或略高),以隐藏磁盘与解码延迟。non_blocking=True进行主机到GPU的异步拷贝,提升传输与GPU利用率。Dataset.__getitem__中避免高开销的重复操作。from torch.utils.data import DataLoader
loader = DataLoader(
dataset,
batch_size=256,
shuffle=True,
num_workers=8, # 依据CPU核心数调优
pin_memory=True, # 启用固定内存
persistent_workers=True, # 长时训练减少进程反复创建开销
)
for batch in loader:
x, y = batch
x = x.to(device, non_blocking=True) # 异步拷贝到GPU
上述配置可显著减少I/O等待并提升GPU利用率。三 数据格式与管线
import h5py, torch
def collate(batch):
xs, ys = [], []
for x, y in batch:
xs.append(torch.from_numpy(x))
ys.append(y)
return torch.stack(xs), torch.tensor(ys)
with h5py.File('data.h5', 'r') as f:
# 假设数据按dataset_name组织
dset_x = f['images']
dset_y = f['labels']
# 结合DataLoader与collate_fn使用
这些做法能在数据规模大、解码复杂时有效缓解I/O瓶颈。四 系统与内核参数
/etc/security/limits.conf增加如* soft nofile 65536、* hard nofile 65536,并重启会话,避免“Too many open files”。vm.swappiness、vm.dirty_ratio等,减少抖动;在容器/虚拟化环境中确保存储直通与I/O配额合理。五 监控与瓶颈定位
nvidia-smi dmon观察GPU利用率、显存与功耗;iostat -x 1查看磁盘util、await、svctm等指标;htop/top观察CPU与内存压力。