问题
报错RuntimeError: DataLoader worker (pid 263336) is killed by signal: Terminated.
原因分析
RuntimeError: DataLoader worker (pid 263336) is killed by signal: Terminated. 这个错误表明 PyTorch 的 DataLoader 中的一个或多个工作进程由于接收到了终止信号而被强制停止了。以下是可能导致这个错误的原因:
内存不足:当系统资源不足时,特别是 GPU 或 CPU 内存不足,操作系统可能会杀死进程以回收资源。
死锁:DataLoader 的工作进程可能由于某种原因(如文件系统访问问题、数据解码错误等)陷入了死锁状态。
不兼容的多线程/多进程:如果代码中使用了多线程或多进程,并且与 DataLoader 的多线程/多进程设置不兼容,可能会导致工作进程异常终止。
数据加载错误:在加载数据集时,如果遇到无法处理的异常(如文件损坏、格式错误等),可能会导致工作进程崩溃。
操作系统限制:操作系统可能有打开文件的数量限制或内存使用限制,超出这些限制可能导致进程被杀死。
CUDA 错误:在使用 GPU 加速时,如果 CUDA 操作出错,有时也会导致 DataLoader 工作进程异常终止。
解决方法
其实根据上面出现问题的原因,可以针对自己的问题检查一遍。
数据集导入确定没错? dataloader逻辑错误? 数据量太大导致的问题?
减小数据集大小:首先,你可以尝试减小数据集的大小。这样,每个worker处理的数据量就会减少,从而减少内存使用。
调整DataLoader的num_workers参数:DataLoader的num_workers参数决定了同时运行多少个worker进程来加载数据。你可以
- 尝试减少这个参数的值,以减少内存使用。例如,将其设置为0可以禁用并行加载,所有数据都将在一个主进程中加载。
train_data_loader = DataLoader(train_dataset, batch_size=None, pin_memory=args.pin_memory, num_workers=args.num_workers, prefetch_factor=args.prefetch)
优化数据预处理:数据预处理是导致内存使用量增加的一个常见原因。例如,如果你在预处理阶段创建了大量的中间变量,这可能会导致内存溢出。你可以尝试优化你的数据预处理代码,例如通过减少中间变量的数量或使用更有效的数据结构。
实操步骤
找到Dataloader.py文件,ctrl+f查找num_workers,把后面值直接改为0(或者改小一点)就解决了