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

相关推荐
AI营销资讯站4 小时前
原圈科技AI营销内容生产系统:企业降本增效的全流程智能方案
大数据·人工智能
图学习小组4 小时前
PaCon:一种用于识别编程提交中问题求解策略的符号分析方法
人工智能·算法·机器学习
墨染倾城殇4 小时前
蓝牙模块场景化应用与选型:高效连接,精准适配
网络·人工智能·蓝牙模块·低功耗蓝牙模块·飞易通科技·蓝牙模块推荐
码农阿豪4 小时前
POP到店模式(LOC)业务规则深度解析:从配置到结算的全链路指南
大数据·网络·人工智能
江上鹤.1484 小时前
Day 41 早停策略和模型权重的保存
人工智能·深度学习·机器学习
龙腾AI白云4 小时前
DNN案例一步步构建深层神经网络(二)三、深层神经网络
人工智能·神经网络
洛阳泰山4 小时前
快速上手 MaxKB4J:开源企业级 Agentic 工作流系统在 Sealos 上的完整部署指南
java·人工智能·后端
爱打代码的小林4 小时前
机器学习(决策树)
人工智能·决策树·机器学习
光羽隹衡4 小时前
机器学习——决策树
人工智能·决策树·机器学习
roman_日积跬步-终至千里4 小时前
【计算机视觉(17)】语义理解-训练神经网络2_优化器_正则化_超参数
人工智能·神经网络·计算机视觉