【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)

相关推荐
喜欢吃豆5 分钟前
从指令遵循到价值对齐:医疗大语言模型的进阶优化、对齐与工具集成综合技术白皮书
人工智能·python·语言模型·自然语言处理·大模型·强化学习·constitutional
진영_5 分钟前
LLMs From Scratch(一)---理解大语言模型
人工智能·语言模型·自然语言处理
无风听海5 分钟前
神经网络之理解梯度和方向导数
人工智能·深度学习·神经网络
亚马逊云开发者18 分钟前
亚马逊云科技 WAF 指南(十)用 Amazon Q Developer CLI 解决 DDoS 防护与 SEO 冲突问题
人工智能
攻城狮7号36 分钟前
吴恩达的Agentic AI新课:让AI学会“干活”,而不只是“答题”
人工智能·ai课程·吴恩达·agentic ai
Dave.B1 小时前
vtkImageThreshold 图像阈值处理指南:从基础到实战优化
图像处理·人工智能·计算机视觉
Hody911 小时前
【XR硬件系列】AR眼镜的终极形态会是“普通眼镜”吗?技术瓶颈还有哪些?
人工智能·ar·xr
羊羊小栈1 小时前
基于「多模态大模型 + BGE向量检索增强RAG」的新能源汽车故障诊断智能问答系统(vue+flask+AI算法)
vue.js·人工智能·算法·flask·汽车·毕业设计·大作业
山烛1 小时前
深入解析 YOLO v2
人工智能·yolo·计算机视觉·目标跟踪·yolov2
GISer_Jing1 小时前
AI/CICD/Next/React Native&Taro内容
人工智能·react native·taro