【Pytorch】【DataLoader】RuntimeError: CUDA error: initialization error

本文解析了PyTorch中出现的CUDA初始化错误原因及解决方法。错误发生在DataLoader加载已置于GPU上的数据集时。正确的做法是在 DataLoader 前将数据保留在 CPU 上,并在训练过程中将其传递到 GPU。
PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

RuntimeError: CUDA error: initialization error

错误详情

  File "~/miniconda3/envs/dx/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 49, in <listcomp>
    data = [self.dataset[idx] for idx in possibly_batched_index]
  File "~/miniconda3/envs/dx/lib/python3.8/site-packages/torch/utils/data/dataset.py", line 261, in __getitem__
    return tuple(tensor[index] for tensor in self.tensors)
  File "~/miniconda3/envs/dx/lib/python3.8/site-packages/torch/utils/data/dataset.py", line 261, in <genexpr>
    return tuple(tensor[index] for tensor in self.tensors)
RuntimeError: CUDA error: initialization error
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

错误原因

数据使用TensorDataset封装,再传入DataLoader中。
DataLoader数据已经在GPU中,导致报错。

...
TRAINING_PROP = 0.8
num_data_sample = data_x.shape[0]
train_x = FloatTensor(data_x[:int(num_data_sample*TRAINING_PROP)]).to(DEVICE)     
train_y = FloatTensor(data_y[:int(num_data_sample*TRAINING_PROP)]).to(DEVICE)   
...
train_dataloder = DataLoader(dataset=TensorDataset(train_x, train_y), 
                             batch_size=BATCH_SIZE, 
                             shuffle=True, 
                             num_workers=8)
...
for step, (batch_x, batch_y) in enumerate(train_dataloder):
    ...
    pred_y = model(batch_x)
    ...

错误解决

参考:
RuntimeError:Cuda error: initialization on dataloader

DataLoader的数据须放在CPU中,在训练的时候再传到GPU

...
num_data_sample = data_x.shape[0]
# 不传到GPU上
train_x = FloatTensor(data_x[:int(num_data_sample*TRAINING_PROP)])    
train_y = FloatTensor(data_y[:int(num_data_sample*TRAINING_PROP)])  
...
train_dataloder = DataLoader(dataset=TensorDataset(train_x, train_y), 
                             batch_size=BATCH_SIZE, 
                             shuffle=True, 
                             num_workers=8)
...
for step, (batch_x, batch_y) in enumerate(train_dataloder):
	# 传到GPU上
    batch_x = batch_x.to(DEVICE) 
    batch_y = batch_y.to(DEVICE) 
    ...
    pred_y = model(batch_x)
    ...

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 解决 PyTorch DataLoader 工作者进程意外退出的方法 当遇到 `RuntimeError: DataLoader worker (pid(s) 3444) exited unexpectedly` 错误时,这通常意味着数据加载器的工作线程在执行过程中遇到了未处理的异常并崩溃。为了有效解决问题,可以从以下几个方面入手: #### 调整 num_workers 参数设置 减少或禁用多线程可以避免一些潜在的竞争条件和其他并发问题。尝试将 `num_workers` 设置为0来关闭后台工作线程,仅使用主线程进行数据读取操作[^1]。 ```python dataloader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, shuffle=True, num_workers=0 # 关闭多线程模式 ) ``` #### 增加共享内存大小 如果系统默认分配给应用程序使用的共享内存量不足以支持多个子进程之间的通信,则可能会触发此错误。可以通过增加系统的shm(shared memory)参数来缓解这个问题。 对于Linux操作系统而言,在终端输入命令调整临时文件路径下的共享内存空间大小: ```bash sudo mount -o remount,size=8G /dev/shm/ ``` #### 捕获和调试子进程中发生的异常 有时即使主程序能够正常运行,但在某些特定条件下仍可能引发子进程内的异常而导致其终止。可以在初始化函数里加入全局异常捕手以便更好地定位具体原因所在。 ```python import sys from functools import partial import torch.multiprocessing as mp def init_worker(): """Worker initialization function.""" signal.signal(signal.SIGINT, signal.SIG_IGN) mp.set_start_method('spawn') # 使用 spawn 方法启动新进程 dataset_loader = torch.utils.data.DataLoader( ... , num_workers=n_threads, worker_init_fn=init_worker ) try: for data in dataset_loader: pass except Exception as e: print(f"Exception caught outside of workers: {e}") finally: dataset_loader.shutdown() ``` 通过上述措施应该能有效地降低甚至消除该类错误的发生频率。当然,具体情况还需要根据实际项目环境和个人需求做适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值