刚刚提到了,问题根源在于不同的显卡调用 worker_init_fn 时,无法区分自己属于哪张显卡 (没有利用rank),那么通过传入一个 partial 函数强行让 worker_init_fn 能够得知 rank 就可以区分了: def worker_init_fn(worker_id, num_workers, rank, seed): # The seed of each worker equals to # num_worker * ...
在多进程数据加载算法中,DataLoader将根据Randomness in multi-process data loading algorithm对worker进行重新初始化种子。使用worker_init_fn()来保持可再现性: def seed_worker(worker_id): worker_seed = torch.initial_seed() % 2**32 numpy.random.seed(worker_seed) random.seed(worker_seed) DataLoader( ...
shuffle: bool = False, sampler: Optional[Sampler[int]] = None, batch_sampler: Optional[Sampler[Sequence[int]]] = None, num_workers: int = 0, collate_fn: _collate_fn_t = None, pin_memory: bool = False, drop_last: bool = False, timeout: float = 0, worker_init_fn: _worker_init...
我们可以在worker_init_fn中设置 NumPy 的种子,例如: defworker_init_fn(worker_id): # np.random.get_state(): 得到当前的Numpy随机数状态,即主进程的随机状态 # worker_id是子进程的id,如果num_workers=2,两个子进程的id分别是0和1 #和worker_id相加可以保证...
对于不同线程的随机数种子设置,主要通过DataLoader的worker_init_fn参数来实现。默认情况下使用线程ID作为随机数种子。 # 设置每个读取线程的随机种子 def _init_fn(worker_id): np.random.seed(int(seed)+worker_id) trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=num_...
self._base_seed, self._worker_init_fn, i, self._num_workers, self._persistent_workers)) w.daemon =True w.start() ... worker 进程内部实际使用到这个种子的地方如下 def_worker_loop(dataset_kind, dataset, index_queue, data_queue, do...
DataLoader的构造函数有一个可选参数worker_init_fn。在加载数据之前,每个子进程都会先调用此函数。我们可以在worker_init_fn中设置 NumPy 的种子,例如: defworker_init_fn(worker_id): # np.random.get_state: 得到当前的Numpy随机数状态,即主进程的随机状态 ...
self.collate_fn = collate_fn self.pin_memory = pin_memory self.drop_last = drop_last self.timeout = timeout self.worker_init_fn = worker_init_fn if timeout < 0: raise ValueError('timeout option should be non-negative') # 检测是否存在参数冲突: 默认batchSampler vs 自定义BatchSampler ...
worker_init_fn=worker_init_fn) num_workers在Windows系统上只能设置成0,但是当我们使用Linux远程服务器时,可能使用不同的num_workers的数量,这是我们就需要注意worker_init_fn()函数的作用了。它保证了我们使用的数据增强在num_workers>0时是对数据的增强是随机的。
timeout(numeric, optional): 如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。这个numeric应总是大于等于0。默认为0 worker_init_fn (callable, optional): 每个worker初始化函数 If not None, this will be called on each worker subprocess wit...