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

相关推荐
青瓷程序设计3 小时前
动物识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
金智维科技官方4 小时前
RPA财务机器人为企业高质量发展注入动能
人工智能·机器人·rpa·财务
沫儿笙4 小时前
安川机器人tag焊接怎么节省保护气
人工智能·物联网·机器人
2501_941147424 小时前
人工智能赋能智慧教育互联网应用:智能学习与教育管理优化实践探索》
人工智能
阿龙AI日记5 小时前
详解Transformer04:Decoder的结构
人工智能·深度学习·自然语言处理
爱写代码的小朋友5 小时前
“数字镜像”与认知负能者:生成式AI个性化学习支持者的协同构建与伦理规制研究
人工智能
找方案5 小时前
新型智慧城市城市大数据应用解决方案
人工智能·智慧城市
K***72845 小时前
开源模型应用落地-工具使用篇-Spring AI-Function Call(八)
人工智能·spring·开源
Chat_zhanggong3456 小时前
K4A8G165WC-BITD产品推荐
人工智能·嵌入式硬件·算法
霍格沃兹软件测试开发6 小时前
Playwright MCP浏览器自动化指南:让AI精准理解你的命令
运维·人工智能·自动化