From 4d6df1f4b94a9b49f0fc320369e7ab10bb1ff3de Mon Sep 17 00:00:00 2001 From: Thiago Crepaldi Date: Thu, 29 Feb 2024 18:56:52 +0000 Subject: [PATCH 1/2] Enable FakeTensorMode for EulerDiscreteScheduler scheduler PyTorch's FakeTensorMode does not support `.numpy()` or `numpy.array()` calls. This PR replaces `sigmas` numpy tensor by a PyTorch tensor equivalent Repro ```python with torch._subclasses.FakeTensorMode() as fake_mode, ONNXTorchPatcher(): fake_model = DiffusionPipeline.from_pretrained(model_name, low_cpu_mem_usage=False) ``` that otherwise would fail with `RuntimeError: .numpy() is not supported for tensor subclasses.` --- src/diffusers/schedulers/scheduling_euler_discrete.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/diffusers/schedulers/scheduling_euler_discrete.py b/src/diffusers/schedulers/scheduling_euler_discrete.py index 0f584416bbd7..b13537db99ef 100644 --- a/src/diffusers/schedulers/scheduling_euler_discrete.py +++ b/src/diffusers/schedulers/scheduling_euler_discrete.py @@ -216,10 +216,10 @@ def __init__( # FP16 smallest positive subnormal works well here self.alphas_cumprod[-1] = 2**-24 - sigmas = np.array(((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5) + sigmas = torch.tensor(((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5).clone().detach() timesteps = np.linspace(0, num_train_timesteps - 1, num_train_timesteps, dtype=float)[::-1].copy() - sigmas = torch.from_numpy(sigmas[::-1].copy()).to(dtype=torch.float32) + sigmas = sigmas.flip(0).to(dtype=torch.float32) timesteps = torch.from_numpy(timesteps).to(dtype=torch.float32) # setable values From c5d6b68079ffd1f537fbb78d8c774a8b4caead2a Mon Sep 17 00:00:00 2001 From: Thiago Crepaldi Date: Fri, 1 Mar 2024 15:41:23 +0000 Subject: [PATCH 2/2] Address comments --- src/diffusers/schedulers/scheduling_euler_discrete.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/diffusers/schedulers/scheduling_euler_discrete.py b/src/diffusers/schedulers/scheduling_euler_discrete.py index b13537db99ef..05ae94eff0fc 100644 --- a/src/diffusers/schedulers/scheduling_euler_discrete.py +++ b/src/diffusers/schedulers/scheduling_euler_discrete.py @@ -216,10 +216,8 @@ def __init__( # FP16 smallest positive subnormal works well here self.alphas_cumprod[-1] = 2**-24 - sigmas = torch.tensor(((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5).clone().detach() + sigmas = (((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5).flip(0) timesteps = np.linspace(0, num_train_timesteps - 1, num_train_timesteps, dtype=float)[::-1].copy() - - sigmas = sigmas.flip(0).to(dtype=torch.float32) timesteps = torch.from_numpy(timesteps).to(dtype=torch.float32) # setable values