mirror of
https://github.com/vladmandic/automatic
synced 2026-09-19 17:24:32 +02:00
fix callbacks
This commit is contained in:
+51
-54
@@ -3,6 +3,7 @@
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
import logging
|
||||
import importlib
|
||||
import asyncio
|
||||
import argparse
|
||||
@@ -13,34 +14,40 @@ from generate import generate # pylint: disable=import-error
|
||||
grid = importlib.import_module('image-grid').grid
|
||||
|
||||
|
||||
default = 'best/icbinp-icantbelieveIts-final.safetensors [73f48afbdc]'
|
||||
exclude = ['sd-v20', 'sd-v21', 'inpainting', 'pix2pix']
|
||||
# used by lora
|
||||
prompt = "photo of <keyword> <embedding>, photograph, posing, pose, high detailed, intricate, elegant, sharp focus, skin texture, looking forward, facing camera, 135mm, shot on dslr, canon 5d, 4k, modelshoot style, cinematic lighting"
|
||||
|
||||
# used by models
|
||||
prompts = [
|
||||
('photo citiscape', 'cityscape during night, photorealistic, high detailed, sharp focus, depth of field, 4k'),
|
||||
('photo car', 'photo of a sports car, high detailed, sharp focus, dslr, cinematic lighting, realistic'),
|
||||
('photo woman', 'portrait photo of beautiful woman, high detailed, dslr, 35mm'),
|
||||
('photo naked', 'full body photo of beautiful sexy naked woman, high detailed, dslr, 35mm'),
|
||||
|
||||
('photo taylor', 'portrait photo of beautiful woman taylor swift, high detailed, sharp focus, depth of field, dslr, 35mm <lora:taylor-swift:1>'),
|
||||
('photo ti-mia', 'portrait photo of beautiful woman "ti-mia", naked, high detailed, dslr, 35mm'),
|
||||
('photo ti-vlado', 'portrait photo of man "ti-vlado", high detailed, dslr, 35mm'),
|
||||
('photo lora-vlado', 'portrait photo of man vlado, high detailed, dslr, 35mm <lora:vlado-original:1>'),
|
||||
|
||||
('wlop', 'a stunning portrait of sexy teen girl in a wet t-shirt, vivid color palette, digital painting, octane render, highly detailed, particles, light effect, volumetric lighting, art by wlop'),
|
||||
('greg rutkowski', 'beautiful woman, high detailed, sharp focus, depth of field, 4k, art by greg rutkowski'),
|
||||
('carne griffiths', 'beautiful woman taylor swift, high detailed, sharp focus, depth of field, art by carne griffiths <lora:taylor-swift:1>'),
|
||||
('carne griffiths', 'man vlado, high detailed, sharp focus, depth of field, art by carne griffiths <lora:vlado-full:1>'),
|
||||
]
|
||||
|
||||
options = Map({
|
||||
# used by extra networks
|
||||
'prompt': 'photo of <keyword> <embedding>, photograph, posing, pose, high detailed, intricate, elegant, sharp focus, skin texture, looking forward, facing camera, 135mm, shot on dslr, canon 5d, 4k, modelshoot style, cinematic lighting',
|
||||
# used by models
|
||||
'prompts': [
|
||||
('photo citiscape', 'cityscape during night, photorealistic, high detailed, sharp focus, depth of field, 4k'),
|
||||
('photo car', 'photo of a sports car, high detailed, sharp focus, dslr, cinematic lighting, realistic'),
|
||||
('photo woman', 'portrait photo of beautiful woman, high detailed, dslr, 35mm'),
|
||||
('photo naked', 'full body photo of beautiful sexy naked woman, high detailed, dslr, 35mm'),
|
||||
|
||||
('photo taylor', 'portrait photo of beautiful woman taylor swift, high detailed, sharp focus, depth of field, dslr, 35mm <lora:taylor-swift:1>'),
|
||||
('photo ti-mia', 'portrait photo of beautiful woman "ti-mia", naked, high detailed, dslr, 35mm'),
|
||||
('photo ti-vlado', 'portrait photo of man "ti-vlado", high detailed, dslr, 35mm'),
|
||||
('photo lora-vlado', 'portrait photo of man vlado, high detailed, dslr, 35mm <lora:vlado-original:1>'),
|
||||
|
||||
('wlop', 'a stunning portrait of sexy teen girl in a wet t-shirt, vivid color palette, digital painting, octane render, highly detailed, particles, light effect, volumetric lighting, art by wlop'),
|
||||
('greg rutkowski', 'beautiful woman, high detailed, sharp focus, depth of field, 4k, art by greg rutkowski'),
|
||||
('carne griffiths', 'beautiful woman taylor swift, high detailed, sharp focus, depth of field, art by carne griffiths <lora:taylor-swift:1>'),
|
||||
('carne griffiths', 'man vlado, high detailed, sharp focus, depth of field, art by carne griffiths <lora:vlado-full:1>'),
|
||||
],
|
||||
# save format
|
||||
'format': '.jpg',
|
||||
# used by generate script
|
||||
'paths': {
|
||||
"root": "/mnt/c/Users/mandi/OneDrive/Generative/Generate",
|
||||
"generate": "image",
|
||||
"upscale": "upscale",
|
||||
"grid": "grid",
|
||||
},
|
||||
# generate params
|
||||
'generate': {
|
||||
'restore_faces': True,
|
||||
'prompt': '',
|
||||
'negative_prompt': 'digital art, cgi, render, foggy, blurry, blurred, duplicate, ugly, mutilated, mutation, mutated, out of frame, bad anatomy, disfigured, deformed, censored, low res, low resolution, watermark, text, poorly drawn face, poorly drawn hands, signature',
|
||||
'negative_prompt': 'foggy, blurry, blurred, duplicate, ugly, mutilated, mutation, mutated, out of frame, bad anatomy, disfigured, deformed, censored, low res, low resolution, watermark, text, poorly drawn face, poorly drawn hands, signature',
|
||||
'steps': 20,
|
||||
'batch_size': 2,
|
||||
'n_iter': 1,
|
||||
@@ -50,28 +57,18 @@ options = Map({
|
||||
'width': 512,
|
||||
'height': 512,
|
||||
},
|
||||
'format': '.jpg',
|
||||
'paths': {
|
||||
"root": "/mnt/c/Users/mandi/OneDrive/Generative/Generate",
|
||||
"generate": "image",
|
||||
"upscale": "upscale",
|
||||
"grid": "grid",
|
||||
},
|
||||
'options': {
|
||||
"sd_model_checkpoint": "sd-v15-runwayml",
|
||||
"sd_vae": "vae-ft-mse-840000-ema-pruned.ckpt",
|
||||
},
|
||||
'lora': {
|
||||
'strength': 1.0,
|
||||
},
|
||||
'hypernetwork': {
|
||||
'keyword': 'beautiful sexy woman',
|
||||
'keyword': '',
|
||||
'strength': 1.0,
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
def preview_exists(folder, model):
|
||||
model = os.path.splitext(model)[0]
|
||||
for suffix in ['', '.preview']:
|
||||
for ext in ['.jpg', '.png', '.webp']:
|
||||
fn = os.path.join(folder, f'{model}{suffix}{ext}')
|
||||
@@ -87,7 +84,7 @@ async def preview_models(params):
|
||||
excluded = []
|
||||
for m in allmodels: # loop through all registered models
|
||||
ok = True
|
||||
for e in exclude: # check if model is excluded
|
||||
for e in params.exclude: # check if model is excluded
|
||||
if e in m:
|
||||
excluded.append(m)
|
||||
ok = False
|
||||
@@ -108,18 +105,13 @@ async def preview_models(params):
|
||||
log.info({ 'models preview' })
|
||||
log.info({ 'models': len(models), 'excluded': len(excluded) })
|
||||
opt = await get('/sdapi/v1/options')
|
||||
if params.output != '':
|
||||
folder = params.output
|
||||
else:
|
||||
folder = os.path.abspath(os.path.join(opt['hypernetwork_dir'], '..', 'Stable-diffusion'))
|
||||
log.info({ 'output directory': folder })
|
||||
log.info({ 'total jobs': len(models) * options.generate.batch_size, 'per-model': options.generate.batch_size })
|
||||
log.info(json.dumps(options, indent=2))
|
||||
for model in models:
|
||||
if preview_exists(folder, model) and len(params.input) == 0: # if model preview exists and not manually included
|
||||
if preview_exists(opt['ckpt_dir'], model) and len(params.input) == 0: # if model preview exists and not manually included
|
||||
log.info({ 'model preview exists': model })
|
||||
continue
|
||||
fn = os.path.join(folder, os.path.basename(model) + options.format)
|
||||
fn = os.path.join(opt['ckpt_dir'], os.path.splitext(model)[0] + options.format)
|
||||
log.info({ 'model load': model })
|
||||
|
||||
opt['sd_model_checkpoint'] = model
|
||||
@@ -130,7 +122,7 @@ async def preview_models(params):
|
||||
images = []
|
||||
labels = []
|
||||
t0 = time.time()
|
||||
for label, p in prompts:
|
||||
for label, p in options.prompts:
|
||||
options.generate.prompt = p
|
||||
log.info({ 'model generating': model, 'label': label, 'prompt': options.generate.prompt })
|
||||
data = await generate(options = options, quiet=True)
|
||||
@@ -149,9 +141,9 @@ async def preview_models(params):
|
||||
log.info({ 'model preview created': model, 'image': fn, 'images': len(images), 'grid': [image.width, image.height], 'time': round(t, 2), 'its': round(its, 2) })
|
||||
|
||||
opt = await get('/sdapi/v1/options')
|
||||
if opt['sd_model_checkpoint'] != default and not params.fixed:
|
||||
log.info({ 'model set default': default })
|
||||
opt['sd_model_checkpoint'] = default
|
||||
if opt['sd_model_checkpoint'] != params.model:
|
||||
log.info({ 'model set default': params.model })
|
||||
opt['sd_model_checkpoint'] = params.model
|
||||
del opt['sd_lora']
|
||||
del opt['sd_lyco']
|
||||
await post('/sdapi/v1/options', opt)
|
||||
@@ -179,7 +171,7 @@ async def lora(params):
|
||||
keywords = re.sub(r'\d', '', model)
|
||||
keywords = keywords.replace('-v', ' ').replace('-', ' ').strip().split(' ')
|
||||
keyword = '\"' + '\" \"'.join(keywords) + '\"'
|
||||
options.generate.prompt = prompt.replace('<keyword>', keyword)
|
||||
options.generate.prompt = options.prompt.replace('<keyword>', keyword)
|
||||
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
|
||||
options.generate.prompt += f' <lora:{model}:{options.lora.strength}>'
|
||||
log.info({ 'lora generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
|
||||
@@ -220,7 +212,7 @@ async def lyco(params):
|
||||
keywords = re.sub(r'\d', '', model)
|
||||
keywords = keywords.replace('-v', ' ').replace('-', ' ').strip().split(' ')
|
||||
keyword = '\"' + '\" \"'.join(keywords) + '\"'
|
||||
options.generate.prompt = prompt.replace('<keyword>', keyword)
|
||||
options.generate.prompt = options.prompt.replace('<keyword>', keyword)
|
||||
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
|
||||
options.generate.prompt += f' <lyco:{model}:{options.lora.strength}>'
|
||||
log.info({ 'lyco generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
|
||||
@@ -256,7 +248,7 @@ async def hypernetwork(params):
|
||||
labels = []
|
||||
t0 = time.time()
|
||||
keyword = options.hypernetwork.keyword
|
||||
options.generate.prompt = prompt.replace('<keyword>', options.hypernetwork.keyword)
|
||||
options.generate.prompt = options.prompt.replace('<keyword>', options.hypernetwork.keyword)
|
||||
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
|
||||
options.generate.prompt = f' <hypernet:{model}:{options.hypernetwork.strength}> ' + options.generate.prompt
|
||||
log.info({ 'hypernetwork generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
|
||||
@@ -294,7 +286,7 @@ async def embedding(params):
|
||||
import re
|
||||
keyword = '\"' + re.sub(r'\d', '', model) + '\"'
|
||||
options.generate.batch_size = 4
|
||||
options.generate.prompt = prompt.replace('<keyword>', keyword)
|
||||
options.generate.prompt = options.prompt.replace('<keyword>', keyword)
|
||||
options.generate.prompt = options.generate.prompt.replace('<embedding>', '')
|
||||
log.info({ 'embedding generating': model, 'keyword': keyword, 'prompt': options.generate.prompt })
|
||||
data = await generate(options = options, quiet=True)
|
||||
@@ -323,8 +315,13 @@ async def create_previews(params):
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description = 'generate model previews')
|
||||
parser.add_argument('--output', type = str, default = '', required = False, help = 'output directory')
|
||||
parser.add_argument('--fixed', default = False, action='store_true', help = "do not change model")
|
||||
parser.add_argument('--model', default='best/icbinp-icantbelieveIts-final.safetensors [73f48afbdc]', help="model used to create extra network previews")
|
||||
parser.add_argument('--exclude', default=['sd-v20', 'sd-v21', 'inpainting', 'pix2pix'], help="exclude models with keywords")
|
||||
parser.add_argument('--debug', default = False, action='store_true', help = 'print extra debug information')
|
||||
parser.add_argument('input', type = str, nargs = '*')
|
||||
args = parser.parse_args()
|
||||
if args.debug:
|
||||
log.setLevel(logging.DEBUG)
|
||||
log.debug({ 'debug': True })
|
||||
log.debug({ 'args': args.__dict__ })
|
||||
asyncio.run(create_previews(args))
|
||||
|
||||
@@ -127,6 +127,8 @@ async def generate(prompt = None, options = None, quiet = False): # pylint: disa
|
||||
sd.generate.prompt = prompt
|
||||
if not quiet:
|
||||
log.info({ 'generate': sd.generate })
|
||||
if sd.get('options', None) is None:
|
||||
sd['options'] = await get('/sdapi/v1/options')
|
||||
names = []
|
||||
b64s = []
|
||||
images = []
|
||||
|
||||
@@ -4,8 +4,8 @@ import time
|
||||
import shlex
|
||||
import logging
|
||||
import subprocess
|
||||
import installer
|
||||
from functools import lru_cache
|
||||
import installer
|
||||
|
||||
|
||||
commandline_args = os.environ.get('COMMANDLINE_ARGS', "")
|
||||
@@ -141,7 +141,7 @@ def start_server(immediate=True, server=None):
|
||||
if args.api_only:
|
||||
server = server.api_only()
|
||||
else:
|
||||
server = server.webui()
|
||||
server = server.webui(restart=not immediate)
|
||||
if args.profile:
|
||||
installer.print_profile(pr, 'WebUI')
|
||||
return server
|
||||
|
||||
+1
-1
Submodule modules/lora updated: 89c3033401...038c09f552
@@ -197,7 +197,7 @@ def model_hash(filename):
|
||||
|
||||
def select_checkpoint(model=True):
|
||||
model_checkpoint = shared.opts.sd_model_checkpoint if model else shared.opts.sd_model_dict
|
||||
checkpoint_info = checkpoint_aliases.get(model_checkpoint, None)
|
||||
checkpoint_info = get_closet_checkpoint_match(model_checkpoint)
|
||||
if checkpoint_info is not None:
|
||||
shared.log.debug(f'Select checkpoint: {checkpoint_info.title if checkpoint_info is not None else None}')
|
||||
return checkpoint_info
|
||||
@@ -595,7 +595,7 @@ def load_model(checkpoint_info=None, already_loaded_state_dict=None, timer=None)
|
||||
shared.log.info(f"Model loaded in {timer.summary()}")
|
||||
current_checkpoint_info = None
|
||||
devices.torch_gc(force=True)
|
||||
shared.log.info(f'Model load finished: {memory_stats()}')
|
||||
shared.log.info(f'Model load finished: {memory_stats()} cached={len(checkpoints_loaded.keys())}')
|
||||
|
||||
|
||||
def reload_model_weights(sd_model=None, info=None, reuse_dict=False):
|
||||
|
||||
@@ -6,6 +6,7 @@ import signal
|
||||
import asyncio
|
||||
import logging
|
||||
import warnings
|
||||
import importlib
|
||||
from threading import Thread
|
||||
from modules import timer, errors, paths # pylint: disable=unused-import
|
||||
|
||||
@@ -37,6 +38,7 @@ startup_timer.record("gradio")
|
||||
errors.install([gradio])
|
||||
|
||||
errors.log.debug('Loading Modules')
|
||||
from installer import log, setup_logging
|
||||
import ldm.modules.encoders.modules # pylint: disable=W0611,C0411,E0401
|
||||
from modules.call_queue import queue_lock, wrap_queued_call, wrap_gradio_gpu_call # pylint: disable=W0611,C0411,C0412
|
||||
from modules.paths import create_paths
|
||||
@@ -58,7 +60,7 @@ import modules.script_callbacks
|
||||
import modules.textual_inversion.textual_inversion
|
||||
import modules.progress
|
||||
import modules.ui
|
||||
from modules.shared import cmd_opts, opts, log
|
||||
from modules.shared import cmd_opts, opts
|
||||
import modules.hypernetworks.hypernetwork
|
||||
from modules.middleware import setup_middleware
|
||||
startup_timer.record("libraries")
|
||||
@@ -112,6 +114,8 @@ def initialize():
|
||||
modelloader.load_upscalers()
|
||||
startup_timer.record("upscalers")
|
||||
|
||||
setup_logging() # needs a reset since scripts can hijaack logging
|
||||
|
||||
shared.opts.onchange("sd_vae", wrap_queued_call(lambda: modules.sd_vae.reload_vae_weights()), call=False)
|
||||
shared.opts.onchange("temp_dir", ui_tempdir.on_tmpdir_changed)
|
||||
shared.opts.onchange("gradio_theme", shared.reload_gradio_theme)
|
||||
@@ -293,7 +297,7 @@ def start_ui():
|
||||
shared.log.debug(f'Scripts components: {time_component}')
|
||||
|
||||
|
||||
def webui():
|
||||
def webui(restart=False):
|
||||
start_common()
|
||||
start_ui()
|
||||
modules.sd_models.write_metadata()
|
||||
@@ -304,17 +308,24 @@ def webui():
|
||||
|
||||
log.info(f"Startup time: {startup_timer.summary()}")
|
||||
|
||||
# override all loggers to use the same handlers as the main logger
|
||||
for logger in [logging.getLogger(name) for name in logging.root.manager.loggerDict]: # pylint: disable=no-member
|
||||
if logger.name.startswith('uvicorn'):
|
||||
continue
|
||||
logger.handlers = log.handlers
|
||||
if not restart:
|
||||
# override all loggers to use the same handlers as the main logger
|
||||
for logger in [logging.getLogger(name) for name in logging.root.manager.loggerDict]: # pylint: disable=no-member
|
||||
if logger.name.startswith('uvicorn') or logger.name.startswith('sd'):
|
||||
continue
|
||||
logger.handlers = log.handlers
|
||||
# autolaunch only on initial start
|
||||
if cmd_opts.autolaunch and local_url is not None:
|
||||
cmd_opts.autolaunch = False
|
||||
shared.log.info('Launching browser')
|
||||
import webbrowser
|
||||
webbrowser.open(local_url, new=2, autoraise=True)
|
||||
else:
|
||||
modules.script_callbacks.app_reload_callback()
|
||||
modules.script_callbacks.script_unloaded_callback()
|
||||
for module in [module for name, module in sys.modules.items() if name.startswith("modules.ui")]:
|
||||
importlib.reload(module)
|
||||
|
||||
if cmd_opts.autolaunch and local_url is not None:
|
||||
cmd_opts.autolaunch = False
|
||||
shared.log.info('Launching browser')
|
||||
import webbrowser
|
||||
webbrowser.open(local_url, new=2, autoraise=True)
|
||||
return shared.demo.server
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user