首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RuntimeError: DataLoader工作进程(pid 27351)被信号终止:已终止

问RuntimeError: DataLoader工作进程(pid 27351)被信号终止:已终止
EN

Stack Overflow用户
提问于 2020-08-03 06:05:29
回答 3查看 5.6K关注 0票数 1

我正在运行下面的数据加载器,它在训练之前对显微镜图像应用了一个过滤器。为了计算红色和绿色的数量。这段代码过滤了红血球。由于我已经将此应用于代码,因此我不断得到上面的错误消息。我尝试将内存分配增加到可能的最大限度,但没有帮助。有没有办法我可以修改过滤器,使它不会导致这个问题,谢谢?非常感谢你提前

代码语言:javascript
复制
import os

import numpy as np
import torch
from PIL import Image
from torch.utils.data import Dataset
from torchvision import transforms, utils
#from torchvision.transforms import Grayscalei
import pandas as pd
import pdb
import cv2

class CellsDataset(Dataset):
    # a very simple dataset

    def __init__(self, root_dir, transform=None, return_filenames=False):
        self.root = root_dir
        self.transform = transform
        self.return_filenames = return_filenames
        self.files = [os.path.join(self.root,filename) for filename in os.listdir(self.root)]
        self.files = [path for path in self.files
                      if os.path.isfile(path) and os.path.splitext(path)[1]=='.png']

    def __len__(self):
        return len(self.files)

    def __getitem__(self, idx):
        path = self.files[idx]        
        image = cv2.imread(path)
        sample = image.copy()
        # set blue and green channels to 0
        sample[:, :, 0] = 0
        sample[:, :, 1] = 0

channel.
        if self.transform:
            sample = self.transform(sample)

        if self.return_filenames:
            return sample, path
        else:
            return sample
EN

回答 3

Stack Overflow用户

发布于 2021-07-22 23:13:48

我以前遇到过类似的问题。

一种可能的解决方案是通过以下方式禁用cv2多处理

代码语言:javascript
复制
def __getitem__(self, idx):
    import cv2
    cv2.setNumThreads(0)
    # ...

在你的数据加载器里。这可能是因为cv2多进程和torch的DataLoader在多进程上有冲突。虽然它不适合我,因为我的不涉及OpenCV。但是你可以先试试这个。

在我的例子中,值得一提的是,支持CUDA访问的torch的multiprocessing必须使用spawn或forkserver而不是fork来生成新进程。要做到这一点,您应该

代码语言:javascript
复制
if __name__ == '__main__':
    import multiprocessing
    multiprocessing.set_start_method('spawn')
    # ... **The all rest code**

请注意,您应该将所有剩余的代码放在if __name__ == '__main__'块中,包括导入,因为可能是其他导入(如cv2)将其设置为fork,而您的加载器无法工作。

票数 1
EN

Stack Overflow用户

发布于 2020-11-07 16:04:47

我想,过了这么多天,你一定找到了解决方案。我也有同样的问题。在我的例子中,内存不足杀手杀死了这个进程。我不知道我的解决方案是否有效,或者我不确定它是否相关,但我希望它能为那些刚接触这个问题的人提供一些方向。

这个问题可以用几种方法来解决。增加系统中的RAM容量将消除此问题。或者可以通过增加系统的交换存储器来消除它。

这是如何在Linux中设置交换内存。

代码语言:javascript
复制
linux@linux:~# fallocate -l 32G /tmp/swap
linux@linux:~# chmod 600 /tmp/swap
linux@linux:~# mkswap /tmp/swap
linux@linux:~# swapon /tmp/swap

我从中发现了增加交换空间的想法。

或者最简单的方法是减少训练的批量大小。批处理大小越小,占用的内存就越少。尝试一下,将批处理大小设置为现有大小的一半。

另一种选择是减少数据加载器的num_workers。这也减少了RAM的使用。

票数 0
EN

Stack Overflow用户

发布于 2021-04-27 09:05:43

在我的例子中,我使用了L fixed Database (LMDB)并修复了它。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63221468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档