Commit 0fddb4a1 authored by brkirch's avatar brkirch
Browse files

Rework MPS randn fix, add randn_like fix

torch.manual_seed() already sets a CPU generator, so there is no reason to create a CPU generator manually. torch.randn_like also needs a MPS fix for k-diffusion, but a torch hijack with randn_like already exists so it can also be used for that.
parent 4d5f1691
Loading
Loading
Loading
Loading
+3 −12
Original line number Diff line number Diff line
@@ -66,24 +66,15 @@ dtype_vae = torch.float16


def randn(seed, shape):
    # Pytorch currently doesn't handle setting randomness correctly when the metal backend is used.
    if device.type == 'mps':
        generator = torch.Generator(device=cpu)
        generator.manual_seed(seed)
        noise = torch.randn(shape, generator=generator, device=cpu).to(device)
        return noise

    torch.manual_seed(seed)
    if device.type == 'mps':
        return torch.randn(shape, device=cpu).to(device)
    return torch.randn(shape, device=device)


def randn_without_seed(shape):
    # Pytorch currently doesn't handle setting randomness correctly when the metal backend is used.
    if device.type == 'mps':
        generator = torch.Generator(device=cpu)
        noise = torch.randn(shape, generator=generator, device=cpu).to(device)
        return noise

        return torch.randn(shape, device=cpu).to(device)
    return torch.randn(shape, device=device)


+5 −3
Original line number Diff line number Diff line
@@ -365,6 +365,9 @@ class TorchHijack:
            if noise.shape == x.shape:
                return noise

        if x.device.type == 'mps':
            return torch.randn_like(x, device=devices.cpu).to(x.device)
        else:
            return torch.randn_like(x)


@@ -429,8 +432,7 @@ class KDiffusionSampler:
        self.model_wrap.step = 0
        self.eta = p.eta or opts.eta_ancestral

        if self.sampler_noises is not None:
            k_diffusion.sampling.torch = TorchHijack(self.sampler_noises)
        k_diffusion.sampling.torch = TorchHijack(self.sampler_noises if self.sampler_noises is not None else [])

        extra_params_kwargs = {}
        for param_name in self.extra_params: