in opacus/utils/uniform_sampler.py [0:0]
def __iter__(self):
if self.shuffle:
# deterministically shuffle based on epoch and seed
g = torch.Generator()
g.manual_seed(self.shuffle_seed + self.epoch)
indices = torch.randperm(self.total_size, generator=g) # type: ignore
else:
indices = torch.arange(self.total_size) # type: ignore
# Subset of the dataset assigned to this replica
# NOTE: the first replicas might have 1 more sample.
# (Different from the regular distributed loader that pads with more samples)
indices = indices[self.rank : self.total_size : self.num_replicas]
assert len(indices) == self.num_samples
# Now, select a batch with Poisson subsampling
for _ in range(self.num_batches):
mask = (
torch.rand(self.num_samples, generator=self.generator)
< self.sample_rate
)
selected_examples = mask.nonzero(as_tuple=False).reshape(-1)
if len(selected_examples) > 0:
yield indices[selected_examples]