1:RuntimeError: CUDA error: an illegal memory access was encounteredCompile with TORCH_USE_CUDA_DSA`

文章讲述了在使用PyTorch时遇到CUDA非法内存访问错误,通过设置环境变量TORCH_USE_CUDA_DSA并确保模型在保存前从GPU移到CPU,解决了这个问题。作者还讨论了如何减少数据传输对GPU性能的影响。
摘要由CSDN通过智能技术生成

模型报错截图

 报错显示不精确,按照软件推荐方法设置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 保存一次)。因此,这不太可能成为影响整体训练时间的瓶颈。但如果您需要尽可能减少这种影响,可以考虑减少保存频率,或者在不影响实验结果的情况下仅在训练的特定阶段保存模型。

 声明:

此次文章只为记录研究学习期间遇到的问题以及解决方法用。目的仅供记录学习。 

此次信息来源网络,本人不承担任何法律后果。

内容错误部分,还请谅解。目前我的问题已解决,但是你要和我犟,那就是你对,对对对!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值