Perhaps generate z2 as z1 with some uniform noise added to it? With uniform noise you could guarantee the difference will not exceed epsilon, if you set the lower and upper bound correctly.
z1=torch.randn(1,128,requires_grad = True)

epsilon = torch.tensor([0.5])

bound = (epsilon/2)/(z1.numel())

distribution = torch.distributions.uniform.Uniform(-bound, bound)
z2 = z1 + distribution.sample((1, 128))

Not sure if I computed the bounds optimally, but I hope the idea helps.