Skip to content

Commit 2b49dae

Browse files
committed
en load improvements, torchvision compatibility fix
1 parent e0b99b7 commit 2b49dae

10 files changed

+79
-41
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Change Log for SD.Next
22

3+
## Update for 2023-12-05
4+
5+
- **General**
6+
- **Extra networks** new settting -> extra networks -> build info on first access
7+
indexes all networks on first access instead of server startup
8+
- disable google fonts check on server startup
9+
- fix torchvision/basicsr compatibility
10+
311
## Update for 2023-12-04
412

513
What's new? Native video in SD.Next via both **AnimateDiff** and **Stable-Video-Diffusion** - and including native MP4 encoding and smooth video outputs out-of-the-box, not just animated-GIFs.

html/locale_en.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -484,8 +484,8 @@
484484
{"id":"","label":"Dark","localized":"","hint":""},
485485
{"id":"","label":"Light","localized":"","hint":""},
486486
{"id":"","label":"Show grid in results","localized":"","hint":""},
487-
{"id":"","label":"For inpainting, include the greyscale mask in results","localized":"","hint":""},
488-
{"id":"","label":"For inpainting, include masked composite in results","localized":"","hint":""},
487+
{"id":"","label":"Inpainting include greyscale mask in results","localized":"","hint":""},
488+
{"id":"","label":"Inpainting include masked composite in results","localized":"","hint":""},
489489
{"id":"","label":"Do not change selected model when reading generation parameters","localized":"","hint":""},
490490
{"id":"","label":"Send seed when sending prompt or image to other interface","localized":"","hint":""},
491491
{"id":"","label":"Send size when sending prompt or image to another interface","localized":"","hint":""},

javascript/extraNetworks.js

+24-5
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,23 @@ function readCardDescription(page, item) {
9090
});
9191
}
9292

93-
async function filterExtraNetworksForTab(tabname, searchTerm) {
93+
function getCardsForActivePage() {
94+
const pagename = getENActivePage();
95+
if (!pagename) return [];
96+
const allCards = Array.from(gradioApp().querySelectorAll('.extra-network-cards > .card'));
97+
const cards = allCards.filter((el) => el.dataset.page.toLowerCase().includes(pagename.toLowerCase()));
98+
log('getCardsForActivePage', pagename, cards.length);
99+
return allCards;
100+
}
101+
102+
async function filterExtraNetworksForTab(searchTerm) {
94103
let found = 0;
95104
let items = 0;
96105
const t0 = performance.now();
97106
const pagename = getENActivePage();
98107
if (!pagename) return;
99108
const allPages = Array.from(gradioApp().querySelectorAll('.extra-network-cards'));
100-
const pages = allPages.filter((el) => el.id.includes(pagename.toLowerCase()));
109+
const pages = allPages.filter((el) => el.id.toLowerCase().includes(pagename.toLowerCase()));
101110
for (const pg of pages) {
102111
const cards = Array.from(pg.querySelectorAll('.card') || []);
103112
cards.forEach((elem) => {
@@ -158,7 +167,7 @@ function sortExtraNetworks() {
158167
const pagename = getENActivePage();
159168
if (!pagename) return 'sort error: unknown page';
160169
const allPages = Array.from(gradioApp().querySelectorAll('.extra-network-cards'));
161-
const pages = allPages.filter((el) => el.id.includes(pagename.toLowerCase()));
170+
const pages = allPages.filter((el) => el.id.toLowerCase().includes(pagename.toLowerCase()));
162171
let num = 0;
163172
for (const pg of pages) {
164173
const cards = Array.from(pg.querySelectorAll('.card') || []);
@@ -255,8 +264,17 @@ function refeshDetailsEN(args) {
255264
return args;
256265
}
257266

258-
// init
267+
// refresh on en show
268+
function refreshENpage() {
269+
if (getCardsForActivePage().length === 0) {
270+
log('refreshENpage');
271+
const tabname = getENActiveTab();
272+
const btnRefresh = gradioApp().getElementById(`${tabname}_extra_refresh`);
273+
if (btnRefresh) btnRefresh.click();
274+
}
275+
}
259276

277+
// init
260278
function setupExtraNetworksForTab(tabname) {
261279
gradioApp().querySelector(`#${tabname}_extra_tabs`).classList.add('extra-networks');
262280
const en = gradioApp().getElementById(`${tabname}_extra_networks`);
@@ -307,7 +325,7 @@ function setupExtraNetworksForTab(tabname) {
307325
txtSearchValue.addEventListener('input', (evt) => {
308326
if (searchTimer) clearTimeout(searchTimer);
309327
searchTimer = setTimeout(() => {
310-
filterExtraNetworksForTab(tabname, txtSearchValue.value.toLowerCase());
328+
filterExtraNetworksForTab(txtSearchValue.value.toLowerCase());
311329
searchTimer = null;
312330
}, 150);
313331
});
@@ -339,6 +357,7 @@ function setupExtraNetworksForTab(tabname) {
339357
el.parentElement.style.width = '-webkit-fill-available';
340358
}
341359
if (entries[0].intersectionRatio > 0) {
360+
refreshENpage();
342361
if (window.opts.extra_networks_card_cover === 'cover') {
343362
en.style.transition = '';
344363
en.style.zIndex = 100;

modules/extensions.py

+1
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,4 @@ def list_extensions():
153153
for dirname, path, is_builtin in extension_paths:
154154
extension = Extension(name=dirname, path=path, enabled=dirname not in disabled_extensions, is_builtin=is_builtin)
155155
extensions.append(extension)
156+
shared.log.info(f'Disabled extensions: {[e.name for e in extensions if not e.enabled]}')

modules/loader.py

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22
import re
3+
import sys
34
import logging
45
import warnings
56
import urllib3
@@ -55,3 +56,12 @@
5556
errors.log.debug(f'Detected: cores={cores} affinity={affinity} set threads={threads}')
5657
except Exception:
5758
pass
59+
60+
try: # fix changed import in torchvision 0.17+, which breaks basicsr
61+
import torchvision.transforms.functional_tensor # pylint: disable=unused-import, ungrouped-imports
62+
except ImportError:
63+
try:
64+
import torchvision.transforms.functional as functional
65+
sys.modules["torchvision.transforms.functional_tensor"] = functional
66+
except ImportError:
67+
pass # shrug...

modules/sd_models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
806806
sd_model = None
807807

808808
try:
809-
if shared.cmd_opts.ckpt is not None and model_data.initial: # initial load
809+
if shared.cmd_opts.ckpt is not None and os.path.isdir(shared.cmd_opts.ckpt) and model_data.initial: # initial load
810810
ckpt_basename = os.path.basename(shared.cmd_opts.ckpt)
811811
model_name = modelloader.find_diffuser(ckpt_basename)
812812
if model_name is not None:
@@ -833,6 +833,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No
833833
if vae is not None:
834834
diffusers_load_config["vae"] = vae
835835

836+
shared.log.debug(f'Diffusers loading: path="{checkpoint_info.path}"')
836837
if os.path.isdir(checkpoint_info.path):
837838
err1 = None
838839
err2 = None

modules/shared.py

+3-9
Original file line numberDiff line numberDiff line change
@@ -166,17 +166,14 @@ def temp_disable_extensions():
166166
for ext in disable_safe:
167167
if ext not in opts.disabled_extensions:
168168
disabled.append(ext)
169-
log.info(f'Safe mode disabling extensions: {disabled}')
170169
if backend == Backend.DIFFUSERS:
171170
for ext in disable_diffusers:
172171
if ext not in opts.disabled_extensions:
173172
disabled.append(ext)
174-
log.info(f'Disabling uncompatible extensions: backend={backend} {disabled}')
175173
if backend == Backend.ORIGINAL:
176174
for ext in disable_original:
177175
if ext not in opts.disabled_extensions:
178176
disabled.append(ext)
179-
log.info(f'Disabling uncompatible extensions: backend={backend} {disabled}')
180177
cmd_opts.controlnet_loglevel = 'WARNING'
181178
return disabled
182179

@@ -469,8 +466,8 @@ def default(obj):
469466
"gallery_height": OptionInfo("", "Gallery height", gr.Textbox),
470467
"compact_view": OptionInfo(False, "Compact view"),
471468
"return_grid": OptionInfo(True, "Show grid in results"),
472-
"return_mask": OptionInfo(False, "For inpainting, include the greyscale mask in results"),
473-
"return_mask_composite": OptionInfo(False, "For inpainting, include masked composite in results"),
469+
"return_mask": OptionInfo(False, "Inpainting include greyscale mask in results"),
470+
"return_mask_composite": OptionInfo(False, "Inpainting include masked composite in results"),
474471
"disable_weights_auto_swap": OptionInfo(True, "Do not change selected model when reading generation parameters"),
475472
"send_seed": OptionInfo(True, "Send seed when sending prompt or image to other interface"),
476473
"send_size": OptionInfo(True, "Send size when sending prompt or image to another interface"),
@@ -601,18 +598,15 @@ def default(obj):
601598
"extra_networks_card_size": OptionInfo(160, "UI card size (px)", gr.Slider, {"minimum": 20, "maximum": 2000, "step": 1}),
602599
"extra_networks_card_square": OptionInfo(True, "UI disable variable aspect ratio"),
603600
"extra_networks_card_fit": OptionInfo("cover", "UI image contain method", gr.Radio, {"choices": ["contain", "cover", "fill"], "visible": False}),
604-
605601
"extra_networks_sep2": OptionInfo("<h2>Extra networks general</h2>", "", gr.HTML),
606-
"extra_network_skip_indexing": OptionInfo(False, "Do not automatically build extra network pages", gr.Checkbox),
602+
"extra_network_skip_indexing": OptionInfo(False, "Build info on first access", gr.Checkbox),
607603
"extra_networks_default_multiplier": OptionInfo(1.0, "Default multiplier for extra networks", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}),
608-
609604
"extra_networks_sep3": OptionInfo("<h2>Extra networks settings</h2>", "", gr.HTML),
610605
"extra_networks_styles": OptionInfo(True, "Show built-in styles"),
611606
"lora_preferred_name": OptionInfo("filename", "LoRA preffered name", gr.Radio, {"choices": ["filename", "alias"]}),
612607
"lora_add_hashes_to_infotext": OptionInfo(True, "LoRA add hash info"),
613608
"lora_in_memory_limit": OptionInfo(0, "LoRA memory cache", gr.Slider, {"minimum": 0, "maximum": 24, "step": 1}),
614609
"lora_functional": OptionInfo(False, "Use Kohya method for handling multiple LoRA", gr.Checkbox, { "visible": False }),
615-
616610
"sd_hypernetwork": OptionInfo("None", "Add hypernetwork to prompt", gr.Dropdown, { "choices": ["None"], "visible": False }),
617611
}))
618612

modules/theme.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import json
3-
import urllib.request
43
import gradio as gr
54
import modules.shared
65
# from modules.shared import log, opts, req, writefile
@@ -51,18 +50,21 @@ def reload_gradio_theme(theme_name=None):
5150
if not theme_name:
5251
theme_name = modules.shared.opts.gradio_theme
5352
default_font_params = {}
53+
"""
5454
res = 0
5555
try:
56+
import urllib.request
5657
request = urllib.request.Request("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono", method="HEAD")
5758
res = urllib.request.urlopen(request, timeout=3.0).status # pylint: disable=consider-using-with
5859
except Exception:
5960
res = 0
6061
if res != 200:
6162
modules.shared.log.info('No internet access detected, using default fonts')
62-
default_font_params = {
63-
'font':['Helvetica', 'ui-sans-serif', 'system-ui', 'sans-serif'],
64-
'font_mono':['IBM Plex Mono', 'ui-monospace', 'Consolas', 'monospace']
65-
}
63+
"""
64+
default_font_params = {
65+
'font':['Helvetica', 'ui-sans-serif', 'system-ui', 'sans-serif'],
66+
'font_mono':['IBM Plex Mono', 'ui-monospace', 'Consolas', 'monospace']
67+
}
6668
is_builtin = theme_name in list_builtin_themes()
6769
modules.shared.log.info(f'Load UI theme: name="{theme_name}" style={modules.shared.opts.theme_style} base={"sdnext.css" if is_builtin else "base.css"}')
6870
if is_builtin:

modules/ui_extensions.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,14 @@ def refresh_extensions_list(search_text, sort_column):
250250
global extensions_list # pylint: disable=global-statement
251251
import urllib.request
252252
try:
253-
with urllib.request.urlopen(extensions_index) as response:
253+
shared.log.debug(f'Updating extensions list: url={extensions_index}')
254+
with urllib.request.urlopen(extensions_index, timeout=3.0) as response:
254255
text = response.read()
255256
extensions_list = json.loads(text)
256257
with open(os.path.join(paths.script_path, "html", "extensions.json"), "w", encoding="utf-8") as outfile:
257258
json_object = json.dumps(extensions_list, indent=2)
258259
outfile.write(json_object)
259-
shared.log.debug(f'Updated extensions list: {len(extensions_list)} {extensions_index}')
260+
shared.log.info(f'Updated extensions list: items={len(extensions_list)} url={extensions_index}')
260261
except Exception as e:
261262
shared.log.warning(f'Updated extensions list failed: {extensions_index} {e}')
262263
list_extensions()

modules/ui_extra_networks.py

+19-17
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,6 @@ def handle_endtag(self, tag):
343343
self.text += '\n'
344344

345345
fn = os.path.splitext(path)[0] + '.txt'
346-
# if os.path.exists(fn):
347346
if fn in listdir(os.path.dirname(path)):
348347
try:
349348
with open(fn, "r", encoding="utf-8", errors="replace") as f:
@@ -364,7 +363,6 @@ def handle_endtag(self, tag):
364363
def find_info(self, path):
365364
t0 = time.time()
366365
fn = os.path.splitext(path)[0] + '.json'
367-
# if os.path.exists(fn):
368366
data = {}
369367
if fn in listdir(os.path.dirname(path)):
370368
data = shared.readfile(fn, silent=True)
@@ -382,12 +380,15 @@ def initialize():
382380
def register_page(page: ExtraNetworksPage):
383381
# registers extra networks page for the UI; recommend doing it in on_before_ui() callback for extensions
384382
debug(f'EN register-page: {page}')
383+
if page in shared.extra_networks:
384+
debug(f'EN register-page: {page} already registered')
385+
return
385386
shared.extra_networks.append(page)
386-
allowed_dirs.clear()
387-
for pg in shared.extra_networks:
388-
for folder in pg.allowed_directories_for_previews():
389-
if folder not in allowed_dirs:
390-
allowed_dirs.append(os.path.abspath(folder))
387+
# allowed_dirs.clear()
388+
# for pg in shared.extra_networks:
389+
for folder in page.allowed_directories_for_previews():
390+
if folder not in allowed_dirs:
391+
allowed_dirs.append(os.path.abspath(folder))
391392

392393

393394
def register_pages():
@@ -396,6 +397,7 @@ def register_pages():
396397
from modules.ui_extra_networks_checkpoints import ExtraNetworksPageCheckpoints
397398
from modules.ui_extra_networks_styles import ExtraNetworksPageStyles
398399
from modules.ui_extra_networks_vae import ExtraNetworksPageVAEs
400+
debug('EN register-pages')
399401
register_page(ExtraNetworksPageCheckpoints())
400402
register_page(ExtraNetworksPageStyles())
401403
register_page(ExtraNetworksPageTextualInversion())
@@ -556,15 +558,16 @@ def ui_tab_change(page):
556558
if ui.tabname == 'txt2img': # refresh only once
557559
global refresh_time # pylint: disable=global-statement
558560
refresh_time = time.time()
559-
threads = []
560-
for page in get_pages():
561-
if os.environ.get('SD_EN_DEBUG', None) is not None:
562-
threads.append(threading.Thread(target=page.create_items, args=[ui.tabname]))
563-
threads[-1].start()
564-
else:
565-
page.create_items(ui.tabname)
566-
for thread in threads:
567-
thread.join()
561+
if not skip_indexing:
562+
threads = []
563+
for page in get_pages():
564+
if os.environ.get('SD_EN_DEBUG', None) is not None:
565+
threads.append(threading.Thread(target=page.create_items, args=[ui.tabname]))
566+
threads[-1].start()
567+
else:
568+
page.create_items(ui.tabname)
569+
for thread in threads:
570+
thread.join()
568571
for page in get_pages():
569572
page.create_page(ui.tabname, skip_indexing)
570573
with gr.Tab(page.title, id=page.title.lower().replace(" ", "_"), elem_classes="extra-networks-tab") as tab:
@@ -574,7 +577,6 @@ def ui_tab_change(page):
574577
if shared.cmd_opts.profile:
575578
errors.profile(pr, 'ExtraNetworks')
576579
pr.disable()
577-
578580
# ui.tabs.change(fn=ui_tab_change, inputs=[], outputs=[ui.button_scan, ui.button_save])
579581

580582
def fn_save_img(image):

0 commit comments

Comments
 (0)