We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
RuntimeError: Pin memory thread exited unexpectedly
2021-10-04 15:14:24,792 - mmcls - INFO - workflow: [('train', 1)], max: 200 epochs
2021-10-04 15:14:33,806 - mmcls - INFO - Epoch [1][100/391]	lr: 1.000e-01, eta: 1:57:16, time: 0.090, data_time: 0.022, memory: 76, loss: 2.0658
2021-10-04 15:14:39,876 - mmcls - INFO - Epoch [1][200/391]	lr: 1.000e-01, eta: 1:38:01, time: 0.061, data_time: 0.000, memory: 76, loss: 1.8056
2021-10-04 15:14:45,923 - mmcls - INFO - Epoch [1][300/391]	lr: 1.000e-01, eta: 1:31:25, time: 0.060, data_time: 0.000, memory: 76, loss: 1.6816
2021-10-04 15:14:51,428 - mmcls - INFO - Saving checkpoint at 1 epochs
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 10000/10000, 7696.3 task/s, elapsed: 1s, ETA:     0s2021-10-04 15:14:52,802 - mmcls - INFO - Epoch(val) [1][79]	accuracy_top-1: 32.6600, accuracy_top-5: 84.0200
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/_utils/pin_memory.py", line 28, in _pin_memory_loop
    idx, data = r
ValueError: not enough values to unpack (expected 2, got 0)

Traceback (most recent call last):
  File "tools/train.py", line 157, in <module>
    main()
  File "tools/train.py", line 153, in main
    meta=meta)
  File "/home/songyuan/yty/mmclassification-0.15.0/mmcls/apis/train.py", line 160, in train_model
    runner.run(data_loaders, cfg.workflow)
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py", line 127, in run
    epoch_runner(data_loaders[i], **kwargs)
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py", line 47, in train
    for i, data_batch in enumerate(self.data_loader):
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 349, in __iter__
    self._iterator._reset(self)
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 852, in _reset
    data = self._get_data()
  File "/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 1029, in _get_data
    raise RuntimeError('Pin memory thread exited unexpectedly')
RuntimeError: Pin memory thread exited unexpectedly


我用mmclassification-0.15.0在3090上跑的，pytorch版本为1.7，mmcv为1.3.14，然后训了一个epoch并完成验证后，就出现了这个问题。请问这是什么原因?

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `mmcls/datasets/builder.py`
Content:
```
1 # Copyright (c) OpenMMLab. All rights reserved.
2 import platform
3 import random
4 from distutils.version import LooseVersion
5 from functools import partial
6 
7 import numpy as np
8 import torch
9 from mmcv.parallel import collate
10 from mmcv.runner import get_dist_info
11 from mmcv.utils import Registry, build_from_cfg
12 from torch.utils.data import DataLoader
13 
14 from .samplers import DistributedSampler
15 
16 if platform.system() != 'Windows':
17     # https://github.com/pytorch/pytorch/issues/973
18     import resource
19     rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)
20     hard_limit = rlimit[1]
21     soft_limit = min(4096, hard_limit)
22     resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))
23 
24 DATASETS = Registry('dataset')
25 PIPELINES = Registry('pipeline')
26 
27 
28 def build_dataset(cfg, default_args=None):
29     from .dataset_wrappers import (ConcatDataset, RepeatDataset,
30                                    ClassBalancedDataset)
31     if isinstance(cfg, (list, tuple)):
32         dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg])
33     elif cfg['type'] == 'RepeatDataset':
34         dataset = RepeatDataset(
35             build_dataset(cfg['dataset'], default_args), cfg['times'])
36     elif cfg['type'] == 'ClassBalancedDataset':
37         dataset = ClassBalancedDataset(
38             build_dataset(cfg['dataset'], default_args), cfg['oversample_thr'])
39     else:
40         dataset = build_from_cfg(cfg, DATASETS, default_args)
41 
42     return dataset
43 
44 
45 def build_dataloader(dataset,
46                      samples_per_gpu,
47                      workers_per_gpu,
48                      num_gpus=1,
49                      dist=True,
50                      shuffle=True,
51                      round_up=True,
52                      seed=None,
53                      pin_memory=True,
54                      persistent_workers=True,
55                      **kwargs):
56     """Build PyTorch DataLoader.
57 
58     In distributed training, each GPU/process has a dataloader.
59     In non-distributed training, there is only one dataloader for all GPUs.
60 
61     Args:
62         dataset (Dataset): A PyTorch dataset.
63         samples_per_gpu (int): Number of training samples on each GPU, i.e.,
64             batch size of each GPU.
65         workers_per_gpu (int): How many subprocesses to use for data loading
66             for each GPU.
67         num_gpus (int): Number of GPUs. Only used in non-distributed training.
68         dist (bool): Distributed training/test or not. Default: True.
69         shuffle (bool): Whether to shuffle the data at every epoch.
70             Default: True.
71         round_up (bool): Whether to round up the length of dataset by adding
72             extra samples to make it evenly divisible. Default: True.
73         pin_memory (bool): Whether to use pin_memory in DataLoader.
74             Default: True
75         persistent_workers (bool): If True, the data loader will not shutdown
76             the worker processes after a dataset has been consumed once.
77             This allows to maintain the workers Dataset instances alive.
78             The argument also has effect in PyTorch>=1.7.0.
79             Default: True
80         kwargs: any keyword argument to be used to initialize DataLoader
81 
82     Returns:
83         DataLoader: A PyTorch dataloader.
84     """
85     rank, world_size = get_dist_info()
86     if dist:
87         sampler = DistributedSampler(
88             dataset, world_size, rank, shuffle=shuffle, round_up=round_up)
89         shuffle = False
90         batch_size = samples_per_gpu
91         num_workers = workers_per_gpu
92     else:
93         sampler = None
94         batch_size = num_gpus * samples_per_gpu
95         num_workers = num_gpus * workers_per_gpu
96 
97     init_fn = partial(
98         worker_init_fn, num_workers=num_workers, rank=rank,
99         seed=seed) if seed is not None else None
100 
101     if LooseVersion(torch.__version__) >= LooseVersion('1.7.0'):
102         kwargs['persistent_workers'] = persistent_workers
103 
104     data_loader = DataLoader(
105         dataset,
106         batch_size=batch_size,
107         sampler=sampler,
108         num_workers=num_workers,
109         collate_fn=partial(collate, samples_per_gpu=samples_per_gpu),
110         pin_memory=pin_memory,
111         shuffle=shuffle,
112         worker_init_fn=init_fn,
113         **kwargs)
114 
115     return data_loader
116 
117 
118 def worker_init_fn(worker_id, num_workers, rank, seed):
119     # The seed of each worker equals to
120     # num_worker * rank + worker_id + user_seed
121     worker_seed = num_workers * rank + worker_id + seed
122     np.random.seed(worker_seed)
123     random.seed(worker_seed)
124
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/mmcls/datasets/builder.py b/mmcls/datasets/builder.py
--- a/mmcls/datasets/builder.py
+++ b/mmcls/datasets/builder.py
@@ -1,14 +1,13 @@
 # Copyright (c) OpenMMLab. All rights reserved.
 import platform
 import random
-from distutils.version import LooseVersion
 from functools import partial
 
 import numpy as np
 import torch
 from mmcv.parallel import collate
 from mmcv.runner import get_dist_info
-from mmcv.utils import Registry, build_from_cfg
+from mmcv.utils import Registry, build_from_cfg, digit_version
 from torch.utils.data import DataLoader
 
 from .samplers import DistributedSampler
@@ -98,7 +97,7 @@
         worker_init_fn, num_workers=num_workers, rank=rank,
         seed=seed) if seed is not None else None
 
-    if LooseVersion(torch.__version__) >= LooseVersion('1.7.0'):
+    if digit_version(torch.__version__) >= digit_version('1.8.0'):
         kwargs['persistent_workers'] = persistent_workers
 
     data_loader = DataLoader(

{"golden_diff": "diff --git a/mmcls/datasets/builder.py b/mmcls/datasets/builder.py\n--- a/mmcls/datasets/builder.py\n+++ b/mmcls/datasets/builder.py\n@@ -1,14 +1,13 @@\n # Copyright (c) OpenMMLab. All rights reserved.\n import platform\n import random\n-from distutils.version import LooseVersion\n from functools import partial\n \n import numpy as np\n import torch\n from mmcv.parallel import collate\n from mmcv.runner import get_dist_info\n-from mmcv.utils import Registry, build_from_cfg\n+from mmcv.utils import Registry, build_from_cfg, digit_version\n from torch.utils.data import DataLoader\n \n from .samplers import DistributedSampler\n@@ -98,7 +97,7 @@\n         worker_init_fn, num_workers=num_workers, rank=rank,\n         seed=seed) if seed is not None else None\n \n-    if LooseVersion(torch.__version__) >= LooseVersion('1.7.0'):\n+    if digit_version(torch.__version__) >= digit_version('1.8.0'):\n         kwargs['persistent_workers'] = persistent_workers\n \n     data_loader = DataLoader(\n", "issue": "RuntimeError: Pin memory thread exited unexpectedly\n2021-10-04 15:14:24,792 - mmcls - INFO - workflow: [('train', 1)], max: 200 epochs\r\n2021-10-04 15:14:33,806 - mmcls - INFO - Epoch [1][100/391]\tlr: 1.000e-01, eta: 1:57:16, time: 0.090, data_time: 0.022, memory: 76, loss: 2.0658\r\n2021-10-04 15:14:39,876 - mmcls - INFO - Epoch [1][200/391]\tlr: 1.000e-01, eta: 1:38:01, time: 0.061, data_time: 0.000, memory: 76, loss: 1.8056\r\n2021-10-04 15:14:45,923 - mmcls - INFO - Epoch [1][300/391]\tlr: 1.000e-01, eta: 1:31:25, time: 0.060, data_time: 0.000, memory: 76, loss: 1.6816\r\n2021-10-04 15:14:51,428 - mmcls - INFO - Saving checkpoint at 1 epochs\r\n[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 10000/10000, 7696.3 task/s, elapsed: 1s, ETA:     0s2021-10-04 15:14:52,802 - mmcls - INFO - Epoch(val) [1][79]\taccuracy_top-1: 32.6600, accuracy_top-5: 84.0200\r\nException in thread Thread-2:\r\nTraceback (most recent call last):\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/threading.py\", line 926, in _bootstrap_inner\r\n    self.run()\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/threading.py\", line 870, in run\r\n    self._target(*self._args, **self._kwargs)\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/_utils/pin_memory.py\", line 28, in _pin_memory_loop\r\n    idx, data = r\r\nValueError: not enough values to unpack (expected 2, got 0)\r\n\r\nTraceback (most recent call last):\r\n  File \"tools/train.py\", line 157, in <module>\r\n    main()\r\n  File \"tools/train.py\", line 153, in main\r\n    meta=meta)\r\n  File \"/home/songyuan/yty/mmclassification-0.15.0/mmcls/apis/train.py\", line 160, in train_model\r\n    runner.run(data_loaders, cfg.workflow)\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py\", line 127, in run\r\n    epoch_runner(data_loaders[i], **kwargs)\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/mmcv/runner/epoch_based_runner.py\", line 47, in train\r\n    for i, data_batch in enumerate(self.data_loader):\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/dataloader.py\", line 349, in __iter__\r\n    self._iterator._reset(self)\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/dataloader.py\", line 852, in _reset\r\n    data = self._get_data()\r\n  File \"/home/songyuan/anaconda3/envs/pytorch1.7.1/lib/python3.7/site-packages/torch/utils/data/dataloader.py\", line 1029, in _get_data\r\n    raise RuntimeError('Pin memory thread exited unexpectedly')\r\nRuntimeError: Pin memory thread exited unexpectedly\r\n\r\n\r\n\u6211\u7528mmclassification-0.15.0\u57283090\u4e0a\u8dd1\u7684\uff0cpytorch\u7248\u672c\u4e3a1.7\uff0cmmcv\u4e3a1.3.14\uff0c\u7136\u540e\u8bad\u4e86\u4e00\u4e2aepoch\u5e76\u5b8c\u6210\u9a8c\u8bc1\u540e\uff0c\u5c31\u51fa\u73b0\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002\u8bf7\u95ee\u8fd9\u662f\u4ec0\u4e48\u539f\u56e0?\n", "before_files": [{"content": "# Copyright (c) OpenMMLab. All rights reserved.\nimport platform\nimport random\nfrom distutils.version import LooseVersion\nfrom functools import partial\n\nimport numpy as np\nimport torch\nfrom mmcv.parallel import collate\nfrom mmcv.runner import get_dist_info\nfrom mmcv.utils import Registry, build_from_cfg\nfrom torch.utils.data import DataLoader\n\nfrom .samplers import DistributedSampler\n\nif platform.system() != 'Windows':\n    # https://github.com/pytorch/pytorch/issues/973\n    import resource\n    rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)\n    hard_limit = rlimit[1]\n    soft_limit = min(4096, hard_limit)\n    resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))\n\nDATASETS = Registry('dataset')\nPIPELINES = Registry('pipeline')\n\n\ndef build_dataset(cfg, default_args=None):\n    from .dataset_wrappers import (ConcatDataset, RepeatDataset,\n                                   ClassBalancedDataset)\n    if isinstance(cfg, (list, tuple)):\n        dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg])\n    elif cfg['type'] == 'RepeatDataset':\n        dataset = RepeatDataset(\n            build_dataset(cfg['dataset'], default_args), cfg['times'])\n    elif cfg['type'] == 'ClassBalancedDataset':\n        dataset = ClassBalancedDataset(\n            build_dataset(cfg['dataset'], default_args), cfg['oversample_thr'])\n    else:\n        dataset = build_from_cfg(cfg, DATASETS, default_args)\n\n    return dataset\n\n\ndef build_dataloader(dataset,\n                     samples_per_gpu,\n                     workers_per_gpu,\n                     num_gpus=1,\n                     dist=True,\n                     shuffle=True,\n                     round_up=True,\n                     seed=None,\n                     pin_memory=True,\n                     persistent_workers=True,\n                     **kwargs):\n    \"\"\"Build PyTorch DataLoader.\n\n    In distributed training, each GPU/process has a dataloader.\n    In non-distributed training, there is only one dataloader for all GPUs.\n\n    Args:\n        dataset (Dataset): A PyTorch dataset.\n        samples_per_gpu (int): Number of training samples on each GPU, i.e.,\n            batch size of each GPU.\n        workers_per_gpu (int): How many subprocesses to use for data loading\n            for each GPU.\n        num_gpus (int): Number of GPUs. Only used in non-distributed training.\n        dist (bool): Distributed training/test or not. Default: True.\n        shuffle (bool): Whether to shuffle the data at every epoch.\n            Default: True.\n        round_up (bool): Whether to round up the length of dataset by adding\n            extra samples to make it evenly divisible. Default: True.\n        pin_memory (bool): Whether to use pin_memory in DataLoader.\n            Default: True\n        persistent_workers (bool): If True, the data loader will not shutdown\n            the worker processes after a dataset has been consumed once.\n            This allows to maintain the workers Dataset instances alive.\n            The argument also has effect in PyTorch>=1.7.0.\n            Default: True\n        kwargs: any keyword argument to be used to initialize DataLoader\n\n    Returns:\n        DataLoader: A PyTorch dataloader.\n    \"\"\"\n    rank, world_size = get_dist_info()\n    if dist:\n        sampler = DistributedSampler(\n            dataset, world_size, rank, shuffle=shuffle, round_up=round_up)\n        shuffle = False\n        batch_size = samples_per_gpu\n        num_workers = workers_per_gpu\n    else:\n        sampler = None\n        batch_size = num_gpus * samples_per_gpu\n        num_workers = num_gpus * workers_per_gpu\n\n    init_fn = partial(\n        worker_init_fn, num_workers=num_workers, rank=rank,\n        seed=seed) if seed is not None else None\n\n    if LooseVersion(torch.__version__) >= LooseVersion('1.7.0'):\n        kwargs['persistent_workers'] = persistent_workers\n\n    data_loader = DataLoader(\n        dataset,\n        batch_size=batch_size,\n        sampler=sampler,\n        num_workers=num_workers,\n        collate_fn=partial(collate, samples_per_gpu=samples_per_gpu),\n        pin_memory=pin_memory,\n        shuffle=shuffle,\n        worker_init_fn=init_fn,\n        **kwargs)\n\n    return data_loader\n\n\ndef worker_init_fn(worker_id, num_workers, rank, seed):\n    # The seed of each worker equals to\n    # num_worker * rank + worker_id + user_seed\n    worker_seed = num_workers * rank + worker_id + seed\n    np.random.seed(worker_seed)\n    random.seed(worker_seed)\n", "path": "mmcls/datasets/builder.py"}], "after_files": [{"content": "# Copyright (c) OpenMMLab. All rights reserved.\nimport platform\nimport random\nfrom functools import partial\n\nimport numpy as np\nimport torch\nfrom mmcv.parallel import collate\nfrom mmcv.runner import get_dist_info\nfrom mmcv.utils import Registry, build_from_cfg, digit_version\nfrom torch.utils.data import DataLoader\n\nfrom .samplers import DistributedSampler\n\nif platform.system() != 'Windows':\n    # https://github.com/pytorch/pytorch/issues/973\n    import resource\n    rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)\n    hard_limit = rlimit[1]\n    soft_limit = min(4096, hard_limit)\n    resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit))\n\nDATASETS = Registry('dataset')\nPIPELINES = Registry('pipeline')\n\n\ndef build_dataset(cfg, default_args=None):\n    from .dataset_wrappers import (ConcatDataset, RepeatDataset,\n                                   ClassBalancedDataset)\n    if isinstance(cfg, (list, tuple)):\n        dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg])\n    elif cfg['type'] == 'RepeatDataset':\n        dataset = RepeatDataset(\n            build_dataset(cfg['dataset'], default_args), cfg['times'])\n    elif cfg['type'] == 'ClassBalancedDataset':\n        dataset = ClassBalancedDataset(\n            build_dataset(cfg['dataset'], default_args), cfg['oversample_thr'])\n    else:\n        dataset = build_from_cfg(cfg, DATASETS, default_args)\n\n    return dataset\n\n\ndef build_dataloader(dataset,\n                     samples_per_gpu,\n                     workers_per_gpu,\n                     num_gpus=1,\n                     dist=True,\n                     shuffle=True,\n                     round_up=True,\n                     seed=None,\n                     pin_memory=True,\n                     persistent_workers=True,\n                     **kwargs):\n    \"\"\"Build PyTorch DataLoader.\n\n    In distributed training, each GPU/process has a dataloader.\n    In non-distributed training, there is only one dataloader for all GPUs.\n\n    Args:\n        dataset (Dataset): A PyTorch dataset.\n        samples_per_gpu (int): Number of training samples on each GPU, i.e.,\n            batch size of each GPU.\n        workers_per_gpu (int): How many subprocesses to use for data loading\n            for each GPU.\n        num_gpus (int): Number of GPUs. Only used in non-distributed training.\n        dist (bool): Distributed training/test or not. Default: True.\n        shuffle (bool): Whether to shuffle the data at every epoch.\n            Default: True.\n        round_up (bool): Whether to round up the length of dataset by adding\n            extra samples to make it evenly divisible. Default: True.\n        pin_memory (bool): Whether to use pin_memory in DataLoader.\n            Default: True\n        persistent_workers (bool): If True, the data loader will not shutdown\n            the worker processes after a dataset has been consumed once.\n            This allows to maintain the workers Dataset instances alive.\n            The argument also has effect in PyTorch>=1.7.0.\n            Default: True\n        kwargs: any keyword argument to be used to initialize DataLoader\n\n    Returns:\n        DataLoader: A PyTorch dataloader.\n    \"\"\"\n    rank, world_size = get_dist_info()\n    if dist:\n        sampler = DistributedSampler(\n            dataset, world_size, rank, shuffle=shuffle, round_up=round_up)\n        shuffle = False\n        batch_size = samples_per_gpu\n        num_workers = workers_per_gpu\n    else:\n        sampler = None\n        batch_size = num_gpus * samples_per_gpu\n        num_workers = num_gpus * workers_per_gpu\n\n    init_fn = partial(\n        worker_init_fn, num_workers=num_workers, rank=rank,\n        seed=seed) if seed is not None else None\n\n    if digit_version(torch.__version__) >= digit_version('1.8.0'):\n        kwargs['persistent_workers'] = persistent_workers\n\n    data_loader = DataLoader(\n        dataset,\n        batch_size=batch_size,\n        sampler=sampler,\n        num_workers=num_workers,\n        collate_fn=partial(collate, samples_per_gpu=samples_per_gpu),\n        pin_memory=pin_memory,\n        shuffle=shuffle,\n        worker_init_fn=init_fn,\n        **kwargs)\n\n    return data_loader\n\n\ndef worker_init_fn(worker_id, num_workers, rank, seed):\n    # The seed of each worker equals to\n    # num_worker * rank + worker_id + user_seed\n    worker_seed = num_workers * rank + worker_id + seed\n    np.random.seed(worker_seed)\n    random.seed(worker_seed)\n", "path": "mmcls/datasets/builder.py"}]}