3

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

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

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

4

2 回答 2

1

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

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

于 2019-05-28T05:38:45.823 回答
0

如果您确定文件夹结构不会更改,则可以使用以下命令缓存结构(不是太大的数据):


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
于 2022-02-21T21:58:56.747 回答