startup sequence optimizations

Signed-off-by: vladmandic <mandic00@live.com>
pull/4521/head
vladmandic 2026-01-03 07:54:05 +01:00
parent b4ac004076
commit f6289206d8
6 changed files with 52 additions and 33 deletions

View File

@ -14,6 +14,7 @@
- update reference models previews, thanks @liutyi
- update models specs page, thanks @alerikaisattera
- sdnq improvements
- startup sequence optimizations
- **Fixes**
- extension tab: update checker, date handling, formatting etc., thanks @awsr
- controlnet with non-english ui locales

View File

@ -1,9 +1,11 @@
import hashlib
import os.path
from rich import progress, errors
from modules import shared
from installer import log, console
from modules.json_helpers import readfile, writefile
from modules.paths import data_path
cache_filename = os.path.join(data_path, "cache.json")
cache_data = None
progress_ok = True
@ -12,17 +14,17 @@ progress_ok = True
def init_cache():
global cache_data # pylint: disable=global-statement
if cache_data is None:
cache_data = {} if not os.path.isfile(cache_filename) else shared.readfile(cache_filename, lock=True, as_type="dict")
cache_data = {} if not os.path.isfile(cache_filename) else readfile(cache_filename, lock=True, as_type="dict")
def dump_cache():
shared.writefile(cache_data, cache_filename)
writefile(cache_data, cache_filename)
def cache(subsection):
global cache_data # pylint: disable=global-statement
if cache_data is None:
cache_data = {} if not os.path.isfile(cache_filename) else shared.readfile(cache_filename, lock=True, as_type="dict")
cache_data = {} if not os.path.isfile(cache_filename) else readfile(cache_filename, lock=True, as_type="dict")
s = cache_data.get(subsection, {})
cache_data[subsection] = s
return s
@ -35,11 +37,11 @@ def calculate_sha256(filename, quiet=False):
if not quiet:
if progress_ok:
try:
with progress.open(filename, 'rb', description=f'[cyan]Calculating hash: [yellow]{filename}', auto_refresh=True, console=shared.console) as f:
with progress.open(filename, 'rb', description=f'[cyan]Calculating hash: [yellow]{filename}', auto_refresh=True, console=console) as f:
for chunk in iter(lambda: f.read(blksize), b""):
hash_sha256.update(chunk)
except errors.LiveError:
shared.log.warning('Hash: attempting to use function in a thread')
log.warning('Hash: attempting to use function in a thread')
progress_ok = False
if not progress_ok:
with open(filename, 'rb') as f:
@ -65,6 +67,7 @@ def sha256_from_cache(filename, title, use_addnet_hash=False):
def sha256(filename, title, use_addnet_hash=False):
from modules import shared
global progress_ok # pylint: disable=global-statement
hashes = cache("hashes-addnet") if use_addnet_hash else cache("hashes")
sha256_value = sha256_from_cache(filename, title, use_addnet_hash)
@ -81,7 +84,7 @@ def sha256(filename, title, use_addnet_hash=False):
with progress.open(filename, 'rb', description=f'[cyan]Calculating hash: [yellow]{filename}', auto_refresh=True, console=shared.console) as f:
sha256_value = addnet_hash_safetensors(f)
except errors.LiveError:
shared.log.warning('Hash: attempting to use function in a thread')
log.warning('Hash: attempting to use function in a thread')
progress_ok = False
if not progress_ok:
with open(filename, 'rb') as f:

View File

@ -13,7 +13,7 @@ initialized = False
errors.install()
logging.getLogger("DeepSpeed").disabled = True
timer.startup.record("loader")
errors.log.debug('Initializing: libraries')
np = None
try:

View File

@ -4,25 +4,27 @@ import os
import sys
import time
import contextlib
from enum import Enum
from typing import TYPE_CHECKING
import gradio as gr
from installer import log, print_dict, console, get_version # pylint: disable=unused-import
log.debug('Initializing: shared module')
import modules.memmon
import modules.paths as paths
from modules.json_helpers import readfile, writefile # pylint: disable=W0611
from modules.shared_helpers import listdir, walk_files, html_path, html, req, total_tqdm # pylint: disable=W0611
from modules import errors, devices, shared_state, cmd_args, theme, history, files_cache
from modules.shared_defaults import get_default_modes
from modules import errors, devices, shared_items, shared_state, cmd_args, theme, history, files_cache
from modules.paths import models_path, script_path, data_path, sd_configs_path, sd_default_config, sd_model_file, default_sd_model_file, extensions_dir, extensions_builtin_dir # pylint: disable=W0611
from modules.dml import memory_providers, default_memory_provider, directml_do_hijack
from modules.onnx_impl import execution_providers
from modules.memstats import memory_stats, ram_stats # pylint: disable=unused-import
log.debug('Initializing: pipelines')
from modules import shared_items
from modules.interrogate.openclip import caption_models, caption_types, get_clip_models, refresh_clip_models
from modules.interrogate.vqa import vlm_models, vlm_prompts, vlm_system, vlm_default
from modules.ui_components import DropdownEditable
from modules.options import OptionInfo, options_section
import modules.memmon
import modules.styles
import modules.paths as paths
from installer import log, print_dict, console, get_version # pylint: disable=unused-import
if TYPE_CHECKING:
# Behavior modified by __future__.annotations
@ -52,7 +54,6 @@ face_restorers = []
yolo = None
tab_names = []
extra_networks: list[ExtraNetworksPage] = []
options_templates: dict[str, OptionInfo | LegacyOption] = {}
hypernetworks = {}
settings_components = {}
restricted_opts = {
@ -143,8 +144,15 @@ def list_samplers():
modules.sd_samplers.set_samplers()
return modules.sd_samplers.all_samplers
log.debug('Initializing: default modes')
startup_offload_mode, startup_offload_min_gpu, startup_offload_max_gpu, startup_cross_attention, startup_sdp_options, startup_sdp_choices, startup_sdp_override_options, startup_sdp_override_choices, startup_offload_always, startup_offload_never = get_default_modes(cmd_opts=cmd_opts, mem_stat=mem_stat)
from modules.dml import memory_providers, default_memory_provider, directml_do_hijack
from modules.onnx_impl import execution_providers
log.debug('Initializing: settings')
from modules.ui_components import DropdownEditable
from modules.options import OptionInfo, options_section
options_templates: dict[str, OptionInfo | LegacyOption] = {}
options_templates.update(options_section(('sd', "Model Loading"), {
"sd_backend": OptionInfo('diffusers', "Execution backend", gr.Radio, {"choices": ['diffusers', 'original'], "visible": False }),
@ -836,9 +844,12 @@ opts.data['uni_pc_order'] = max(2, opts.schedulers_solver_order) # compatibility
log.info(f'Engine: backend={backend} compute={devices.backend} device={devices.get_optimal_device_name()} attention="{opts.cross_attention_optimization}" mode={devices.inference_context.__name__}')
profiler = None
import modules.styles
prompt_styles = modules.styles.StyleDatabase(opts)
reference_models = readfile(os.path.join('html', 'reference.json'), as_type="dict") if opts.extra_network_reference_enable else {}
cmd_opts.disable_extension_access = (cmd_opts.share or cmd_opts.listen or (cmd_opts.server_name or False)) and not cmd_opts.insecure
log.debug('Initializing: devices')
devices.args = cmd_opts
devices.opts = opts
devices.onnx = [opts.onnx_execution_provider]

View File

@ -58,7 +58,6 @@ def get_default_modes(cmd_opts, mem_stat):
elif devices.backend in {"directml", "cpu", "mps"}:
default_sdp_override_options = ['Dynamic attention']
return (
default_offload_mode,
default_diffusers_offload_min_gpu_memory,

View File

@ -9,13 +9,18 @@ import logging
import importlib
import contextlib
from threading import Thread
from installer import log, git_commit, custom_excepthook, version
from modules import timer
import modules.loader
import modules.hashes
from installer import log, git_commit, custom_excepthook, version
from modules import timer, paths, shared, extensions, gr_tempdir, modelloader, modeldata
from modules.call_queue import queue_lock, wrap_queued_call, wrap_gradio_gpu_call # pylint: disable=unused-import
import modules.paths
import modules.devices
from modules import shared
from modules.call_queue import queue_lock, wrap_queued_call, wrap_gradio_gpu_call # pylint: disable=unused-import
import modules.gr_tempdir
import modules.modeldata
import modules.extensions
import modules.modelloader
import modules.sd_checkpoint
import modules.sd_samplers
import modules.scripts_manager
@ -63,7 +68,7 @@ fastapi_args = {
def initialize():
log.debug('Initializing')
log.debug('Initializing: modules')
modules.sd_checkpoint.init_metadata()
modules.hashes.init_cache()
@ -80,7 +85,7 @@ def initialize():
modules.model_te.refresh_te_list()
timer.startup.record("te")
modelloader.cleanup_models()
modules.modelloader.cleanup_models()
modules.sd_models.setup_model()
timer.startup.record("models")
@ -100,7 +105,7 @@ def initialize():
yolo.initialize()
timer.startup.record("detailer")
extensions.list_extensions()
modules.extensions.list_extensions()
timer.startup.record("extensions")
log.info('Load extensions')
@ -110,7 +115,7 @@ def initialize():
timer.startup.records["extensions"] = t_total # scripts can reset the time
log.debug(f'Extensions init time: {t_timer.summary()}')
modelloader.load_upscalers()
modules.modelloader.load_upscalers()
timer.startup.record("upscalers")
modules.ui_extra_networks.initialize()
@ -151,7 +156,7 @@ def initialize():
def load_model():
modeldata.model_data.locked = False
modules.modeldata.model_data.locked = False
autoload = shared.opts.sd_checkpoint_autoload or shared.cmd_opts.ckpt is not None
log.info(f'Model: autoload={autoload} selected="{shared.opts.sd_model_checkpoint}"')
if autoload:
@ -169,7 +174,7 @@ def load_model():
shared.opts.onchange("sd_vae", wrap_queued_call(lambda: modules.sd_vae.reload_vae_weights()), call=False)
shared.opts.onchange("sd_unet", wrap_queued_call(lambda: modules.sd_unet.load_unet(shared.sd_model)), call=False)
shared.opts.onchange("sd_text_encoder", wrap_queued_call(lambda: modules.sd_models.reload_text_encoder()), call=False)
shared.opts.onchange("temp_dir", gr_tempdir.on_tmpdir_changed)
shared.opts.onchange("temp_dir", modules.gr_tempdir.on_tmpdir_changed)
timer.startup.record("onchange")
@ -232,7 +237,7 @@ def start_common():
log.info(f'Base path: data="{shared.cmd_opts.data_dir}"')
if shared.cmd_opts.models_dir is not None and len(shared.cmd_opts.models_dir) > 0 and shared.cmd_opts.models_dir != 'models':
log.info(f'Base path: models="{shared.cmd_opts.models_dir}"')
paths.create_paths(shared.opts)
modules.paths.create_paths(shared.opts)
async_policy()
initialize()
if shared.cmd_opts.backend == 'original':
@ -245,7 +250,7 @@ def start_common():
except Exception:
pass
if shared.opts.clean_temp_dir_at_start:
gr_tempdir.cleanup_tmpdr()
modules.gr_tempdir.cleanup_tmpdr()
timer.startup.record("cleanup")
@ -317,7 +322,7 @@ def start_ui():
_frontend=True and shared.cmd_opts.share,
)
if shared.cmd_opts.data_dir is not None:
gr_tempdir.register_tmp_file(shared.demo, os.path.join(shared.cmd_opts.data_dir, 'x'))
modules.gr_tempdir.register_tmp_file(shared.demo, os.path.join(shared.cmd_opts.data_dir, 'x'))
shared.log.info(f'Local URL: {local_url}')
if shared.cmd_opts.listen:
if not gradio_auth_creds: