NN模型设置--减小训练时的内存/显存占用

本文探讨了深度学习中减少内存占用的六种关键策略:使用较大步幅的卷积核、1×1卷积核减少通道数、池化技术、调整batch_size、使用float16数据类型以及精简全连接层,旨在提升模型效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)kennel_stride

  一种技术是使用较大的步幅来进行卷积内核,也就是说,我们应用不是每个像素的平铺卷积,而是每两个或四个像素(stride为2或4),以便产生较少的输出数据。
  这通常用于输入层,因为这些使用大部分内存。
  当然,大stride通常是配合大的kenel_size一起使用;而使用大的kenel_size是为了扩大感受野。
  为什么在第一层的stride要这么大?

2)1*1kennel_size

  减少内存占用的另一个技巧是引入1×1的卷积内核层,减少通道。例如64x64x256输入可以通过96 1×1内核减少到64x64x96的输入。

3)pooling

  一个明显的技术是池化。一个2×2的池化层可以将该层的数据量减少4个,从而显着减少后续层的内存占用。
  下采样:(NCHW -> (1/4)*NCHW)

4)batch_size

  使用批量大小为64而不是128个内存消耗量。然而,培训也可能需要更长时间,特别是训练的最后阶段,使得准确的梯度变得越来越重要。大多数卷积操作也针对64或更大的小批量尺寸进行优化,从而从批量大小32开始,训练速度大大降低。因此,将小批量尺寸缩小到甚至低于32,只能作为最后的选择。

5)float32

  另一个经常被忽视的选择是更改卷积网络使用的数据类型。通过从32位切换到16位,可以轻松地将内存消耗量减半,而不会降低分类性能。在P100特斯拉卡上,这甚至会给你一个巨大的加速。

6)减少全连接层

  一般只留最后一层分类用的全连接层。

Traceback (most recent call last): File "/home/zhd-pc/projects/mmsegmentation/tools/train.py", line 104, in <module> main() File "/home/zhd-pc/projects/mmsegmentation/tools/train.py", line 100, in main runner.train() File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/mmengine/runner/runner.py", line 1777, in train model = self.train_loop.run() # type: ignore File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/mmengine/runner/loops.py", line 289, in run self.run_iter(data_batch) File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/mmengine/runner/loops.py", line 314, in run_iter data_batch, optim_wrapper=self.runner.optim_wrapper) File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/mmengine/model/base_model/base_model.py", line 116, in train_step optim_wrapper.update_params(parsed_losses) File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/mmengine/optim/optimizer/optimizer_wrapper.py", line 196, in update_params self.backward(loss) File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/mmengine/optim/optimizer/optimizer_wrapper.py", line 220, in backward loss.backward(**kwargs) File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/torch/_tensor.py", line 363, in backward torch.autograd.backward(self, gradient, retain_graph, create_graph, inputs=inputs) File "/home/zhd-pc/anaconda3/envs/mmseg/lib/python3.7/site-packages/torch/autograd/__init__.py", line 175, in backward allow_unreachable=True, accumulate_grad=True) # Calls into the C++ engine to run the backward pass RuntimeError: CUDA out of memory. Tried to allocate 238.00 MiB (GPU 0; 7.62 GiB total capacity; 4.93 GiB already allocated; 249.19 MiB free; 5.22 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF 刚开始的候没有出现这问题
最新发布
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值