【问题标题】:How to speed up the "ImageFolder" for ImageNet如何加快 ImageNet 的“ImageFolder”
【发布时间】:2019-06-09 22:59:08
【问题描述】:

我在大学,所有文件系统都在远程系统中,无论我用我的帐户登录哪里,我都可以访问我的主目录。即使我通过 SSH 命令登录到 GPU 服务器。这是我使用 GPU 服务器读取数据的条件。

目前,我使用 PyTorch 在 ImageNet 上从头开始训练 ResNet,我的代码只使用同一台计算机上的所有 GPU,我发现“torchvision.datasets.ImageFolder”需要将近两个小时。

能否请您提供一些关于如何加速“torchvision.datasets.ImageFolder”的经验?非常感谢。

【问题讨论】:

  • 您是否尝试使用更多num_workers?检查stackoverflow.com/questions/47644367/…。另外,您可以按照discuss.pytorch.org/t/how-to-speed-up-the-data-loader/13740 的建议尝试 HDF5 文件
  • 您好,非常感谢您的回复。 ImageFolder 出现了我的问题,而 num_worker 设置为下一句。我尝试将文件移动到作为 SSD 的本地机器上,我发现数据加载只需要几秒钟。所以我认为问题是由远程文件系统引起的。
  • 我也遇到了同样的问题,请问您找到在远程文件系统(NAS)上快速加载的解决方案了吗?
  • 最后,我将数据复制到GPU服务器的磁盘上。

标签: image-processing computer-vision pytorch imagenet torchvision


【解决方案1】:

为什么需要这么长时间?
设置ImageFolder 可能需要很长时间,尤其是当图像存储在速度较慢的远程磁盘上时。这种延迟的原因是数据集的__init__ 函数会遍历图像文件夹中的所有文件并检查该文件是否为图像文件。 ImageNet 可能需要相当长的时间,因为有超过 100 万个文件需要检查。

你能做什么?
- 正如Kevin Sun 已经指出的那样,将数据集复制到本地(并且可能更快)存储可以显着加快速度。
- 或者,您可以创建一个修改后的数据集类,它不会读取所有文件,而是依赖于 缓存 文件列表 - 您在其中准备 一次 的缓存列表前进并用于所有运行。

【讨论】:

  • 您能否提供有关如何创建此类缓存列表的详细信息?
【解决方案2】:

如果您确定文件夹结构没有改变,您可以使用以下方法缓存该结构(不是太大的数据):


import json
from functools import wraps
from torchvision.datasets import ImageNet

def file_cache(filename):
    """Decorator to cache the output of a function to disk."""
    def decorator(f):
        @wraps(f)
        def decorated(self, directory, *args, **kwargs):
            filepath = Path(directory) / filename
            if filepath.is_file():
                out = json.loads(filepath.read_text())
            else:
                out = f(self, directory, *args, **kwargs)
                filepath.write_text(json.dumps(out))
            return out
        return decorated
    return decorator

class CachedImageNet(ImageNet):
    @file_cache(filename="cached_classes.json")
    def find_classes(self, directory, *args, **kwargs):
        classes = super().find_classes(directory, *args, **kwargs)
        return classes

    @file_cache(filename="cached_structure.json")
    def make_dataset(self, directory, *args, **kwargs):
        dataset = super().make_dataset(directory, *args, **kwargs)
        return dataset

【讨论】:

    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2017-04-06
    • 2020-04-27
    • 2017-04-03
    • 1970-01-01
    • 2022-08-26
    相关资源
    最近更新 更多