diff --git a/installer.py b/installer.py index 5639874a5..3bda5db66 100644 --- a/installer.py +++ b/installer.py @@ -224,6 +224,7 @@ def check_torch(): elif allow_rocm and (shutil.which('rocminfo') is not None or os.path.exists('/opt/rocm/bin/rocminfo')): log.info('AMD ROCm toolkit detected') os.environ.setdefault('HSA_OVERRIDE_GFX_VERSION', '10.3.0') + os.environ.setdefault('PYTORCH_HIP_ALLOC_CONF', 'garbage_collection_threshold:0.9,max_split_size_mb:512') torch_command = os.environ.get('TORCH_COMMAND', 'torch==2.0.0 torchvision==0.15.1 torchaudio --index-url https://download.pytorch.org/whl/rocm5.4.2') xformers_package = os.environ.get('XFORMERS_PACKAGE', 'none') elif allow_ipex and (shutil.which('sycl-ls') is not None or os.path.exists('/opt/intel/oneapi') or args.use_ipex): diff --git a/modules/devices.py b/modules/devices.py index 683ec02d3..68d092a7b 100644 --- a/modules/devices.py +++ b/modules/devices.py @@ -2,7 +2,7 @@ import gc import sys import contextlib import torch -from modules import cmd_args, shared +from modules import cmd_args, shared, memstats if sys.platform == "darwin": from modules import mac_specific # pylint: disable=ungrouped-imports @@ -78,6 +78,7 @@ def torch_gc(): torch.cuda.ipc_collect() except: pass + shared.log.debug(f'gc: {memstats.memory_stats()}') def test_fp16(): @@ -104,7 +105,10 @@ def set_cuda_params(): pass if torch.backends.cudnn.is_available(): try: - torch.backends.cudnn.benchmark = shared.opts.cudnn_benchmark + if any([torch.cuda.get_device_capability(devid) == (7, 5) for devid in range(0, torch.cuda.device_count())]): # monkey-patch for old nvidia cards + torch.backends.cudnn.benchmark = True + else: + torch.backends.cudnn.benchmark = shared.opts.cudnn_benchmark torch.backends.cudnn.benchmark_limit = 0 torch.backends.cudnn.allow_tf32 = shared.opts.cuda_allow_tf32 except: diff --git a/modules/processing.py b/modules/processing.py index 0f5411787..32a7f4bb3 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -538,7 +538,7 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed: assert len(p.prompt) > 0 else: assert p.prompt is not None - devices.torch_gc() + # devices.torch_gc() # TODO: gc seed = get_fixed_seed(p.seed) subseed = get_fixed_seed(p.subseed) modules.sd_hijack.model_hijack.apply_circular(p.tiling) @@ -672,9 +672,7 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed: info=infotext(n, i) p.restore_faces = orig images.save_image(Image.fromarray(x_sample), p.outpath_samples, "", seeds[i], prompts[i], opts.samples_format, info=info, p=p, suffix="-before-face-restoration") - devices.torch_gc() x_sample = modules.face_restoration.restore_faces(x_sample) - devices.torch_gc() image = Image.fromarray(x_sample) if p.scripts is not None: pp = scripts.PostprocessImageArgs(image) diff --git a/modules/scripts.py b/modules/scripts.py index 6209e303b..15c37f478 100644 --- a/modules/scripts.py +++ b/modules/scripts.py @@ -4,6 +4,8 @@ import sys from collections import namedtuple import gradio as gr from modules import paths, script_callbacks, extensions, script_loading, scripts_postprocessing, errors +from installer import log + AlwaysVisible = object() @@ -360,6 +362,7 @@ class ScriptRunner: if script is None: return None parsed = p.per_script_args.get(script.title(), args[script.args_from:script.args_to]) + log.debug(f'Script run: {script.title()}') processed = script.run(p, *parsed) return processed @@ -367,6 +370,7 @@ class ScriptRunner: for script in self.alwayson_scripts: try: args = p.per_script_args.get(script.title(), p.script_args[script.args_from:script.args_to]) + log.debug(f'Script process: {script.title()}') script.process(p, *args, **kwargs) except Exception as e: errors.display(e, f'Running script process: {script.filename}') @@ -375,6 +379,7 @@ class ScriptRunner: for script in self.alwayson_scripts: try: args = p.per_script_args.get(script.title(), p.script_args[script.args_from:script.args_to]) + log.debug(f'Script before-process-batch: {script.title()}') script.before_process_batch(p, *args, **kwargs) except Exception as e: errors.display(e, f'Running script before process batch: {script.filename}') @@ -383,6 +388,7 @@ class ScriptRunner: for script in self.alwayson_scripts: try: args = p.per_script_args.get(script.title(), p.script_args[script.args_from:script.args_to]) + log.debug(f'Script process-batch: {script.title()}') script.process_batch(p, *args, **kwargs) except Exception as e: errors.display(e, f'Running script process batch: {script.filename}') @@ -391,6 +397,7 @@ class ScriptRunner: for script in self.alwayson_scripts: try: args = p.per_script_args.get(script.title(), p.script_args[script.args_from:script.args_to]) + log.debug(f'Script postprocess: {script.title()}') script.postprocess(p, processed, *args) except Exception as e: errors.display(e, f'Running script postprocess: {script.filename}') @@ -399,6 +406,7 @@ class ScriptRunner: for script in self.alwayson_scripts: try: args = p.per_script_args.get(script.title(), p.script_args[script.args_from:script.args_to]) + log.debug(f'Script postprocess-batch: {script.title()}') script.postprocess_batch(p, *args, images=images, **kwargs) except Exception as e: errors.display(e, f'Running script before postprocess batch: {script.filename}') @@ -407,6 +415,7 @@ class ScriptRunner: for script in self.alwayson_scripts: try: args = p.per_script_args.get(script.title(), p.script_args[script.args_from:script.args_to]) + log.debug(f'Script postprocess-image: {script.title()}') script.postprocess_image(p, pp, *args) except Exception as e: errors.display(e, f'Running script postprocess image: {script.filename}') diff --git a/modules/sd_models.py b/modules/sd_models.py index a76af872a..5c0ba6165 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -409,7 +409,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() - shared.log.debug(f'Model load finished: {memory_stats()}') + shared.log.info(f'Model load finished: {memory_stats()}') def reload_model_weights(sd_model=None, info=None):