pytorch loss.backward()持续运行数小时

pytorch loss.backward()持续运行数小时,pytorch,tensor,Pytorch,Tensor,我正在使用Pytork训练一些x射线图像,但我遇到了以下问题: 在以下行中:loss.backward(),程序只会继续运行,永远不会结束,并且没有错误或警告 loss, outputs = self.forward(images, targets) loss = loss / self.accumulation_steps print("loss calculated: " + str(loss))

我正在使用Pytork训练一些x射线图像,但我遇到了以下问题:

在以下行中:
loss.backward()
,程序只会继续运行,永远不会结束,并且没有错误或警告

            loss, outputs = self.forward(images, targets)  
            loss = loss / self.accumulation_steps
            print("loss calculated: " + str(loss))

            if phase == "train":
                print("running loss backwarding!") 
                loss.backward()
                print("loss is backwarded!")
                if (itr + 1 ) % self.accumulation_steps == 0:
                    self.optimizer.step()
                    self.optimizer.zero_grad()
在此之前计算的损失类似于张量(0.8598,grad_fn=)

有人能帮我解释一下为什么这个函数一直在运行,或者有什么好方法可以调试backward()函数吗

我正在使用torch 1.2.0+cu92和兼容的cuda 10.0


非常感谢你

很难给出确切的答案,但我有一个猜测

您的代码看起来不错,但从您发布的输出(
tensor(0.8598,grad\u fn=)
)我得出结论,您是在CPU上操作,而不是在GPU上操作

一种可能的解释是,向后传球不是永远跑,而是需要很长时间。在CPU上训练大型网络要比在GPU上训练慢得多检查您的CPU和内存利用率。这可能是因为您的数据和型号太大,无法装入主内存,迫使操作系统使用硬盘,这将使执行速度再降低几个数量级。如果是这种情况,我通常建议:

  • 使用较小的批量
  • 缩小图像的比例(如果可能的话)
  • 仅打开当前需要的图像
  • 缩小模型的尺寸
  • 通过调用
    model.cuda()使用GPU(如果可用);开始培训前,images=images.cuda()
如果这不能解决您的问题,您可以通过执行以下操作来缩小问题范围:

  • 创建一个最小的工作示例来重现问题
  • 检查其他非常简单的模型体系结构是否存在此问题
  • 使用不同的输入数据检查问题是否依然存在
  • 使用不同的PyTorch版本检查问题是否依然存在

谢谢。我通过将pyspark升级到最新版本找到了解决方案,然后就成功了!!!