相关文章推荐
英姿勃勃的小笼包  ·  js ...·  2 年前    · 

首先说明: 由于我的测试集很大, 因此需要对测试集进行分批次推理.

在写代码的时候发现进行训练的时候大概显存只占用了2GB左右, 而且训练过程中显存占用量也基本上是不变的. 而在测试的时候, 发现 显存在每个batch数据推理后逐渐增加, 直至最后导致爆显存, 程序fail .

这里放一下我测试的代码:

	y, y_ = torch.Tensor(), torch.Tensor()
        for batch in tqdm(loader):
            x, batch_y = batch[0], batch[1]
            batch_y_ = model(x)
            y = torch.cat([y, batch_y], dim=0)
            y_ = torch.cat([y_, batch_y_], dim=0)

遇到问题后我就进行单步调试, 然后观察显存的变化. 发现在模型推理这一步, 每一轮次显存都会增加.

batch_y_ = model(x)

这里令人费解的是, 模型推理实际上在训练和测试中都是存在的, 为什么训练的时候就不会出现这个问题呢.

最后发现其实是在训练的时候有这样一步与测试不同:

self.optimizer.zero_grad()

⭐️ 在训练时, 每一个batch后都会将模型的梯度进行一次清零. 而测试的时候我则没有加这一步, 这样的话每次模型再做推理的时候都会产生新的梯度, 并累积到显存当中.

清楚了问题, 那么解决方法也就随之而来, 在测试的时候让模型不要记录梯度就好, 因为其实也用不到:

with torch.no_grad():
	test()
  • 训练的时候每一个batch结束除了梯度反向传播, 还要提前清理梯度
  • 梯度如果不清理的话, 会在显存中累积下来
问题描述首先说明: 由于我的测试集很大, 因此需要对测试集进行分批次推理.在写代码的时候发现进行训练的时候大概显存只占用了2GB左右, 而且训练过程中显存占用量也基本上是不变的. 而在测试的时候, 发现显存在每个batch数据推理后逐渐增加, 直至最后导致爆显存, 程序fail.这里放一下我测试的代码: y, y_ = torch.Tensor(), torch.Tensor() for batch in tqdm(loader): x, batch_y =
如果在python内调用pytorch有可能显存和GPU占用不会被自动释放,此需要加入如下代码 torch.cuda.empty_cache() 我们来看一下官方文档的说明 Releases all unoccupied cached memory currently held by the caching allocator so that those can be used in other GPU application and visible in nvidia-smi. empty_cache() doesn’t increase the amount of GPU me
情况:pytorch框架,深度模型单GPU预测显存占用会不断增长,由有1G增长到5G,甚至更多。 我这边排查下来的原因是卷积的输入尺寸变化,有很大尺寸的输入导致GPU占用不断增长。如果你的模型中没有使用卷积层,可以不往下阅读。 如何看出显存占用不断增长? 登录代码运行服务器,使用 watch -n 1 nvidia-smi ,观察显存变化 预测部分代码如下: with torch.no_grad(): # 模型预测 output = self.model(**input_da
Pytorch 训练候会因为加载的东西过多而显存,有些候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法。 使用torch.cuda.empty_cache()删除一些不需要的变量代码示例如下: output = model(input) except RuntimeError as exception: if "out of...
模型出现RuntimeError: CUDA out of memory.错误 查阅了许多相关内容,原因是:GPU显存内存不够 简单总结一下解决方法: 将batch_size改小。 取torch变量标量值使用item()属性。 可以在测试阶段添加如下代码: with torch.no_grad(): # 停止自动反向计算梯度 https://wisdomai.xyz/tool/pytorch/archives/2301 https://ptorch.com/news/160.html 作者:菜叶儿掉啦
当我运行一段代码的候出现一开始显存占用没有满,随着训练的step增多显存逐渐增大。我尝试了https://blog.csdn.net/qq_36401512/article/details/96163940所有方法发现都不行。直到收到一位高人指点,将原先的torch1.7版本换为torch1.6问题就解决了。
模型训练显存炸解决方法 在模型训练中,应该理解梯度、反向传播、图层、显存这些概念,在模型训练过程中,一般会分为训练+验证+测试 ,在这些过程中,一般在训练过程中会比较占用显存,因为涉及到反向传播,需要大量的梯度,这些数据又存放在显存中。 在今天模型的训练中,突然发现可以训练,但是在验证过程中出现显存炸炸,提示我显存不足,我就很纳闷,一直在找问题,终于发现了: 在我的训练代码中: for epoch in range(0, epoch_num): net.train() 使用Flask调用DNN模型推理API,每调用一次API,显存持续增长,直至最终显存炸强制退出程序。 flask2.0的app.run()中默认打开了threaded=True来支持多线程并发请求,从而导致显存泄漏。 解决方法为:把多线程改为单线程,设置app.run()中threaded和debug为False。示例如下: 然后,就可以正常推理了。 下面的没有用啊! 下面的没有用啊! 下面的没有用啊! 下面的没有用啊! 写够500字,否则 文章质量提示 文章质量提示 此文章质量较低
在我的代码中,在训练前建立了一个loss的list来存储每轮的loss,目的为了在N个EPOCH后绘制图像。 loss = criterion(outputs, dec_outputs.view(-1).reshape(-1,1)) optimizer.zero_grad() loss.backward() optimiz
4. 延迟释放显存: 在训练过程中,显存可能会被占满,导致程序崩溃。可以通过延迟释放显存的方法来解决这个问题。在每次迭代完成后,显存中仍然存在的变量可以使用detach()函数进行释放。 5. 减少模型参数数量: 减少模型参数数量是一种有效的减少显存占用的方法。可以通过使用更简单的模型、减少层数或减小每个层的特征数量等方法来实现。但是,这种方法也可能会降低模型的准确度。