| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | import logging |
| |
|
| | import numpy as np |
| | import torch |
| |
|
| |
|
| | def loglinear_interp(t_steps: list[float], num_steps: int) -> np.ndarray: |
| | """ |
| | Performs log-linear interpolation of a given array of decreasing numbers. |
| | """ |
| | xs = np.linspace(0, 1, len(t_steps)) |
| | ys = np.log(t_steps[::-1]) |
| |
|
| | new_xs = np.linspace(0, 1, num_steps) |
| | new_ys = np.interp(new_xs, xs, ys) |
| |
|
| | interped_ys = np.exp(new_ys)[::-1].copy() |
| | return interped_ys |
| |
|
| |
|
| | def align_your_step_scheduler_v15( |
| | n: int, sigma_min: float, sigma_max: float, device |
| | ) -> torch.Tensor: |
| | """SD15 AYS scheduler from https://research.nvidia.com/labs/toronto-ai/AlignYourSteps/howto.html""" |
| | NOISE_LEVELS = [ |
| | 14.615, |
| | 6.475, |
| | 3.861, |
| | 2.697, |
| | 1.886, |
| | 1.396, |
| | 0.963, |
| | 0.652, |
| | 0.399, |
| | 0.152, |
| | 0.029, |
| | ] |
| | TIMESTEP_INDICES = [999, 850, 736, 645, 545, 455, 343, 233, 124, 24, 0] |
| | sigs = [sigma for sigma in loglinear_interp(NOISE_LEVELS, n)] |
| | sigs.append(0.0) |
| |
|
| | logging.info(f"AYS scheduler: {sigs=}") |
| | return torch.FloatTensor(sigs).to(device) |
| |
|
| |
|
| | def align_your_step_scheduler_xl( |
| | n: int, sigma_min: float, sigma_max: float, device |
| | ) -> torch.Tensor: |
| | """SDXL AYS scheduler from https://research.nvidia.com/labs/toronto-ai/AlignYourSteps/howto.html""" |
| | NOISE_LEVELS = [ |
| | 14.615, |
| | 6.315, |
| | 3.771, |
| | 2.181, |
| | 1.342, |
| | 0.862, |
| | 0.555, |
| | 0.380, |
| | 0.234, |
| | 0.113, |
| | 0.029, |
| | ] |
| | TIMESTEP_INDICES = [999, 845, 730, 587, 443, 310, 193, 116, 53, 13, 0] |
| | sigs = [sigma for sigma in loglinear_interp(NOISE_LEVELS, n)] |
| | sigs.append(0.0) |
| |
|
| | logging.info(f"AYS scheduler: {sigs=}") |
| | return torch.FloatTensor(sigs).to(device) |
| |
|
| |
|
| | def add_align_your_step_scheduler() -> None: |
| | """Add AYS scheduler to the list of schedulers""" |
| | try: |
| | from modules import sd_schedulers |
| | except ImportError: |
| | return |
| |
|
| | |
| | if 'align_your_steps' in sd_schedulers.schedulers_map: |
| | return |
| |
|
| | scheduler_v15 = sd_schedulers.Scheduler( |
| | "ays_v15", "Align Your Step SD15", align_your_step_scheduler_v15 |
| | ) |
| | scheduler_xl = sd_schedulers.Scheduler( |
| | "ays_xl", "Align Your Step SDXL", align_your_step_scheduler_xl |
| | ) |
| |
|
| | sd_schedulers.schedulers.append(scheduler_v15) |
| | sd_schedulers.schedulers.append(scheduler_xl) |
| |
|
| | sd_schedulers.schedulers_map[scheduler_v15.name] = scheduler_v15 |
| | sd_schedulers.schedulers_map[scheduler_v15.label] = scheduler_v15 |
| |
|
| | sd_schedulers.schedulers_map[scheduler_xl.name] = scheduler_xl |
| | sd_schedulers.schedulers_map[scheduler_xl.label] = scheduler_xl |
| |
|
| |
|
| | add_align_your_step_scheduler() |
| |
|