【Bug】Pytorch RuntimeError: DataLoader worker (pid(s) 15904) exited unexpectedly

【Bug1】RuntimeError: DataLoader worker (pid(s) 15904) exited unexpectedly

知乎:https://zhuanlan.zhihu.com/p/712407893

环境

python 复制代码
Windows 11
Python 3.10
torch 2.0.1
numpy 1.25.0

问题详情

在使用 PyTorch 的 DataLoader 时出现的错误。详情

python 复制代码
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...
.....
RuntimeError: DataLoader worker (pid(s) ) exited unexpectedly

意思是,这是运行时错误,是由于在主进程完成初始化之前试图启动了新的进程导致的错误。

错误的代码示例

python 复制代码
import torch
from torch.utils.data import Dataset, DataLoader

import numpy as np

# 假设我们有一些简单的数据
data = np.array([1,2,3,4,5,6,7])  # np, tensor 格式都可以
targets = torch.tensor([1,1,1,1,0,0,0])  # 标签

# 定义自定义数据集
class SimpleDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets

    def __getitem__(self, index):
        x = self.data[index]
        y = self.targets[index]
        return x, y

    def __len__(self):
        return len(self.data)
        
# 实例化数据集
dataset = SimpleDataset(data, targets)

# 创建 DataLoader, 如果启动多线程num_workers>=1,需要将启动代码放置在 if __name__ == "__main__": 下, 否则会报错
dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2)

# 使用 DataLoader 迭代数据
for i, (batch_data, batch_label) in enumerate(dataloader):
    print(f"Batch {i}: batch_data: {batch_data}, batch_label: {batch_label}")

解决方法

【方法1】(不推荐)

这是由于多线程加载数据使用不当使用的错误,因此可以设置为单线程即可,num_workers 不设置或设置为0

python 复制代码
dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=0)

【方法2】

将涉及dataloader 的代码放置在if __name__ == "__main__": 下运行,修改代码如下

python 复制代码
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np

# 定义自定义数据集
class SimpleDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets

    def __getitem__(self, index):
        x = self.data[index]
        y = self.targets[index]
        return x, y

    def __len__(self):
        return len(self.data)
        
def train():
    # 假设我们有一些简单的数据
    data = np.array([1,2,3,4,5,6,7])  # np, tensor 格式都可以
    targets = torch.tensor([1,1,1,1,0,0,0])  # 标签
    # 实例化数据集
    dataset = SimpleDataset(data, targets)

    # 创建 DataLoader, 如果启动多线程,需要将启动代码放置在 if __name__ == "__main__": 下, 否则会报错
    dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2)

    # 使用 DataLoader 迭代数据
    for i, (batch_data, batch_label) in enumerate(dataloader):
        print(f"Batch {i}: batch_data: {batch_data}, batch_label: {batch_label}")

if __name__ == "__main__":
     train()

参考

解决pytorch报错:RuntimeError: DataLoader worker (pid(s) ***, ***, ***, ***) exited unexpectedly - 知乎 (zhihu.com)

相关推荐
边缘计算社区31 分钟前
首个!艾灵参编的工业边缘计算国家标准正式发布
大数据·人工智能·边缘计算
游客52042 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主42 分钟前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
深圳南柯电子1 小时前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ1 小时前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
biter00881 小时前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖1 小时前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
IT古董2 小时前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
凯哥是个大帅比2 小时前
人工智能ACA(五)--深度学习基础
人工智能·深度学习
m0_748232922 小时前
DALL-M:基于大语言模型的上下文感知临床数据增强方法 ,补充
人工智能·语言模型·自然语言处理