diff --git a/.eslintrc.js b/.eslintrc.js index 2e7258f6b..aa8039f61 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -88,6 +88,7 @@ module.exports = { // imageviewer.js modalPrevImage: "readonly", modalNextImage: "readonly", + updateModalImageIfVisible: "readonly", // localStorage.js localSet: "readonly", localGet: "readonly", diff --git a/README.md b/README.md index 007f590d2..a93079fd1 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ If your system is very new, you need to install python3.11 or python3.10: # Ubuntu 24.04 sudo add-apt-repository ppa:deadsnakes/ppa sudo apt update -sudo apt install python3.11 +sudo apt install python3.11 python3.11-venv # Manjaro/Arch sudo pacman -S yay diff --git a/javascript/imageviewer.js b/javascript/imageviewer.js index 979d05de5..737fe483b 100644 --- a/javascript/imageviewer.js +++ b/javascript/imageviewer.js @@ -54,6 +54,7 @@ function updateOnBackgroundChange() { updateModalImage(); } } +const updateModalImageIfVisible = updateOnBackgroundChange; function modalImageSwitch(offset) { var galleryButtons = all_gallery_buttons(); @@ -164,6 +165,7 @@ function modalLivePreviewToggle(event) { const modalToggleLivePreview = gradioApp().getElementById("modal_toggle_live_preview"); opts.js_live_preview_in_modal_lightbox = !opts.js_live_preview_in_modal_lightbox; modalToggleLivePreview.innerHTML = opts.js_live_preview_in_modal_lightbox ? "🗇" : "🗆"; + updateModalImageIfVisible(); event.stopPropagation(); } diff --git a/javascript/progressbar.js b/javascript/progressbar.js index c81a41e9a..e7864bba9 100644 --- a/javascript/progressbar.js +++ b/javascript/progressbar.js @@ -190,7 +190,7 @@ function requestProgress(id_task, progressbarContainer, gallery, atEnd, onProgre livePreview.className = 'livePreview'; gallery.insertBefore(livePreview, gallery.firstElementChild); } - + updateModalImageIfVisible(); livePreview.appendChild(img); if (livePreview.childElementCount > 2) { livePreview.removeChild(livePreview.firstElementChild); diff --git a/modules/images.py b/modules/images.py index cfdfb3384..b5229b60c 100644 --- a/modules/images.py +++ b/modules/images.py @@ -409,6 +409,7 @@ class FilenameGenerator: 'generation_number': lambda self: NOTHING_AND_SKIP_PREVIOUS_TEXT if (self.p.n_iter == 1 and self.p.batch_size == 1) or self.zip else self.p.iteration * self.p.batch_size + self.p.batch_index + 1, 'hasprompt': lambda self, *args: self.hasprompt(*args), # accepts formats:[hasprompt..] 'clip_skip': lambda self: opts.data["CLIP_stop_at_last_layers"], + 'randn_source': lambda self: opts.data["randn_source"], 'denoising': lambda self: self.p.denoising_strength if self.p and self.p.denoising_strength else NOTHING_AND_SKIP_PREVIOUS_TEXT, 'user': lambda self: self.p.user, 'vae_filename': lambda self: self.get_vae_filename(), diff --git a/modules/launch_utils.py b/modules/launch_utils.py index c62d4f642..394804f67 100644 --- a/modules/launch_utils.py +++ b/modules/launch_utils.py @@ -330,6 +330,7 @@ def get_cuda_comp_cap(): def early_access_blackwell_wheels(): """For Blackwell GPUs, use Early Access PyTorch Wheels provided by Nvidia""" + print('deprecated early_access_blackwell_wheels') if all([ os.environ.get('TORCH_INDEX_URL') is None, sys.version_info.major == 3, @@ -347,8 +348,8 @@ def early_access_blackwell_wheels(): def prepare_environment(): - torch_index_url = os.environ.get('TORCH_INDEX_URL', "https://download.pytorch.org/whl/cu121") - torch_command = os.environ.get('TORCH_COMMAND', early_access_blackwell_wheels() or f"pip install torch==2.1.2 torchvision==0.16.2 --extra-index-url {torch_index_url}") + torch_index_url = os.environ.get('TORCH_INDEX_URL', "https://download.pytorch.org/whl/cu128") + torch_command = os.environ.get('TORCH_COMMAND', f"pip install torch==2.7.0 torchvision==0.22.0 --extra-index-url {torch_index_url}") if args.use_ipex: if platform.system() == "Windows": # The "Nuullll/intel-extension-for-pytorch" wheels were built from IPEX source for Intel Arc GPU: https://github.com/intel/intel-extension-for-pytorch/tree/xpu-main @@ -372,7 +373,7 @@ def prepare_environment(): requirements_file = os.environ.get('REQS_FILE', "requirements_versions.txt") requirements_file_for_npu = os.environ.get('REQS_FILE_FOR_NPU', "requirements_npu.txt") - xformers_package = os.environ.get('XFORMERS_PACKAGE', 'xformers==0.0.23.post1') + xformers_package = os.environ.get('XFORMERS_PACKAGE', 'xformers==0.0.30') clip_package = os.environ.get('CLIP_PACKAGE', "https://github.com/openai/CLIP/archive/d50d76daa670286dd6cacf3bcd80b5e4823fc8e1.zip") openclip_package = os.environ.get('OPENCLIP_PACKAGE', "https://github.com/mlfoundations/open_clip/archive/bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b.zip") diff --git a/modules/sd_schedulers.py b/modules/sd_schedulers.py index f4d16e309..3047600bc 100644 --- a/modules/sd_schedulers.py +++ b/modules/sd_schedulers.py @@ -117,12 +117,15 @@ def ddim_scheduler(n, sigma_min, sigma_max, inner_model, device): def beta_scheduler(n, sigma_min, sigma_max, inner_model, device): - # From "Beta Sampling is All You Need" [arXiv:2407.12173] (Lee et. al, 2024) """ + # From "Beta Sampling is All You Need" [arXiv:2407.12173] (Lee et. al, 2024) alpha = shared.opts.beta_dist_alpha beta = shared.opts.beta_dist_beta - timesteps = 1 - np.linspace(0, 1, n) - timesteps = [stats.beta.ppf(x, alpha, beta) for x in timesteps] - sigmas = [sigma_min + (x * (sigma_max-sigma_min)) for x in timesteps] + curve = [stats.beta.ppf(x, alpha, beta) for x in np.linspace(1, 0, n)] + + start = inner_model.sigma_to_t(torch.tensor(sigma_max)) + end = inner_model.sigma_to_t(torch.tensor(sigma_min)) + timesteps = [end + x * (start - end) for x in curve] + sigmas = [inner_model.t_to_sigma(ts) for ts in timesteps] sigmas += [0.0] return torch.FloatTensor(sigmas).to(device) diff --git a/modules/shared_options.py b/modules/shared_options.py index e8b09f1a6..03632ecc0 100644 --- a/modules/shared_options.py +++ b/modules/shared_options.py @@ -407,8 +407,8 @@ options_templates.update(options_section(('sampler-params', "Sampler parameters" 'uni_pc_lower_order_final': OptionInfo(True, "UniPC lower order final", infotext='UniPC lower order final'), 'sd_noise_schedule': OptionInfo("Default", "Noise schedule for sampling", gr.Radio, {"choices": ["Default", "Zero Terminal SNR"]}, infotext="Noise Schedule").info("for use with zero terminal SNR trained models"), 'skip_early_cond': OptionInfo(0.0, "Ignore negative prompt during early sampling", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}, infotext="Skip Early CFG").info("disables CFG on a proportion of steps at the beginning of generation; 0=skip none; 1=skip all; can both improve sample diversity/quality and speed up sampling; XYZ plot: Skip Early CFG"), - 'beta_dist_alpha': OptionInfo(0.6, "Beta scheduler - alpha", gr.Slider, {"minimum": 0.01, "maximum": 1.0, "step": 0.01}, infotext='Beta scheduler alpha').info('Default = 0.6; the alpha parameter of the beta distribution used in Beta sampling'), - 'beta_dist_beta': OptionInfo(0.6, "Beta scheduler - beta", gr.Slider, {"minimum": 0.01, "maximum": 1.0, "step": 0.01}, infotext='Beta scheduler beta').info('Default = 0.6; the beta parameter of the beta distribution used in Beta sampling'), + 'beta_dist_alpha': OptionInfo(0.6, "Beta scheduler - alpha", gr.Slider, {"minimum": 0.01, "maximum": 5.0, "step": 0.01}, infotext='Beta scheduler alpha').info('Default = 0.6; the alpha parameter of the beta distribution used in Beta sampling'), + 'beta_dist_beta': OptionInfo(0.6, "Beta scheduler - beta", gr.Slider, {"minimum": 0.01, "maximum": 5.0, "step": 0.01}, infotext='Beta scheduler beta').info('Default = 0.6; the beta parameter of the beta distribution used in Beta sampling'), })) options_templates.update(options_section(('postprocessing', "Postprocessing", "postprocessing"), { diff --git a/style.css b/style.css index 0b255bc48..223795263 100644 --- a/style.css +++ b/style.css @@ -602,6 +602,7 @@ table.popup-table .link{ background: var(--background-fill-primary); width: 100%; height: 100%; + pointer-events: none; } .livePreview img{