代码详解:用Pytorch训练快速神经网络的9个技巧(2)
https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/?source=post_page---------------------------#accumulated-gradients
5. 保留计算图 撑爆内存很简单,只要不释放指向计算图形的指针,比如……为记录日志保存loss。
上述的问题在于,loss仍然有一个图形副本。在这种情况中,可用.item()来释放它。
Lightning会特别注意,让其无法保留图形副本 (示例: https://github.com/williamFalcon/pytorch-lightning/blob/master/pytorch_lightning/models/trainer.py?source=post_page---------------------------#L767-L768) 6. 单GPU训练 一旦完成了前面的步骤,就可以进入GPU训练了。GPU的训练将对许多GPU核心上的数学计算进行并行处理。能加速多少取决于使用的GPU类型。个人使用的话,推荐使用2080Ti,公司使用的话可用V100。 刚开始你可能会觉得压力很大,但其实只需做两件事: 1)将你的模型移动到GPU上,2)在用其运行数据时,把数据导至GPU中。
如果使用Lightning,则不需要对代码做任何操作。只需设置标记 (https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/?source=post_page---------------------------#single-gpu):
在GPU进行训练时,要注意限制CPU和GPU之间的传输量。
例如,如果耗尽了内存,不要为了省内存,将数据移回CPU。尝试用其他方式优化代码,或者在用这种方法之前先跨GPUs分配代码。 此外还要注意进行强制GPUs同步的操作。例如清除内存缓存。
但是如果使用Lightning,那么只有在定义Lightning模块时可能会出现这种问题。Lightning特别注意避免此类错误。 7. 16位精度 16位精度可以有效地削减一半的内存占用。大多数模型都是用32位精度数进行训练的。然而最近的研究发现,使用16位精度,模型也可以很好地工作。混合精度指的是,用16位训练一些特定的模型,而权值类的用32位训练。 要想在Pytorch中用16位精度,先从NVIDIA中安装 apex 图书馆 并对你的模型进行这些更改。
amp包会处理大部分事情。如果梯度爆炸或趋于零,它甚至会扩大loss。 在Lightning中, 使用16位很简单 (编辑:ASP站长网) |