【问题标题】:RuntimeError: DataLoader worker (pid 27351) is killed by signal: KilledRuntimeError: DataLoader worker (pid 27351) 被信号杀死:Killed
【发布时间】:2020-11-23 01:11:35
【问题描述】:

我正在运行下面的数据加载器,它在训练之前将过滤器应用于显微镜图像。为了计算红色和绿色。此代码过滤红细胞。由于我已将此应用于代码,因此我不断收到上面的错误消息。我尝试将内存分配增加到可能的最大允许值,但这没有帮助。请问有什么方法可以修改过滤器,使其不会导致此问题吗?非常感谢提前

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

【问题讨论】:

  • 您能否毫无问题地遍历数据集本身(而不是 DataLoader)?例如for x in dataset:。如果是这样,那么也许您需要减少数据加载器的num_workers

标签: python image-processing deep-learning pytorch


【解决方案1】:

我想,经过这么多天你一定找到了解决办法。我有同样的问题。就我而言,Out Of Memory Killer 杀死了该进程。我不知道我的解决方案是否可行,或者我不确定它是否相关,但我希望它能给那些刚接触同样问题的人一些指导。

这个问题可以通过多种方式解决。增加系统中的 RAM 量将消除该问题。或者可以通过增加系统的交换内存来消除。

这是在 Linux 中设置交换内存的方法。

linux@linux:~# fallocate -l 32G /tmp/swap
linux@linux:~# chmod 600 /tmp/swap
linux@linux:~# mkswap /tmp/swap
linux@linux:~# swapon /tmp/swap

我从here 找到了增加交换的想法。

或者最简单的方法是减少训练的批量大小。较小的批量大小将花费更少的内存。尝试将批量大小设置为原来的一半。

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

【讨论】:

    【解决方案2】:

    就我而言,我使用 Lightning Memory-M应用了 D 数据库( LMDB) 并且它已修复。

    这个link 是如何使用它的一个很好的例子。

    【讨论】:

    • 请详细描述解决方案并添加参考
    • 非常明显。如果你搜索 lmdb,你会发现很多资源。为什么你没有检查我提供的关键字而投票没有用。
    【解决方案3】:

    我以前遇到过类似的问题。
    一种可能的解决方案是通过

    禁用cv2多处理
    def __getitem__(self, idx):
        import cv2
        cv2.setNumThreads(0)
        # ...
    

    在您的数据加载器中。这可能是因为cv2 多处理与torchDataLoader 多处理冲突。虽然它对我不起作用,因为我的不涉及 OpenCV。但实际上你可以先试试这个。
    就我而言,值得一提的是,具有 CUDA 访问权限的 torch 的 multiprocessing 必须使用 spawnforkserver 而不是 fork 来生成新进程。为此,您应该

    if __name__ == '__main__':
        import multiprocessing
        multiprocessing.set_start_method('spawn')
        # ... **The all rest code**
    

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

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 2018-03-28
      • 2022-11-10
      • 1970-01-01
      • 2020-10-23
      • 2017-11-09
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多