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

相关推荐
镜象科技2 小时前
AI情感大模型应用场景全解:从校园到医院再到企业的落地地图
人工智能
Joshua-a2 小时前
工程数学-理解卷积的含义_线性时不变系统的冲激响应与卷积
人工智能·深度学习
song5013 小时前
React Native for OpenHarmony 实战:三方库 react-native-css-transformer 的鸿蒙化适配指南
css·人工智能·深度学习·react native·transformer
老金带你玩AI7 小时前
ChatGPT dots,到底能替你操多少心?
人工智能
AliCloudROS8 小时前
计算巢 X DeepSeek Harness — 云端智能体工作台
人工智能·阿里云
深蓝AI8 小时前
GitHub的Push一年涨4.9倍:AI Agent为什么逼它重做Git存储?
人工智能·github
stereohomology8 小时前
大模型的观点谨:StoryTold 「Crafting Apps」四件套 · 深度总览
人工智能·llm
运维行者_9 小时前
网络性能监控怎么做?从自动发现到根因分析的4个环节
运维·服务器·网络·人工智能·支持向量机
Su米苏9 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
美狐美颜sdk9 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk