diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e2cac9e68..28fbd4296 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -23,22 +23,19 @@ body: Look at console log and copy the version string from there For example: `Version: f256fb8b Fri Apr 14 17:41:30 2023 -0400` - Additionally provide any relevant platorm information (OS, browser, versions) + Additionally provide any relevant platorm information: + - OS details, GPU information, browser used, app versions - type: markdown attributes: value: | If issue is setup, installation or startup related, please check `setup.log` before reporting And when posting console logs, please use code blocks ( \`\`\` ) to format them insead of uploading screenshots - - type: markdown - attributes: - value: | - Verify that issue persists after restarting server from command line - Restarting from UI or reloading browser is insufficient to create reproducible environment - type: markdown attributes: value: | If you have additional extensions installed, try to reproduce the issue with user extensions disabled And if the issue is with compatibility with specific extension, mark it as such when creating the issue + Try running with `--safe` command line flag with disables loading of user-installed extensions - type: markdown attributes: value: | diff --git a/TODO.md b/TODO.md index 214e6ffcf..0c24fa5d7 100644 --- a/TODO.md +++ b/TODO.md @@ -58,6 +58,7 @@ Tech that can be integrated as part of the core workflow... - [Null-text inversion](https://github.com/ouhenio/null-text-inversion-colab) - [Custom diffusion](https://github.com/guaneec/custom-diffusion-webui), [Custom diffusion](https://www.cs.cmu.edu/~custom-diffusion/) - [Dream artist](https://github.com/7eu7d7/DreamArtist-sd-webui-extension) +- [QuickEmbedding](https://github.com/ethansmith2000/QuickEmbedding) ## Random diff --git a/installer.py b/installer.py index 350e02651..65dd59b96 100644 --- a/installer.py +++ b/installer.py @@ -244,7 +244,7 @@ def check_torch(): install(torch_command, 'torch torchvision') else: log.info('Using CPU-only Torch') - torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision==0.15.1') + torch_command = os.environ.get('TORCH_COMMAND', 'torch torchvision') xformers_package = os.environ.get('XFORMERS_PACKAGE', 'none') if 'torch' in torch_command and not args.version: install(torch_command, 'torch torchvision') @@ -370,7 +370,8 @@ def install_extensions(): from modules.paths_internal import extensions_builtin_dir, extensions_dir extensions_duplicates = [] extensions_enabled = [] - for folder in [extensions_builtin_dir, extensions_dir]: + extension_folders = [extensions_builtin_dir] if args.safe else [extensions_builtin_dir, extensions_dir] + for folder in extension_folders: if not os.path.isdir(folder): continue extensions = list_extensions(folder) @@ -461,7 +462,8 @@ def set_environment(): def check_extensions(): newest_all = os.path.getmtime('requirements.txt') from modules.paths_internal import extensions_builtin_dir, extensions_dir - for folder in [extensions_builtin_dir, extensions_dir]: + extension_folders = [extensions_builtin_dir] if args.safe else [extensions_builtin_dir, extensions_dir] + for folder in extension_folders: if not os.path.isdir(folder): continue extensions = list_extensions(folder) @@ -593,6 +595,7 @@ def add_args(): group.add_argument('--test', default = False, action='store_true', help = "Run test only and exit") group.add_argument('--version', default = False, action='store_true', help = "Print version information") group.add_argument('--ignore', default = False, action='store_true', help = "Ignore any errors and attempt to continue") + group.add_argument('--safe', default = False, action='store_true', help = "Run in safe mode with no user extensions") def parse_args(): @@ -611,9 +614,12 @@ def extensions_preload(force = False): setup_time = int(line.split(' ')[-1]) if setup_time > 0 or force: log.info('Running extension preloading') + if args.safe: + log.info('Running in safe mode without user extensions') from modules.script_loading import preload_extensions from modules.paths_internal import extensions_builtin_dir, extensions_dir - for ext_dir in [extensions_builtin_dir, extensions_dir]: + extension_folders = [extensions_builtin_dir] if args.safe else [extensions_builtin_dir, extensions_dir] + for ext_dir in extension_folders: preload_extensions(ext_dir, parser) diff --git a/modules/extensions.py b/modules/extensions.py index 38151e73e..0cd8edacf 100644 --- a/modules/extensions.py +++ b/modules/extensions.py @@ -125,7 +125,8 @@ def list_extensions(): shared.log.warning(f"Option set: Disable extensions: {shared.opts.disable_all_extensions}") extension_paths = [] extension_names = [] - for dirname in [extensions_builtin_dir, extensions_dir]: + extension_folders = [extensions_builtin_dir] if shared.cmd_opts.safe else [extensions_builtin_dir, extensions_dir] + for dirname in extension_folders: if not os.path.isdir(dirname): return for extension_dirname in sorted(os.listdir(dirname)): diff --git a/modules/lora b/modules/lora index 6d6df1838..c924c47f3 160000 --- a/modules/lora +++ b/modules/lora @@ -1 +1 @@ -Subproject commit 6d6df18387a72193af62c651473fe1369b6a2040 +Subproject commit c924c47f374ac1b6e33e71f82948eb1853e2243f diff --git a/modules/sd_samplers.py b/modules/sd_samplers.py index 90c00bde4..e03af74d2 100644 --- a/modules/sd_samplers.py +++ b/modules/sd_samplers.py @@ -1,14 +1,11 @@ from modules import sd_samplers_compvis, sd_samplers_kdiffusion, shared - -# imports for functions that previously were here and are used by other modules -from modules.sd_samplers_common import samples_to_image_grid, sample_to_image +from modules.sd_samplers_common import samples_to_image_grid, sample_to_image # pylint: disable=unused-import all_samplers = [ *sd_samplers_kdiffusion.samplers_data_k_diffusion, *sd_samplers_compvis.samplers_data_compvis, ] all_samplers_map = {x.name: x for x in all_samplers} - samplers = [] samplers_for_img2img = [] samplers_map = {} @@ -19,33 +16,23 @@ def create_sampler(name, model): config = all_samplers_map.get(name, None) else: config = all_samplers[0] - assert config is not None, f'bad sampler name: {name}' - sampler = config.constructor(model) sampler.config = config - return sampler def set_samplers(): - global samplers, samplers_for_img2img - + global samplers, samplers_for_img2img # pylint: disable=global-statement shown_img2img = set(shared.opts.show_samplers) - if len(shared.opts.show_samplers) == 0: shown = {'PLMS', 'UniPC'} else: shown = set(shared.opts.show_samplers + ['PLMS']) - samplers = [x for x in all_samplers if x.name in shown] samplers_for_img2img = [x for x in all_samplers if x.name in shown_img2img] - samplers_map.clear() for sampler in all_samplers: samplers_map[sampler.name.lower()] = sampler.name for alias in sampler.aliases: samplers_map[alias.lower()] = sampler.name - - -set_samplers() diff --git a/modules/shared.py b/modules/shared.py index 2fedbc796..230f3f30c 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -72,6 +72,7 @@ ui_reorder_categories = [ "scripts", ] + def reload_hypernetworks(): from modules.hypernetworks import hypernetwork global hypernetworks # pylint: disable=W0603 @@ -202,6 +203,7 @@ def refresh_checkpoints(): def list_samplers(): import modules.sd_samplers # pylint: disable=W0621 + modules.sd_samplers.set_samplers() return modules.sd_samplers.all_samplers def list_themes(): diff --git a/modules/ui.py b/modules/ui.py index 3a0b9a09f..fd0ea31b3 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -14,21 +14,21 @@ from modules import sd_hijack, sd_models, script_callbacks, ui_extensions, deepb from modules.ui_components import FormRow, FormColumn, FormGroup, ToolButton, FormHTML # pylint: disable=unused-import from modules.paths import script_path, data_path from modules.shared import opts, cmd_opts -from modules.sd_samplers import samplers, samplers_for_img2img from modules import prompt_parser import modules.codeformer_model import modules.generation_parameters_copypaste as parameters_copypaste import modules.gfpgan_model import modules.hypernetworks.ui import modules.scripts -import modules.shared as shared -import modules.errors as errors +import modules.shared +import modules.errors import modules.styles import modules.extras import modules.textual_inversion.ui +import modules.sd_samplers from modules.textual_inversion import textual_inversion -errors.install() +modules.errors.install() mimetypes.init() mimetypes.add_type('application/javascript', '.js') @@ -83,9 +83,9 @@ def add_style(name: str, prompt: str, negative_prompt: str): if name is None: return [gr_show() for x in range(4)] style = modules.styles.PromptStyle(name, prompt, negative_prompt) - shared.prompt_styles.styles[style.name] = style - shared.prompt_styles.save_styles(shared.opts.styles_dir) - return [gr.Dropdown.update(visible=True, choices=list(shared.prompt_styles.styles)) for _ in range(2)] + modules.shared.prompt_styles.styles[style.name] = style + modules.shared.prompt_styles.save_styles(modules.shared.opts.styles_dir) + return [gr.Dropdown.update(visible=True, choices=list(modules.shared.prompt_styles.styles)) for _ in range(2)] def calc_resolution_hires(enable, width, height, hr_scale, hr_resize_x, hr_resize_y): @@ -107,8 +107,8 @@ def resize_from_to_html(width, height, scale_by): def apply_styles(prompt, prompt_neg, styles): - prompt = shared.prompt_styles.apply_styles_to_prompt(prompt, styles) - prompt_neg = shared.prompt_styles.apply_negative_styles_to_prompt(prompt_neg, styles) + prompt = modules.shared.prompt_styles.apply_styles_to_prompt(prompt, styles) + prompt_neg = modules.shared.prompt_styles.apply_negative_styles_to_prompt(prompt_neg, styles) return [gr.Textbox.update(value=prompt), gr.Textbox.update(value=prompt_neg), gr.Dropdown.update(value=[])] @@ -118,7 +118,7 @@ def process_interrogate(interrogation_function, mode, ii_input_dir, ii_output_di elif mode == 2: return [interrogation_function(ii_singles[mode]["image"]), None] elif mode == 5: - images = shared.listfiles(ii_input_dir) + images = modules.shared.listfiles(ii_input_dir) if ii_output_dir != "": os.makedirs(ii_output_dir, exist_ok=True) else: @@ -133,7 +133,7 @@ def process_interrogate(interrogation_function, mode, ii_input_dir, ii_output_di def interrogate(image): - prompt = shared.interrogator.interrogate(image.convert("RGB")) + prompt = modules.shared.interrogator.interrogate(image.convert("RGB")) return gr.update() if prompt is None else prompt @@ -143,7 +143,7 @@ def interrogate_deepbooru(image): def change_clip_skip(val): - shared.opts.CLIP_stop_at_last_layers = val + modules.shared.opts.CLIP_stop_at_last_layers = val def create_seed_inputs(target_interface): @@ -190,7 +190,7 @@ def connect_reuse_seed(seed: gr.Number, reuse_seed: gr.Button, generation_info: res = all_seeds[index if 0 <= index < len(all_seeds) else 0] except json.decoder.JSONDecodeError: if gen_info_string != '': - shared.log.error(f"Error parsing JSON generation info: {gen_info_string}") + modules.shared.log.error(f"Error parsing JSON generation info: {gen_info_string}") return [res, gr_show(False)] reuse_seed.click(fn=copy_seed, _js="(x, y) => [x, selected_gallery_index()]", show_progress=False, inputs=[generation_info, dummy_component], outputs=[seed, dummy_component]) @@ -234,8 +234,8 @@ def create_toprow(is_img2img): interrupt = gr.Button('Stop', elem_id=f"{id_part}_interrupt", elem_classes="generate-box-interrupt") skip = gr.Button('Skip', elem_id=f"{id_part}_skip", elem_classes="generate-box-skip") submit = gr.Button('Generate', elem_id=f"{id_part}_generate", variant='primary') - skip.click(fn=lambda: shared.state.skip(), inputs=[], outputs=[]) - interrupt.click(fn=lambda: shared.state.interrupt(), inputs=[], outputs=[]) + skip.click(fn=lambda: modules.shared.state.skip(), inputs=[], outputs=[]) + interrupt.click(fn=lambda: modules.shared.state.interrupt(), inputs=[], outputs=[]) with gr.Row(elem_id=f"{id_part}_tools"): paste = ToolButton(value=paste_symbol, elem_id="paste") clear_prompt_button = ToolButton(value=clear_prompt_symbol, elem_id=f"{id_part}_clear_prompt") @@ -248,8 +248,8 @@ def create_toprow(is_img2img): negative_token_button = gr.Button(visible=False, elem_id=f"{id_part}_negative_token_button") clear_prompt_button.click(fn=lambda *x: x, _js="confirm_clear_prompt", inputs=[prompt, negative_prompt], outputs=[prompt, negative_prompt]) with gr.Row(elem_id=f"{id_part}_styles_row"): - prompt_styles = gr.Dropdown(label="Styles", elem_id=f"{id_part}_styles", choices=[k for k, v in shared.prompt_styles.styles.items()], value=[], multiselect=True) - create_refresh_button(prompt_styles, shared.prompt_styles.reload, lambda: {"choices": [k for k, v in shared.prompt_styles.styles.items()]}, f"refresh_{id_part}_styles") + prompt_styles = gr.Dropdown(label="Styles", elem_id=f"{id_part}_styles", choices=[k for k, v in modules.shared.prompt_styles.styles.items()], value=[], multiselect=True) + create_refresh_button(prompt_styles, modules.shared.prompt_styles.reload, lambda: {"choices": [k for k, v in modules.shared.prompt_styles.styles.items()]}, f"refresh_{id_part}_styles") return prompt, prompt_styles, negative_prompt, submit, button_interrogate, button_deepbooru, prompt_style_apply, save_style, paste, extra_networks_button, token_counter, token_button, negative_token_counter, negative_token_button @@ -260,7 +260,7 @@ def setup_progressbar(*args, **kwargs): # pylint: disable=unused-argument def apply_setting(key, value): if value is None: return gr.update() - if shared.cmd_opts.freeze: + if modules.shared.cmd_opts.freeze: return gr.update() # dont allow model to be swapped when model hash exists in prompt if key == "sd_model_checkpoint" and opts.disable_weights_auto_swap: @@ -279,7 +279,7 @@ def apply_setting(key, value): opts.data[key] = valtype(value) if valtype != type(None) else value if oldval != value and opts.data_labels[key].onchange is not None: opts.data_labels[key].onchange() - opts.save(shared.config_filename) + opts.save(modules.shared.config_filename) return getattr(opts, key) @@ -307,7 +307,7 @@ def create_sampler_and_steps_selection(choices, tabname): elif 'Euler a' in [sampler.name for sampler in choices]: chosen_sampler_name = 'Euler a' else: - chosen_sampler_name = samplers[0].name + chosen_sampler_name = modules.sd_samplers.samplers[0].name sampler_index = gr.Dropdown(label='Sampling method', elem_id=f"{tabname}_sampling", choices=[x.name for x in choices], value=chosen_sampler_name if tabname == 'txt2img' else "Euler a", type="index") steps = gr.Slider(minimum=1, maximum=150, step=1, elem_id=f"{tabname}_steps", label="Sampling steps", value=20) @@ -315,8 +315,8 @@ def create_sampler_and_steps_selection(choices, tabname): def ordered_ui_categories(): - user_order = {x.strip(): i * 2 + 1 for i, x in enumerate(shared.opts.ui_reorder.split(","))} - for i, category in sorted(enumerate(shared.ui_reorder_categories), key=lambda x: user_order.get(x[1], x[0] * 2 + 0)): + user_order = {x.strip(): i * 2 + 1 for i, x in enumerate(modules.shared.opts.ui_reorder.split(","))} + for i, category in sorted(enumerate(modules.shared.ui_reorder_categories), key=lambda x: user_order.get(x[1], x[0] * 2 + 0)): yield category @@ -352,7 +352,8 @@ def create_ui(): with gr.Column(variant='compact', elem_id="txt2img_settings"): for category in ordered_ui_categories(): if category == "sampler": - steps, sampler_index = create_sampler_and_steps_selection(samplers, "txt2img") + modules.sd_samplers.set_samplers() + steps, sampler_index = create_sampler_and_steps_selection(modules.sd_samplers.samplers, "txt2img") elif category == "dimensions": with FormRow(): with gr.Column(elem_id="txt2img_column_size", scale=4): @@ -368,20 +369,20 @@ def create_ui(): elif category == "cfg": with FormRow(): cfg_scale = gr.Slider(minimum=1.0, maximum=30.0, step=0.5, label='CFG Scale', value=6.0, elem_id="txt2img_cfg_scale") - clip_skip = gr.Slider(label='CLIP Skip', value=shared.opts.CLIP_stop_at_last_layers, minimum=1, maximum=4, step=1, elem_id='txt2img_clip_skip', interactive=True) + clip_skip = gr.Slider(label='CLIP Skip', value=modules.shared.opts.CLIP_stop_at_last_layers, minimum=1, maximum=4, step=1, elem_id='txt2img_clip_skip', interactive=True) clip_skip.change(fn=change_clip_skip, show_progress=False, inputs=clip_skip) elif category == "seed": seed, reuse_seed, subseed, reuse_subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w, seed_checkbox = create_seed_inputs('txt2img') elif category == "checkboxes": with FormRow(elem_classes="checkboxes-row", variant="compact"): - restore_faces = gr.Checkbox(label='Restore faces', value=False, visible=len(shared.face_restorers) > 1, elem_id="txt2img_restore_faces") + restore_faces = gr.Checkbox(label='Restore faces', value=False, visible=len(modules.shared.face_restorers) > 1, elem_id="txt2img_restore_faces") tiling = gr.Checkbox(label='Tiling', value=False, elem_id="txt2img_tiling") enable_hr = gr.Checkbox(label='Hires fix', value=False, elem_id="txt2img_enable_hr") hr_final_resolution = FormHTML(value="", elem_id="txtimg_hr_finalres", label="Upscaled resolution", interactive=False) elif category == "hires_fix": with FormGroup(visible=False, elem_id="txt2img_hires_fix") as hr_options: with FormRow(elem_id="txt2img_hires_fix_row1", variant="compact"): - hr_upscaler = gr.Dropdown(label="Upscaler", elem_id="txt2img_hr_upscaler", choices=[*shared.latent_upscale_modes, *[x.name for x in shared.sd_upscalers]], value=shared.latent_upscale_default_mode) + hr_upscaler = gr.Dropdown(label="Upscaler", elem_id="txt2img_hr_upscaler", choices=[*modules.shared.latent_upscale_modes, *[x.name for x in modules.shared.sd_upscalers]], value=modules.shared.latent_upscale_default_mode) hr_second_pass_steps = gr.Slider(minimum=0, maximum=150, step=1, label='Hires steps', value=0, elem_id="txt2img_hires_steps") denoising_strength = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising strength', value=0.7, elem_id="txt2img_denoising_strength") with FormRow(elem_id="txt2img_hires_fix_row2", variant="compact"): @@ -459,7 +460,7 @@ def create_ui(): res_switch_btn.click(lambda w, h: (h, w), inputs=[width, height], outputs=[width, height], show_progress=False) txt_prompt_img.change( - fn=modules.images.image_data, # TODO + fn=modules.images.image_data, inputs=[ txt_prompt_img ], @@ -583,16 +584,16 @@ def create_ui(): init_mask_inpaint = gr.Image(label="Mask", source="upload", interactive=True, type="pil", elem_id="img_inpaint_mask") with gr.TabItem('Batch', id='batch', elem_id="img2img_batch_tab") as tab_batch: - hidden = '
Disabled when launched with --hide-ui-dir-config.' if shared.cmd_opts.hide_ui_dir_config else '' + hidden = '
Disabled when launched with --hide-ui-dir-config.' if modules.shared.cmd_opts.hide_ui_dir_config else '' gr.HTML( "

Process images in a directory on the same machine where the server is running." + "
Use an empty output directory to save pictures normally instead of writing to the output directory." + "
Add inpaint batch mask directory to enable inpaint batch processing." f"{hidden}

" ) - img2img_batch_input_dir = gr.Textbox(label="Input directory", **shared.hide_dirs, elem_id="img2img_batch_input_dir") - img2img_batch_output_dir = gr.Textbox(label="Output directory", **shared.hide_dirs, elem_id="img2img_batch_output_dir") - img2img_batch_inpaint_mask_dir = gr.Textbox(label="Inpaint batch mask directory (required for inpaint batch processing only)", **shared.hide_dirs, elem_id="img2img_batch_inpaint_mask_dir") + img2img_batch_input_dir = gr.Textbox(label="Input directory", **modules.shared.hide_dirs, elem_id="img2img_batch_input_dir") + img2img_batch_output_dir = gr.Textbox(label="Output directory", **modules.shared.hide_dirs, elem_id="img2img_batch_output_dir") + img2img_batch_inpaint_mask_dir = gr.Textbox(label="Inpaint batch mask directory (required for inpaint batch processing only)", **modules.shared.hide_dirs, elem_id="img2img_batch_inpaint_mask_dir") img2img_tabs = [tab_img2img, tab_sketch, tab_inpaint, tab_inpaint_color, tab_inpaint_upload, tab_batch] img2img_image_inputs = [init_img, sketch, init_img_with_mask, inpaint_color_sketch] # pylint: disable=unused-variable @@ -624,7 +625,8 @@ def create_ui(): for category in ordered_ui_categories(): if category == "sampler": - steps, sampler_index = create_sampler_and_steps_selection(samplers_for_img2img, "img2img") + modules.sd_samplers.set_samplers() + steps, sampler_index = create_sampler_and_steps_selection(modules.sd_samplers.samplers_for_img2img, "img2img") elif category == "dimensions": with FormRow(): @@ -677,9 +679,9 @@ def create_ui(): with FormGroup(): with FormRow(): cfg_scale = gr.Slider(minimum=1.0, maximum=30.0, step=0.5, label='CFG Scale', value=6.0, elem_id="img2img_cfg_scale") - image_cfg_scale = gr.Slider(minimum=0, maximum=3.0, step=0.05, label='Image CFG Scale', value=1.5, elem_id="img2img_image_cfg_scale", visible=shared.sd_model and shared.sd_model.cond_stage_key == "edit") + image_cfg_scale = gr.Slider(minimum=0, maximum=3.0, step=0.05, label='Image CFG Scale', value=1.5, elem_id="img2img_image_cfg_scale", visible=modules.shared.sd_model and modules.shared.sd_model.cond_stage_key == "edit") denoising_strength = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising strength', value=0.75, elem_id="img2img_denoising_strength") - clip_skip = gr.Slider(label='CLIP Skip', value=shared.opts.CLIP_stop_at_last_layers, minimum=1, maximum=4, step=1, elem_id='img2img_clip_skip', interactive=True) + clip_skip = gr.Slider(label='CLIP Skip', value=modules.shared.opts.CLIP_stop_at_last_layers, minimum=1, maximum=4, step=1, elem_id='img2img_clip_skip', interactive=True) clip_skip.change(fn=change_clip_skip, show_progress=False, inputs=clip_skip) elif category == "seed": @@ -687,7 +689,7 @@ def create_ui(): elif category == "checkboxes": with FormRow(elem_classes="checkboxes-row", variant="compact"): - restore_faces = gr.Checkbox(label='Restore faces', value=False, visible=len(shared.face_restorers) > 1, elem_id="img2img_restore_faces") + restore_faces = gr.Checkbox(label='Restore faces', value=False, visible=len(modules.shared.face_restorers) > 1, elem_id="img2img_restore_faces") tiling = gr.Checkbox(label='Tiling', value=False, elem_id="img2img_tiling") elif category == "override_settings": @@ -733,7 +735,7 @@ def create_ui(): connect_reuse_seed(subseed, reuse_subseed, generation_info, dummy_component, is_subseed=True) img2img_prompt_img.change( - fn=modules.images.image_data, # TODO + fn=modules.images.image_data, inputs=[ img2img_prompt_img ], @@ -1045,8 +1047,8 @@ def create_ui(): train_embedding_name = gr.Dropdown(label='Embedding', elem_id="train_embedding", choices=sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())) create_refresh_button(train_embedding_name, sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings, lambda: {"choices": sorted(sd_hijack.model_hijack.embedding_db.word_embeddings.keys())}, "refresh_train_embedding_name") - train_hypernetwork_name = gr.Dropdown(label='Hypernetwork', elem_id="train_hypernetwork", choices=[x for x in shared.hypernetworks.keys()]) - create_refresh_button(train_hypernetwork_name, shared.reload_hypernetworks, lambda: {"choices": sorted([x for x in shared.hypernetworks.keys()])}, "refresh_train_hypernetwork_name") + train_hypernetwork_name = gr.Dropdown(label='Hypernetwork', elem_id="train_hypernetwork", choices=[x for x in modules.shared.hypernetworks.keys()]) + create_refresh_button(train_hypernetwork_name, modules.shared.reload_hypernetworks, lambda: {"choices": sorted([x for x in modules.shared.hypernetworks.keys()])}, "refresh_train_hypernetwork_name") with FormRow(): embedding_learn_rate = gr.Textbox(label='Embedding Learning rate', placeholder="Embedding Learning rate", value="0.005", elem_id="train_embedding_learn_rate") @@ -1242,13 +1244,13 @@ def create_ui(): ) interrupt_training.click( - fn=lambda: shared.state.interrupt(), + fn=lambda: modules.shared.state.interrupt(), inputs=[], outputs=[], ) interrupt_preprocessing.click( - fn=lambda: shared.state.interrupt(), + fn=lambda: modules.shared.state.interrupt(), inputs=[], outputs=[], ) @@ -1285,7 +1287,7 @@ def create_ui(): components = [] component_dict = {} - shared.settings_components = component_dict + modules.shared.settings_components = component_dict script_callbacks.ui_settings_callback() opts.reorder() @@ -1300,10 +1302,10 @@ def create_ui(): if opts.set(key, value): changed.append(key) try: - opts.save(shared.config_filename) - shared.log.info(f'Settings changed: {len(changed)} {changed}') + opts.save(modules.shared.config_filename) + modules.shared.log.info(f'Settings changed: {len(changed)} {changed}') except RuntimeError: - shared.log.error(f'Settings change failed: {len(changed)} {changed}') + modules.shared.log.error(f'Settings change failed: {len(changed)} {changed}') return opts.dumpjson(), f'{len(changed)} Settings changed without save: {", ".join(changed)}' return opts.dumpjson(), f'{len(changed)} Settings changed{": " if len(changed) > 0 else ""}{", ".join(changed)}' @@ -1312,8 +1314,8 @@ def create_ui(): return gr.update(visible=True), opts.dumpjson() if not opts.set(key, value): return gr.update(value=getattr(opts, key)), opts.dumpjson() - opts.save(shared.config_filename) - shared.log.debug(f'Setting changed: key={key}, value={value}') + opts.save(modules.shared.config_filename) + modules.shared.log.debug(f'Setting changed: key={key}, value={value}') return get_value_for_setting(key), opts.dumpjson() with gr.Blocks(analytics_enabled=False) as settings_interface: @@ -1349,7 +1351,7 @@ def create_ui(): current_row = gr.Column(variant='compact') current_row.__enter__() previous_section = item.section - if k in quicksettings_names and not shared.cmd_opts.freeze: + if k in quicksettings_names and not modules.shared.cmd_opts.freeze: quicksettings_list.append((i, k, item)) components.append(dummy_component) elif section_must_be_skipped: @@ -1365,7 +1367,7 @@ def create_ui(): request_notifications = gr.Button(value='Request browser notifications', elem_id="request_notifications", visible=False) _show_all_pages = gr.Button(value="Show all pages", variant='primary', elem_id="settings_show_all_pages") with gr.TabItem("Licenses", id="licenses"): - gr.HTML(shared.html("licenses.html"), elem_id="licenses") + gr.HTML(modules.shared.html("licenses.html"), elem_id="licenses") def unload_sd_weights(): modules.sd_models.unload_model_weights() @@ -1425,11 +1427,11 @@ def create_ui(): extensions_interface = ui_extensions.create_ui() interfaces += [(extensions_interface, "Extensions", "extensions")] - shared.tab_names = [] + modules.shared.tab_names = [] for _interface, label, _ifid in interfaces: - shared.tab_names.append(label) + modules.shared.tab_names.append(label) - with gr.Blocks(theme=shared.gradio_theme, analytics_enabled=False, title="SD.Next") as demo: + with gr.Blocks(theme=modules.shared.gradio_theme, analytics_enabled=False, title="SD.Next") as demo: with gr.Row(elem_id="quicksettings", variant="compact"): for i, k, item in sorted(quicksettings_list, key=lambda x: quicksettings_names.get(x[1], x[0])): component = create_setting_component(k, is_quicksettings=True) @@ -1439,7 +1441,7 @@ def create_ui(): with gr.Tabs(elem_id="tabs") as tabs: for interface, label, ifid in interfaces: - if label in shared.opts.hidden_tabs: + if label in modules.shared.opts.hidden_tabs: continue with gr.TabItem(label, id=ifid, elem_id='tab_' + ifid): interface.render() @@ -1453,9 +1455,9 @@ def create_ui(): inputs=components, outputs=[text_settings, result], ) - defaults_submit.click(fn=lambda x: shared.restore_defaults(restart=True), _js="restart_reload") - restart_submit.click(fn=lambda x: shared.restart_server(restart=True), _js="restart_reload") - shutdown_submit.click(fn=lambda x: shared.restart_server(restart=False), _js="restart_reload") + defaults_submit.click(fn=lambda x: modules.shared.restore_defaults(restart=True), _js="restart_reload") + restart_submit.click(fn=lambda x: modules.shared.restart_server(restart=True), _js="restart_reload") + shutdown_submit.click(fn=lambda x: modules.shared.restart_server(restart=False), _js="restart_reload") for i, k, item in quicksettings_list: component = component_dict[k] @@ -1470,7 +1472,7 @@ def create_ui(): ) text_settings.change( - fn=lambda: gr.update(visible=shared.sd_model and shared.sd_model.cond_stage_key == "edit"), + fn=lambda: gr.update(visible=modules.shared.sd_model and modules.shared.sd_model.cond_stage_key == "edit"), inputs=[], outputs=[image_cfg_scale], ) @@ -1499,7 +1501,7 @@ def create_ui(): try: results = modules.extras.run_modelmerger(*args) except Exception as e: - errors.display(e, 'model merge') + modules.errors.display(e, 'model merge') modules.sd_models.list_models() # to remove the potentially missing models from the list return [*[gr.Dropdown.update(choices=modules.sd_models.checkpoint_tiles()) for _ in range(4)], f"Error merging checkpoints: {e}"] return results @@ -1543,7 +1545,7 @@ def create_ui(): ui_settings = json.load(file) except Exception as e: error_loading = True - errors.display(e, 'loading ui settings') + modules.errors.display(e, 'loading ui settings') def loadsave(path, x): def apply_field(obj, field, condition=None, init_field=None): @@ -1647,7 +1649,7 @@ def html_head(): head += f'\n' added.append(script.path) added = [a.replace(script_path, '').replace('\\', '/') for a in added] - shared.log.debug(f'Adding JS scripts: {added}') + modules.shared.log.debug(f'Adding JS scripts: {added}') return head @@ -1678,7 +1680,7 @@ def html_css(): if os.path.exists(os.path.join(data_path, "user.css")): head += stylesheet(os.path.join(data_path, "user.css")) added = [a.replace(script_path, '').replace('\\', '/') for a in added] - shared.log.debug(f'Adding CSS stylesheets: {added}') + modules.shared.log.debug(f'Adding CSS stylesheets: {added}') return head @@ -1688,7 +1690,7 @@ def reload_javascript(): body = html_body() def template_response(*args, **kwargs): - res = shared.GradioTemplateResponseOriginal(*args, **kwargs) + res = modules.shared.GradioTemplateResponseOriginal(*args, **kwargs) res.body = res.body.replace(b'', f'{head}'.encode("utf8")) res.body = res.body.replace(b'', f'{css}{body}'.encode("utf8")) res.init_headers() @@ -1697,5 +1699,5 @@ def reload_javascript(): gradio.routes.templates.TemplateResponse = template_response -if not hasattr(shared, 'GradioTemplateResponseOriginal'): - shared.GradioTemplateResponseOriginal = gradio.routes.templates.TemplateResponse +if not hasattr(modules.shared, 'GradioTemplateResponseOriginal'): + modules.shared.GradioTemplateResponseOriginal = gradio.routes.templates.TemplateResponse diff --git a/modules/xlmr.py b/modules/xlmr.py index 9da3161cc..146b0a2e6 100644 --- a/modules/xlmr.py +++ b/modules/xlmr.py @@ -5,7 +5,7 @@ from transformers import XLMRobertaModel,XLMRobertaTokenizer, BertPreTrainedMode from transformers.models.xlm_roberta.configuration_xlm_roberta import XLMRobertaConfig class BertSeriesConfig(BertConfig): - def __init__(self, vocab_size=30522, hidden_size=768, num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072, hidden_act="gelu", hidden_dropout_prob=0.1, attention_probs_dropout_prob=0.1, max_position_embeddings=512, type_vocab_size=2, initializer_range=0.02, layer_norm_eps=1e-12, pad_token_id=0, position_embedding_type="absolute", use_cache=True, classifier_dropout=None,project_dim=512, pooler_fn="average",learn_encoder=False,model_type='bert',**kwargs): + def __init__(self, vocab_size=30522, hidden_size=768, num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072, hidden_act="gelu", hidden_dropout_prob=0.1, attention_probs_dropout_prob=0.1, max_position_embeddings=512, type_vocab_size=2, initializer_range=0.02, layer_norm_eps=1e-12, pad_token_id=0, position_embedding_type="absolute", use_cache=True, classifier_dropout=None,project_dim=512, pooler_fn="average",learn_encoder=False,model_type='bert',**kwargs): # pylint: disable=unused-argument super().__init__(vocab_size, hidden_size, num_hidden_layers, num_attention_heads, intermediate_size, hidden_act, hidden_dropout_prob, attention_probs_dropout_prob, max_position_embeddings, type_vocab_size, initializer_range, layer_norm_eps, pad_token_id, position_embedding_type, use_cache, classifier_dropout, **kwargs) self.project_dim = project_dim @@ -26,7 +26,7 @@ class BertSeriesModelWithTransformation(BertPreTrainedModel): _keys_to_ignore_on_load_missing = [r"position_ids", r"predictions.decoder.bias"] config_class = BertSeriesConfig - def __init__(self, config=None, **kargs): + def __init__(self, config=None, **kargs): # pylint: disable=unused-argument # modify initialization for autoloading if config is None: config = XLMRobertaConfig() @@ -75,7 +75,7 @@ class BertSeriesModelWithTransformation(BertPreTrainedModel): features = self(**text) return features['projection_state'] - def forward( + def forward( # pylint: disable=empty-docstring self, input_ids: Optional[torch.Tensor] = None, attention_mask: Optional[torch.Tensor] = None, @@ -87,7 +87,7 @@ class BertSeriesModelWithTransformation(BertPreTrainedModel): encoder_attention_mask: Optional[torch.Tensor] = None, output_attentions: Optional[bool] = None, return_dict: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, # pylint: disable=unused-argument ) : r""" """ @@ -133,4 +133,4 @@ class BertSeriesModelWithTransformation(BertPreTrainedModel): class RobertaSeriesModelWithTransformation(BertSeriesModelWithTransformation): base_model_prefix = 'roberta' - config_class= RobertaSeriesConfig \ No newline at end of file + config_class= RobertaSeriesConfig