使用ResNet18骨干训练YOLACT模型时出现AttributeError报错求助
问题
修改配置以ResNet18为骨干网络训练YOLACT模型,训练3-4小时后突然报错中断。
环境信息:
- Ubuntu 10.04
- PyTorch 1.12.1+cu113
- Python 3.9.12
- 2块NVIDIA RTX A6000 GPU
训练日志及报错信息:
[ 2] 32930 || B: 3.996 | C: 4.955 | M: 4.408 | S: 1.036 | T: 14.395 || ETA: 1 day, 4:21:46 || timer: 0.127 [ 2] 32940 || B: 4.020 | C: 5.072 | M: 4.458 | S: 1.104 | T: 14.655 || ETA: 1 day, 4:23:08 || timer: 0.132 [ 2] 32950 || B: 4.063 | C: 5.246 | M: 4.552 | S: 1.199 | T: 15.060 || ETA: 1 day, 4:23:34 || timer: 0.151 [ 2] 32960 || B: 4.057 | C: 5.435 | M: 4.608 | S: 1.271 | T: 15.371 || ETA: 1 day, 4:23:31 || timer: 0.158 [ 2] 32970 || B: 4.071 | C: 5.574 | M: 4.675 | S: 1.306 | T: 15.626 || ETA: 1 day, 4:24:23 || timer: 0.166 [ 2] 32980 || B: 4.033 | C: 5.746 | M: 4.758 | S: 1.381 | T: 15.918 || ETA: 1 day, 4:26:38 || timer: 0.140 [ 2] 32990 || B: 4.031 | C: 5.817 | M: 4.741 | S: 1.411 | T: 15.999 || ETA: 1 day, 4:25:21 || timer: 0.139 [ 2] 33000 || B: 4.055 | C: 5.763 | M: 4.799 | S: 1.412 | T: 16.028 || ETA: 1 day, 4:25:51 || timer: 0.128 Traceback (most recent call last): File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/queues.py", line 245, in _feed obj = _ForkingPickler.dumps(obj) File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/reduction.py", line 51, in dumps cls(buf, protocol).dump(obj) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 364, in reduce_storage shared_cache[cache_key] = StorageWeakRef(storage) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 65, in __setitem__ self.free_dead_references() File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 70, in free_dead_references if storage_ref.expired(): File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 35, in expired return torch.Storage._expired(self.cdata) # type: ignore[attr-defined] File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/storage.py", line 757, in _expired return eval(cls.module)._UntypedStorage._expired(*args, **kwargs) AttributeError: module 'torch.cuda' has no attribute '_UntypedStorage' Traceback (most recent call last): File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/queues.py", line 245, in _feed obj = _ForkingPickler.dumps(obj) File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/reduction.py", line 51, in dumps cls(buf, protocol).dump(obj) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 364, in reduce_storage shared_cache[cache_key] = StorageWeakRef(storage) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 65, in __setitem__ self.free_dead_references() File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 70, in free_dead_references if storage_ref.expired(): File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 35, in expired return torch.Storage._expired(self.cdata) # type: ignore[attr-defined] File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/storage.py", line 757, in _expired return eval(cls.module)._UntypedStorage._expired(*args, **kwargs) AttributeError: module 'torch.cuda' has no attribute '_UntypedStorage' [ 2] 33010 || B: 4.178 | C: 5.768 | M: 4.934 | S: 1.417 | T: 16.296 || ETA: 1 day, 4:49:09 || timer: 0.126 Traceback (most recent call last): File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/queues.py", line 245, in _feed obj = _ForkingPickler.dumps(obj) File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/reduction.py", line 51, in dumps cls(buf, protocol).dump(obj) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 364, in reduce_storage shared_cache[cache_key] = StorageWeakRef(storage) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 65, in __setitem__ self.free_dead_references() File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 70, in free_dead_references if storage_ref.expired(): File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 35, in expired return torch.Storage._expired(self.cdata) # type: ignore[attr-defined] File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/storage.py", line 757, in _expired return eval(cls.module)._UntypedStorage._expired(*args, **kwargs) AttributeError: module 'torch.cuda' has no attribute '_UntypedStorage' Traceback (most recent call last): File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/queues.py", line 245, in _feed obj = _ForkingPickler.dumps(obj) File "/home/gangwa/miniconda3/lib/python3.9/multiprocessing/reduction.py", line 51, in dumps cls(buf, protocol).dump(obj) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 364, in reduce_storage shared_cache[cache_key] = StorageWeakRef(storage) File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 65, in __setitem__ self.free_dead_references() File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 70, in free_dead_references if storage_ref.expired(): File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/multiprocessing/reductions.py", line 35, in expired return torch.Storage._expired(self.cdata) # type: ignore[attr-defined] File "/home/gangwa/miniconda3/lib/python3.9/site-packages/torch/storage.py", line 757, in _expired return eval(cls.module)._UntypedStorage._expired(*args, **kwargs) AttributeError: module 'torch.cuda' has no attribute '_UntypedStorage'
原因分析与解决方案
- 这个报错是PyTorch多进程数据加载时的CUDA存储引用问题,大概率是PyTorch 1.12.1的多进程缓存机制和CUDA 11.3存在兼容性bug,训练长时间运行后,缓存的CUDA存储对象被意外回收,导致引用失效。
- 另外Ubuntu 10.04版本过于老旧,对RTX A6000这类新硬件及新软件的支持不足,系统层面的兼容性问题也可能触发这类底层错误。
- 解决办法:
- 优先升级PyTorch版本,比如切换到1.13.x或2.x系列,这些版本修复了不少多进程CUDA存储相关的bug;
- 如果不想更换PyTorch,可以尝试关闭多进程数据加载的共享内存,在DataLoader中设置
pin_memory=False,或者将num_workers调小甚至设为0; - 条件允许的话升级Ubuntu系统到20.04或更高版本,解决底层硬件与软件的兼容问题;
- 训练前运行
torch.cuda.empty_cache()清理CUDA缓存,训练过程中定期清理也能减少这类内存引用问题。
内容的提问来源于stack exchange,提问作者ABD
相关产品推荐
相关产品推荐

