From 9a7a5ba81c04d79c1fcca362e75362975b71b78f Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Tue, 28 May 2024 10:48:27 -0400 Subject: [PATCH] lint cleanup --- .pylintrc | 28 ++++++++-------- extensions-builtin/Lora/lyco_helpers.py | 3 +- extensions-builtin/sd-extension-system-info | 2 +- extensions-builtin/sdnext-modernui | 2 +- installer.py | 4 +-- modules/api/gallery.py | 6 ++-- modules/control/run.py | 14 ++++---- modules/control/util.py | 1 + modules/lama.py | 2 +- modules/mac_specific.py | 1 + modules/olive_script.py | 32 +++++++++---------- modules/processing_class.py | 2 ++ modules/progress.py | 3 +- modules/prompt_parser.py | 3 +- modules/sd_hijack.py | 2 +- modules/sd_hijack_inpainting.py | 2 ++ modules/sd_models.py | 3 ++ modules/sd_models_compile.py | 3 +- .../textual_inversion/textual_inversion.py | 10 +++--- modules/ui.py | 4 ++- 20 files changed, 68 insertions(+), 59 deletions(-) diff --git a/.pylintrc b/.pylintrc index cdbf1e841..ceb7c1e94 100644 --- a/.pylintrc +++ b/.pylintrc @@ -7,21 +7,22 @@ fail-on= fail-under=10 ignore=CVS ignore-paths=/usr/lib/.*$, + modules/control/proc, + modules/control/units, + modules/dml, modules/hidiffusion, modules/hijack, + modules/intel/ipex, + modules/intel/openvino, modules/k-diffusion, modules/ldsr, + modules/onnx_impl, modules/pag, modules/rife, modules/taesd, modules/todo, modules/unipc, modules/xadapter, - modules/intel/openvino, - modules/intel/ipex, - modules/dml, - modules/control/proc, - modules/control/units, repositories, extensions-builtin/sd-webui-agent-scheduler, extensions-builtin/sd-extension-chainner/nodes, @@ -126,15 +127,15 @@ disable=bad-inline-option, broad-exception-caught, chained-comparison, consider-iterating-dictionary, + consider-merging-isinstance, consider-using-dict-items, - consider-using-generator, consider-using-enumerate, - consider-using-sys-exit, consider-using-from-import, + consider-using-generator, consider-using-get, consider-using-in, consider-using-min-builtin, - consider-merging-isinstance, + consider-using-sys-exit, dangerous-default-value, deprecated-pragma, duplicate-code, @@ -154,18 +155,19 @@ disable=bad-inline-option, raw-checker-failed, simplifiable-if-expression, suppressed-message, - too-many-nested-blocks, too-few-public-methods, - too-many-statements, - too-many-locals, too-many-instance-attributes, + too-many-locals, + too-many-nested-blocks, + too-many-statements, + unidiomatic-typecheck, + unnecessary-dict-index-lookup, unnecessary-dunder-call, unnecessary-lambda, use-dict-literal, use-symbolic-message-instead, useless-suppression, - unidiomatic-typecheck, - wrong-import-position + wrong-import-position, enable=c-extension-no-member [METHOD_ARGS] diff --git a/extensions-builtin/Lora/lyco_helpers.py b/extensions-builtin/Lora/lyco_helpers.py index a105695ff..04265539d 100644 --- a/extensions-builtin/Lora/lyco_helpers.py +++ b/extensions-builtin/Lora/lyco_helpers.py @@ -60,8 +60,7 @@ def factorization(dimension: int, factor:int=-1) -> tuple[int, int]: new_n = dimension // new_m if new_m + new_n > length or new_m>factor: break - else: - m, n = new_m, new_n + m, n = new_m, new_n if m > n: n, m = m, n return m, n diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info index 2b9986c5c..c88e83d40 160000 --- a/extensions-builtin/sd-extension-system-info +++ b/extensions-builtin/sd-extension-system-info @@ -1 +1 @@ -Subproject commit 2b9986c5c2498f4de938e17c90617b0d38e2023b +Subproject commit c88e83d403e1cae478df870fa2dd277d2028dc34 diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index bd34fd913..c79be7ffe 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit bd34fd913059b978b41128b896a2d4a66f79ab80 +Subproject commit c79be7ffebfe9e186655f08f21cdab183d005f6b diff --git a/installer.py b/installer.py index bcda7c28f..e312c4f38 100644 --- a/installer.py +++ b/installer.py @@ -402,9 +402,7 @@ def check_python(): # check diffusers version def check_diffusers(): - if args.experimental or args.skip_git: - return - # noop for now, can be used to force specific version based on conditions + pass # noop for now, can be used to force specific version based on conditions # check onnx version diff --git a/modules/api/gallery.py b/modules/api/gallery.py index 9bf795ec9..52455ffa1 100644 --- a/modules/api/gallery.py +++ b/modules/api/gallery.py @@ -2,7 +2,7 @@ import io import os import time import base64 -from typing import List +from typing import List, Union from urllib.parse import quote, unquote from fastapi import FastAPI from fastapi.responses import JSONResponse @@ -51,7 +51,7 @@ class ConnectionManager: debug(f'Browser WS disconnect: client={ws.client.host}') self.active.remove(ws) - async def send(self, ws: WebSocket, data: str|dict|bytes): + async def send(self, ws: WebSocket, data: Union[str, dict, bytes]): # debug(f'Browser WS send: client={ws.client.host} data={type(data)}') if ws.client_state != WebSocketState.CONNECTED: return @@ -64,7 +64,7 @@ class ConnectionManager: else: debug(f'Browser WS send: client={ws.client.host} data={type(data)} unknown') - async def broadcast(self, data: str|dict|bytes): + async def broadcast(self, data: Union[str, dict, bytes]): for ws in self.active: await self.send(ws, data) diff --git a/modules/control/run.py b/modules/control/run.py index 9a8271d89..73eadeafb 100644 --- a/modules/control/run.py +++ b/modules/control/run.py @@ -330,7 +330,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini video = cv2.VideoCapture(inputs) if not video.isOpened(): yield terminate(f'Control: video open failed: path={inputs}') - return + return [], '', '', 'Error: video open failed' frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) fps = int(video.get(cv2.CAP_PROP_FPS)) w, h = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) @@ -341,7 +341,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini shared.log.debug(f'Control: input video: path={inputs} frames={frames} fps={fps} size={w}x{h} codec={codec}') except Exception as e: yield terminate(f'Control: video open failed: path={inputs} {e}') - return + return [], '', '', 'Error: video open failed' while status: processed_image = None @@ -355,7 +355,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini if shared.state.interrupted: shared.state.interrupted = False yield terminate('Control interrupted') - return + return [], '', '', 'Interrupted' # get input if isinstance(input_image, str): try: @@ -443,7 +443,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini pass if any(img is None for img in processed_images): yield terminate('Control: attempting process but output is none') - return + return [], '', '', 'Error: output is none' if len(processed_images) > 1 and len(active_process) != len(active_model): processed_image = [np.array(i) for i in processed_images] processed_image = util.blend(processed_image) # blend all processed images into one @@ -461,7 +461,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini p.init_images = processed_images elif isinstance(selected_models, list) and len(processed_images) != len(selected_models): yield terminate(f'Control: number of inputs does not match: input={len(processed_images)} models={len(selected_models)}') - return + return [], '', '', 'Error: number of inputs does not match' elif selected_models is not None: p.init_images = processed_image else: @@ -475,7 +475,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini debug(f'Control: process=None image={p.ref_image}') if p.ref_image is None: yield terminate('Control: attempting reference mode but image is none') - return + return [], '', '', 'Reference mode without image' elif unit_type == 'controlnet' and input_type == 1: # Init image same as control p.task_args['control_image'] = p.init_images # switch image and control_image p.task_args['strength'] = p.denoising_strength @@ -535,7 +535,7 @@ def control_run(units: List[unit.Unit] = [], inputs: List[Image.Image] = [], ini if has_models: if unit_type in ['controlnet', 't2i adapter', 'lite', 'xs'] and p.task_args.get('image', None) is None and getattr(p, 'init_images', None) is None: yield terminate(f'Control: mode={p.extra_generation_params.get("Control mode", None)} input image is none') - return + return [], '', '', 'Error: Input image is none' # resize mask if mask is not None and resize_mode_mask != 0 and resize_name_mask != 'None': diff --git a/modules/control/util.py b/modules/control/util.py index bc1a9f1ba..b33062d5e 100644 --- a/modules/control/util.py +++ b/modules/control/util.py @@ -31,6 +31,7 @@ def HWC3(x): y = color * alpha + 255.0 * (1.0 - alpha) y = y.clip(0, 255).astype(np.uint8) return y + return x # should not happen def make_noise_disk(H, W, C, F): diff --git a/modules/lama.py b/modules/lama.py index 0656ba521..b7611770b 100644 --- a/modules/lama.py +++ b/modules/lama.py @@ -86,7 +86,7 @@ class SimpleLama: self.model.eval() self.model.to(self.device) - def __call__(self, image: Image.Image | np.ndarray, mask: Image.Image | np.ndarray): + def __call__(self, image: Image.Image, mask: Image.Image): if image is None: log.warning('LaMa: image is none') return None diff --git a/modules/mac_specific.py b/modules/mac_specific.py index c4e26784b..fe7c80f31 100644 --- a/modules/mac_specific.py +++ b/modules/mac_specific.py @@ -4,6 +4,7 @@ import torch from modules.sd_hijack_utils import CondFunc +cumsum_needs_int_fix = False # has_mps is only available in nightly pytorch (for now) and macOS 12.3+. # check `getattr` and try it for compatibility def check_for_mps() -> bool: diff --git a/modules/olive_script.py b/modules/olive_script.py index 1b3362e6c..c881679ed 100644 --- a/modules/olive_script.py +++ b/modules/olive_script.py @@ -20,7 +20,7 @@ class ENVStore: def __getattr__(self, name: str): value = os.environ.get(f"SDNEXT_OLIVE_{name}", None) if value is None: - return + return value ty = self.__class__.__annotations__[name] deserialize = self.__DESERIALIZER[ty] return deserialize(value) @@ -119,7 +119,7 @@ class RandomDataLoader: # ----------------------------------------------------------------------------- -def text_encoder_inputs(batchsize, torch_dtype): +def text_encoder_inputs(batchsize, torch_dtype): # pylint: disable=unused-argument input_ids = torch.zeros((config.batch_size, 77), dtype=torch_dtype) return { "input_ids": input_ids, @@ -132,11 +132,11 @@ def text_encoder_load(model_name): return model -def text_encoder_conversion_inputs(model): +def text_encoder_conversion_inputs(model): # pylint: disable=unused-argument return text_encoder_inputs(1, torch.int32) -def text_encoder_data_loader(data_dir, batchsize, *_, **__): +def text_encoder_data_loader(data_dir, batchsize, *_, **__): # pylint: disable=unused-argument return RandomDataLoader(text_encoder_inputs, config.batch_size, torch.int32) @@ -145,7 +145,7 @@ def text_encoder_data_loader(data_dir, batchsize, *_, **__): # ----------------------------------------------------------------------------- -def text_encoder_2_inputs(batchsize, torch_dtype): +def text_encoder_2_inputs(batchsize, torch_dtype): # pylint: disable=unused-argument return { "input_ids": torch.zeros((config.batch_size, 77), dtype=torch_dtype), "output_hidden_states": True, @@ -157,11 +157,11 @@ def text_encoder_2_load(model_name): return model -def text_encoder_2_conversion_inputs(model): +def text_encoder_2_conversion_inputs(model): # pylint: disable=unused-argument return text_encoder_2_inputs(1, torch.int64) -def text_encoder_2_data_loader(data_dir, batchsize, *_, **__): +def text_encoder_2_data_loader(data_dir, batchsize, *_, **__): # pylint: disable=unused-argument return RandomDataLoader(text_encoder_2_inputs, config.batch_size, torch.int64) @@ -170,7 +170,7 @@ def text_encoder_2_data_loader(data_dir, batchsize, *_, **__): # ----------------------------------------------------------------------------- -def unet_inputs(batchsize, torch_dtype, is_conversion_inputs=False): +def unet_inputs(batchsize, torch_dtype, is_conversion_inputs=False): # pylint: disable=unused-argument if config.is_sdxl: inputs = { "sample": torch.rand((2 * config.batch_size, 4, config.height // 8, config.width // 8), dtype=torch_dtype), @@ -220,11 +220,11 @@ def unet_load(model_name): return model -def unet_conversion_inputs(model): +def unet_conversion_inputs(model): # pylint: disable=unused-argument return tuple(unet_inputs(1, torch.float32, True).values()) -def unet_data_loader(data_dir, batchsize, *_, **__): +def unet_data_loader(data_dir, batchsize, *_, **__): # pylint: disable=unused-argument return RandomDataLoader(unet_inputs, config.batch_size, torch.float16) @@ -233,7 +233,7 @@ def unet_data_loader(data_dir, batchsize, *_, **__): # ----------------------------------------------------------------------------- -def vae_encoder_inputs(batchsize, torch_dtype): +def vae_encoder_inputs(batchsize, torch_dtype): # pylint: disable=unused-argument return { "sample": torch.rand((config.batch_size, 3, config.height, config.width), dtype=torch_dtype), "return_dict": False, @@ -257,11 +257,11 @@ def vae_encoder_load(model_name): return model -def vae_encoder_conversion_inputs(model): +def vae_encoder_conversion_inputs(model): # pylint: disable=unused-argument return tuple(vae_encoder_inputs(1, torch.float32).values()) -def vae_encoder_data_loader(data_dir, batchsize, *_, **__): +def vae_encoder_data_loader(data_dir, batchsize, *_, **__): # pylint: disable=unused-argument return RandomDataLoader(vae_encoder_inputs, config.batch_size, torch.float16) @@ -270,7 +270,7 @@ def vae_encoder_data_loader(data_dir, batchsize, *_, **__): # ----------------------------------------------------------------------------- -def vae_decoder_inputs(batchsize, torch_dtype): +def vae_decoder_inputs(batchsize, torch_dtype): # pylint: disable=unused-argument return { "latent_sample": torch.rand((config.batch_size, 4, config.height // 8, config.width // 8), dtype=torch_dtype), "return_dict": False, @@ -294,9 +294,9 @@ def vae_decoder_load(model_name): return model -def vae_decoder_conversion_inputs(model): +def vae_decoder_conversion_inputs(model): # pylint: disable=unused-argument return tuple(vae_decoder_inputs(1, torch.float32).values()) -def vae_decoder_data_loader(data_dir, batchsize, *_, **__): +def vae_decoder_data_loader(data_dir, batchsize, *_, **__): # pylint: disable=unused-argument return RandomDataLoader(vae_decoder_inputs, config.batch_size, torch.float16) diff --git a/modules/processing_class.py b/modules/processing_class.py index c9ab3a646..7055c2ce1 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -419,6 +419,8 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing): batch_images = np.expand_dims(self.init_images[0], axis=0).repeat(self.batch_size, axis=0) elif len(self.init_images) <= self.batch_size: batch_images = np.array(self.init_images) + else: + batch_images = np.array(self.init_images[:self.batch_size]) image = torch.from_numpy(batch_images) image = 2. * image - 1. image = image.to(device=shared.device, dtype=devices.dtype_vae) diff --git a/modules/progress.py b/modules/progress.py index 29e97b98d..f5573374b 100644 --- a/modules/progress.py +++ b/modules/progress.py @@ -62,8 +62,7 @@ def progressapi(req: ProgressRequest): paused = shared.state.paused if not active: return InternalProgressResponse(job=shared.state.job, active=active, queued=queued, paused=paused, completed=completed, id_live_preview=-1, textinfo="Queued..." if queued else "Waiting...") - if shared.state.job_no > shared.state.job_count: - shared.state.job_count = shared.state.job_no + shared.state.job_count = max(shared.state.job_count, shared.state.job_no) batch_x = max(shared.state.job_no, 0) batch_y = max(shared.state.job_count, 1) step_x = max(shared.state.sampling_step, 0) diff --git a/modules/prompt_parser.py b/modules/prompt_parser.py index ff66162e2..2d164cd59 100644 --- a/modules/prompt_parser.py +++ b/modules/prompt_parser.py @@ -141,8 +141,7 @@ def get_learned_conditioning_prompt_schedules(prompts, steps): def plain(self, args): yield args[0].value def __default__(self, data, children, meta): - for child in children: - yield child + yield from children return AtStep().transform(tree) def get_schedule(prompt): diff --git a/modules/sd_hijack.py b/modules/sd_hijack.py index 53e4272ef..2417c67ab 100644 --- a/modules/sd_hijack.py +++ b/modules/sd_hijack.py @@ -252,7 +252,7 @@ class StableDiffusionModelHijack: def get_prompt_lengths(self, text): if self.clip is None: return 0, 0 - chunks, token_count = self.clip.process_texts([text]) + _chunks, token_count = self.clip.process_texts([text]) return token_count, self.clip.get_target_prompt_token_count(token_count) diff --git a/modules/sd_hijack_inpainting.py b/modules/sd_hijack_inpainting.py index 882560a1c..12c19d0d7 100644 --- a/modules/sd_hijack_inpainting.py +++ b/modules/sd_hijack_inpainting.py @@ -89,6 +89,8 @@ def p_sample_plms(self, x, c, t, index, repeat_noise=False, use_original_steps=F elif len(old_eps) >= 3: # 4nd order Pseudo Linear Multistep (Adams-Bashforth) e_t_prime = (55 * e_t - 59 * old_eps[-1] + 37 * old_eps[-2] - 9 * old_eps[-3]) / 24 + else: + e_t_prime = e_t # error state x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t_prime, index) diff --git a/modules/sd_models.py b/modules/sd_models.py index 65cfb4ac9..d78a5a6b9 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -1307,6 +1307,9 @@ def set_diffuser_pipe(pipe, new_pipe_type): new_pipe = diffusers.AutoPipelineForImage2Image.from_pipe(pipe) elif new_pipe_type == DiffusersTaskType.INPAINTING: new_pipe = diffusers.AutoPipelineForInpainting.from_pipe(pipe) + else: + shared.log.error(f'Pipeline class change failed: type={new_pipe_type} pipeline={pipe.__class__.__name__}') + return pipe except Exception as e: # pylint: disable=unused-variable shared.log.warning(f'Pipeline class change failed: type={new_pipe_type} pipeline={pipe.__class__.__name__} {e}') return pipe diff --git a/modules/sd_models_compile.py b/modules/sd_models_compile.py index 8c351f394..113335931 100644 --- a/modules/sd_models_compile.py +++ b/modules/sd_models_compile.py @@ -107,10 +107,11 @@ def nncf_compress_weights(sd_model): def nncf_compress_model(model): return_device = model.device model.eval() + backup_embeddings = None if hasattr(model, "get_input_embeddings"): backup_embeddings = copy.deepcopy(model.get_input_embeddings()) model = nncf.compress_weights(model.to(devices.device)).to(return_device) - if hasattr(model, "set_input_embeddings"): + if hasattr(model, "set_input_embeddings") and backup_embeddings is not None: model.set_input_embeddings(backup_embeddings) devices.torch_gc(force=True) return model diff --git a/modules/textual_inversion/textual_inversion.py b/modules/textual_inversion/textual_inversion.py index 3ffaa8157..e2d720663 100644 --- a/modules/textual_inversion/textual_inversion.py +++ b/modules/textual_inversion/textual_inversion.py @@ -165,11 +165,11 @@ class EmbeddingDatabase: return 0 filenames = list(filename) exts = [".SAFETENSORS", '.BIN', '.PT', '.PNG', '.WEBP', '.JXL', '.AVIF'] - for filename in filenames: + for _filename in filenames: # debug(f'Embedding check: {filename}') - fullname = filename - filename = os.path.basename(fullname) - fn, ext = os.path.splitext(filename) + fullname = _filename + _filename = os.path.basename(fullname) + fn, ext = os.path.splitext(_filename) name = os.path.basename(fn) embedding = Embedding(vec=None, name=name, filename=fullname) tokenizer_vocab = tokenizer.get_vocab() @@ -283,7 +283,7 @@ class EmbeddingDatabase: elif ext in ['.SAFETENSORS']: data = safetensors.torch.load_file(path, device="cpu") else: - return + return None # textual inversion embeddings if 'string_to_param' in data: diff --git a/modules/ui.py b/modules/ui.py index 0fcf8f316..3d9041f78 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -177,6 +177,7 @@ def create_ui(startup_timer = None): else: raise ValueError(f'bad options item type: {t} for key {key}') elem_id = f"setting_{key}" + dirty_indicator = None if not is_quicksettings: dirtyable_setting = gr.Group(elem_classes="dirtyable", visible=args.get("visible", True)) @@ -204,7 +205,8 @@ def create_ui(startup_timer = None): if res is not None and not is_quicksettings: res.change(fn=None, inputs=res, _js=f'(val) => markIfModified("{key}", val)') - dirty_indicator.click(fn=lambda: getattr(opts, key), outputs=res, show_progress=False) + if dirty_indicator is not None: + dirty_indicator.click(fn=lambda: getattr(opts, key), outputs=res, show_progress=False) dirtyable_setting.__exit__() return res