CentOS系统下解决PyTorch内存问题的综合策略
del关键字删除不再使用的张量(如中间变量、旧模型),并调用torch.cuda.empty_cache()清理PyTorch缓存的未使用内存,避免内存碎片堆积。torch.cuda.amp.autocast()自动管理计算精度(前向传播用FP16加速,关键步骤如梯度更新用FP32保证数值稳定性),配合GradScaler缩放梯度防止溢出。可使内存占用减少约50%,同时保持模型精度。torch.bfloat16格式(动态范围更大,适合深度学习中的大数值场景),进一步降低内存占用且避免FP16的数值问题。accumulation_steps=4表示累积4个小批量的梯度后再更新模型),模拟大批次训练的效果。适用于无法增加物理内存的场景,但会增加训练时间(迭代次数增多)。torch.utils.checkpoint.checkpoint包裹模型部分层,前向传播时仅存储部分中间激活值,反向传播时重新计算缺失的激活值。可将激活值内存减少40%-50%,适合深层模型(如Transformer)。DataLoader中设置num_workers>0(如num_workers=4),利用多核CPU并行加载和预处理数据,避免数据加载成为内存瓶颈。pin_memory=True,将数据预加载到固定内存(pinned memory),加速数据从CPU到GPU的传输(DMA传输),减少GPU等待时间。torch.nn.parallel.DistributedDataParallel(DDP)将模型复制到多个GPU,每个GPU处理不同的数据批次,最后同步梯度。可线性扩展内存容量(如2块GPU各承担一半内存),同时提高训练速度。torch.distributed.fsdp.FullyShardedDataParallel将模型参数、梯度和优化器状态分片到多个GPU,每个GPU仅保存部分数据。适用于超大规模模型(如LLM),内存占用可降低至单机训练的1/N(N为GPU数量)。sudo fallocate -l 8G /swapfile→sudo mkswap /swapfile→sudo swapon /swapfile),当物理内存不足时,系统会将部分数据写入交换文件。需注意:交换空间性能远低于物理内存,过度使用会导致训练速度骤降。nvidia-smi实时查看GPU内存占用(如nvidia-smi -l 1每秒刷新),或用torch.cuda.memory_summary()打印详细的GPU内存使用报告(包括已用内存、缓存、碎片等)。sync; echo 3 > /proc/sys/vm/drop_caches清除系统缓存(PageCache、dentries、inodes),释放被系统占用的内存(不影响正在运行的进程)。CosineAnnealingLR)改善收敛效果。tensor.cpu()),仅在需要计算时移回GPU。适用于超大模型(如GPT-3),但会增加CPU-GPU数据传输时间。torch.jit.script将模型转换为TorchScript格式,优化内核启动和内存分配,减少运行时开销(尤其适合模型部署场景)。