模型报错截图
报错显示不精确,按照软件推荐方法设置set TORCH_USE_CUDA_DSA=1,设置之后就会报错详细的问题,从而进行修改。
设置:set TORCH_USE_CUDA_DSA=1
运行这个代码需要在控制面板cmd上执行,set TORCH_USE_CUDA_DSA=1
是在 Windows 命令提示符(cmd)中用来设置环境变量的命令。当你在 cmd 中执行这条命令后,它会在当前的命令行会话中设置 TORCH_USE_CUDA_DSA
环境变量的值为 1
。这样做的目的是启用 PyTorch 的设备端断言(Device-Side Assertions),这对于调试 CUDA 相关的问题非常有用
具体步骤:
1:需要更改windows的磁盘路径(默认C盘),如果你的文件在D盘,输入指令“D:”既可切换磁盘路径。如下图
2:输入pycharm项目文件.py的目录。(注意:只需要输入到.py文件的目录,不用加文件名字)
3:设置set TORCH_USE_CUDA_DSA=1
4:报错处理,当文件显示模块包不存在时候,应该是没有改变cuda的环境变量(默认是base),此刻就需要切换 cuda base环境。(如果没有报错,直接运行代码程序:运行代码python空格“输入你的代码文件名”见第6步骤)
4:切换base环境(本人的副本环境是torch2)输入代码:conda activate torch2(注意修改你所需的cuda环境)
5:重复set TORCH_USE_CUDA_DSA=1
6:运行文件:
注意事项:
请注意,这种方式设置的环境变量只对当前的命令行会话有效。如果你关闭了 cmd 窗口或者在不同的 cmd 窗口中运行你的 Python 脚本,那么你需要重新执行 set TORCH_USE_CUDA_DSA=1
命令。
如果你想要在整个系统中永久设置这个环境变量,可以在系统的环境变量设置中添加它,这样不论在哪个命令行窗口中运行你的脚本,TORCH_USE_CUDA_DSA
都将保持启用状态。不过,通常建议只在调试时临时启用它,因为设备端断言可能会降低运行效率。
我的报错案例(仅供参考)
问题原因:
这个错误信息表明在尝试保存模型的过程中遇到了一个 CUDA 错误:“an illegal memory access was encountered”,即遇到了非法内存访问。这通常意味着代码试图访问未分配或不属于它的内存区域。这里的错误发生在尝试将模型的状态字典从 GPU 移动到 CPU 以保存到磁盘的过程中。
模型运行跑的时候,将模型放在GPU上面的,但是在保存的时候,torch.save默认是保存在CPU上面的。在进行数据保存时,cuda发生错误非法内存访问。
报错问题 :(主要参考问题)
File "u2net_train_2.py", line 148, in main torch.save(net.state_dict(), ".\\saved_models\\train_data_FS_module\\u2net_{}.pth".format(epoch_num))
File "D:\annacanda\envs\torch2\lib\site-packages\torch\storage.py", line 121, in cpu return torch.UntypedStorage(self.size()).copy_(self, False)
torch.UntypedStorage(self.size())
:这里创建了一个新的 UntypedStorage
对象,其大小与调用 cpu
方法的存储对象相同。UntypedStorage
是 P.copy_(self, False)
:这是一个就地操作,它将当前存储对象(self
)中的数据复制到新创建的 UntypedStorage
对象中。这里的 False
参数表示不需要将数据转换为 CPU 的字节顺序(因为数据已经是以适合 CPU 的方式存储的)。yTorch 中一个比较底层的存储类,它不关心存储在其中的数据类型。
解决方法:
(一开始用的GPU跑的,且模型放在GPU上面)在保存模型之前,将模型先移动到CPU上面,再进行保存。(操作如下)
问题讨论:
我在这里讨论了代码首先调用 net.cpu()
,确保模型的参数被复制到 CPU 上,然后模型就会被移回 GPU。那么这和过程是否会影响原始模型在 GPU 上的状态。
结论:
这个过程对 GPU 运行的影响主要体现在两次数据传输上(GPU 到 CPU,然后 CPU 回 GPU)。这会导致 GPU 在这两次数据传输期间无法进行其它计算任务。然而,除非您的模型非常大,否则这种影响是很小的。
在训练循环中执行这些操作通常是出于保存模型状态的需要,并不频繁进行(比如每个 epoch 保存一次)。因此,这不太可能成为影响整体训练时间的瓶颈。但如果您需要尽可能减少这种影响,可以考虑减少保存频率,或者在不影响实验结果的情况下仅在训练的特定阶段保存模型。
声明:
此次文章只为记录研究学习期间遇到的问题以及解决方法用。目的仅供记录学习。
此次信息来源网络,本人不承担任何法律后果。
内容错误部分,还请谅解。目前我的问题已解决,但是你要和我犟,那就是你对,对对对!