mirror of
				https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
				synced 2025-10-31 01:54:44 +00:00 
			
		
		
		
	Merge pull request #1616 from brkirch/cpu-cmdline-opt
Add --use-cpu command line option
This commit is contained in:
		
						commit
						bc4d457de8
					
				| @ -8,7 +8,7 @@ import torch | |||||||
| from basicsr.utils.download_util import load_file_from_url | from basicsr.utils.download_util import load_file_from_url | ||||||
| 
 | 
 | ||||||
| import modules.upscaler | import modules.upscaler | ||||||
| from modules import shared, modelloader | from modules import devices, modelloader | ||||||
| from modules.bsrgan_model_arch import RRDBNet | from modules.bsrgan_model_arch import RRDBNet | ||||||
| from modules.paths import models_path | from modules.paths import models_path | ||||||
| 
 | 
 | ||||||
| @ -44,13 +44,13 @@ class UpscalerBSRGAN(modules.upscaler.Upscaler): | |||||||
|         model = self.load_model(selected_file) |         model = self.load_model(selected_file) | ||||||
|         if model is None: |         if model is None: | ||||||
|             return img |             return img | ||||||
|         model.to(shared.device) |         model.to(devices.device_bsrgan) | ||||||
|         torch.cuda.empty_cache() |         torch.cuda.empty_cache() | ||||||
|         img = np.array(img) |         img = np.array(img) | ||||||
|         img = img[:, :, ::-1] |         img = img[:, :, ::-1] | ||||||
|         img = np.moveaxis(img, 2, 0) / 255 |         img = np.moveaxis(img, 2, 0) / 255 | ||||||
|         img = torch.from_numpy(img).float() |         img = torch.from_numpy(img).float() | ||||||
|         img = img.unsqueeze(0).to(shared.device) |         img = img.unsqueeze(0).to(devices.device_bsrgan) | ||||||
|         with torch.no_grad(): |         with torch.no_grad(): | ||||||
|             output = model(img) |             output = model(img) | ||||||
|         output = output.squeeze().float().cpu().clamp_(0, 1).numpy() |         output = output.squeeze().float().cpu().clamp_(0, 1).numpy() | ||||||
|  | |||||||
| @ -2,9 +2,9 @@ import contextlib | |||||||
| 
 | 
 | ||||||
| import torch | import torch | ||||||
| 
 | 
 | ||||||
| # has_mps is only available in nightly pytorch (for now), `getattr` for compatibility |  | ||||||
| from modules import errors | from modules import errors | ||||||
| 
 | 
 | ||||||
|  | # has_mps is only available in nightly pytorch (for now), `getattr` for compatibility | ||||||
| has_mps = getattr(torch, 'has_mps', False) | has_mps = getattr(torch, 'has_mps', False) | ||||||
| 
 | 
 | ||||||
| cpu = torch.device("cpu") | cpu = torch.device("cpu") | ||||||
| @ -34,8 +34,7 @@ def enable_tf32(): | |||||||
| 
 | 
 | ||||||
| errors.run(enable_tf32, "Enabling TF32") | errors.run(enable_tf32, "Enabling TF32") | ||||||
| 
 | 
 | ||||||
| device = get_optimal_device() | device = device_gfpgan = device_bsrgan = device_esrgan = device_scunet = device_codeformer = get_optimal_device() | ||||||
| device_codeformer = cpu if has_mps else device |  | ||||||
| dtype = torch.float16 | dtype = torch.float16 | ||||||
| 
 | 
 | ||||||
| def randn(seed, shape): | def randn(seed, shape): | ||||||
|  | |||||||
| @ -6,8 +6,7 @@ from PIL import Image | |||||||
| from basicsr.utils.download_util import load_file_from_url | from basicsr.utils.download_util import load_file_from_url | ||||||
| 
 | 
 | ||||||
| import modules.esrgam_model_arch as arch | import modules.esrgam_model_arch as arch | ||||||
| from modules import shared, modelloader, images | from modules import shared, modelloader, images, devices | ||||||
| from modules.devices import has_mps |  | ||||||
| from modules.paths import models_path | from modules.paths import models_path | ||||||
| from modules.upscaler import Upscaler, UpscalerData | from modules.upscaler import Upscaler, UpscalerData | ||||||
| from modules.shared import opts | from modules.shared import opts | ||||||
| @ -97,7 +96,7 @@ class UpscalerESRGAN(Upscaler): | |||||||
|         model = self.load_model(selected_model) |         model = self.load_model(selected_model) | ||||||
|         if model is None: |         if model is None: | ||||||
|             return img |             return img | ||||||
|         model.to(shared.device) |         model.to(devices.device_esrgan) | ||||||
|         img = esrgan_upscale(model, img) |         img = esrgan_upscale(model, img) | ||||||
|         return img |         return img | ||||||
| 
 | 
 | ||||||
| @ -112,7 +111,7 @@ class UpscalerESRGAN(Upscaler): | |||||||
|             print("Unable to load %s from %s" % (self.model_path, filename)) |             print("Unable to load %s from %s" % (self.model_path, filename)) | ||||||
|             return None |             return None | ||||||
| 
 | 
 | ||||||
|         pretrained_net = torch.load(filename, map_location='cpu' if has_mps else None) |         pretrained_net = torch.load(filename, map_location='cpu' if shared.device.type == 'mps' else None) | ||||||
|         crt_model = arch.RRDBNet(3, 3, 64, 23, gc=32) |         crt_model = arch.RRDBNet(3, 3, 64, 23, gc=32) | ||||||
| 
 | 
 | ||||||
|         pretrained_net = fix_model_layers(crt_model, pretrained_net) |         pretrained_net = fix_model_layers(crt_model, pretrained_net) | ||||||
| @ -127,7 +126,7 @@ def upscale_without_tiling(model, img): | |||||||
|     img = img[:, :, ::-1] |     img = img[:, :, ::-1] | ||||||
|     img = np.moveaxis(img, 2, 0) / 255 |     img = np.moveaxis(img, 2, 0) / 255 | ||||||
|     img = torch.from_numpy(img).float() |     img = torch.from_numpy(img).float() | ||||||
|     img = img.unsqueeze(0).to(shared.device) |     img = img.unsqueeze(0).to(devices.device_esrgan) | ||||||
|     with torch.no_grad(): |     with torch.no_grad(): | ||||||
|         output = model(img) |         output = model(img) | ||||||
|     output = output.squeeze().float().cpu().clamp_(0, 1).numpy() |     output = output.squeeze().float().cpu().clamp_(0, 1).numpy() | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ def gfpgann(): | |||||||
|     global loaded_gfpgan_model |     global loaded_gfpgan_model | ||||||
|     global model_path |     global model_path | ||||||
|     if loaded_gfpgan_model is not None: |     if loaded_gfpgan_model is not None: | ||||||
|         loaded_gfpgan_model.gfpgan.to(shared.device) |         loaded_gfpgan_model.gfpgan.to(devices.device_gfpgan) | ||||||
|         return loaded_gfpgan_model |         return loaded_gfpgan_model | ||||||
| 
 | 
 | ||||||
|     if gfpgan_constructor is None: |     if gfpgan_constructor is None: | ||||||
| @ -53,7 +53,7 @@ def gfpgan_fix_faces(np_image): | |||||||
|     if model is None: |     if model is None: | ||||||
|         return np_image |         return np_image | ||||||
| 
 | 
 | ||||||
|     send_model_to(model, devices.device) |     send_model_to(model, devices.device_gfpgan) | ||||||
| 
 | 
 | ||||||
|     np_image_bgr = np_image[:, :, ::-1] |     np_image_bgr = np_image[:, :, ::-1] | ||||||
|     cropped_faces, restored_faces, gfpgan_output_bgr = model.enhance(np_image_bgr, has_aligned=False, only_center_face=False, paste_back=True) |     cropped_faces, restored_faces, gfpgan_output_bgr = model.enhance(np_image_bgr, has_aligned=False, only_center_face=False, paste_back=True) | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ import torch | |||||||
| from basicsr.utils.download_util import load_file_from_url | from basicsr.utils.download_util import load_file_from_url | ||||||
| 
 | 
 | ||||||
| import modules.upscaler | import modules.upscaler | ||||||
| from modules import shared, modelloader | from modules import devices, modelloader | ||||||
| from modules.paths import models_path | from modules.paths import models_path | ||||||
| from modules.scunet_model_arch import SCUNet as net | from modules.scunet_model_arch import SCUNet as net | ||||||
| 
 | 
 | ||||||
| @ -51,12 +51,12 @@ class UpscalerScuNET(modules.upscaler.Upscaler): | |||||||
|         if model is None: |         if model is None: | ||||||
|             return img |             return img | ||||||
| 
 | 
 | ||||||
|         device = shared.device |         device = devices.device_scunet | ||||||
|         img = np.array(img) |         img = np.array(img) | ||||||
|         img = img[:, :, ::-1] |         img = img[:, :, ::-1] | ||||||
|         img = np.moveaxis(img, 2, 0) / 255 |         img = np.moveaxis(img, 2, 0) / 255 | ||||||
|         img = torch.from_numpy(img).float() |         img = torch.from_numpy(img).float() | ||||||
|         img = img.unsqueeze(0).to(shared.device) |         img = img.unsqueeze(0).to(device) | ||||||
| 
 | 
 | ||||||
|         img = img.to(device) |         img = img.to(device) | ||||||
|         with torch.no_grad(): |         with torch.no_grad(): | ||||||
| @ -69,7 +69,7 @@ class UpscalerScuNET(modules.upscaler.Upscaler): | |||||||
|         return PIL.Image.fromarray(output, 'RGB') |         return PIL.Image.fromarray(output, 'RGB') | ||||||
| 
 | 
 | ||||||
|     def load_model(self, path: str): |     def load_model(self, path: str): | ||||||
|         device = shared.device |         device = devices.device_scunet | ||||||
|         if "http" in path: |         if "http" in path: | ||||||
|             filename = load_file_from_url(url=self.model_url, model_dir=self.model_path, file_name="%s.pth" % self.name, |             filename = load_file_from_url(url=self.model_url, model_dir=self.model_path, file_name="%s.pth" % self.name, | ||||||
|                                           progress=True) |                                           progress=True) | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ import modules.interrogate | |||||||
| import modules.memmon | import modules.memmon | ||||||
| import modules.sd_models | import modules.sd_models | ||||||
| import modules.styles | import modules.styles | ||||||
| from modules.devices import get_optimal_device | import modules.devices as devices | ||||||
| from modules.paths import script_path, sd_path | from modules.paths import script_path, sd_path | ||||||
| 
 | 
 | ||||||
| sd_model_file = os.path.join(script_path, 'model.ckpt') | sd_model_file = os.path.join(script_path, 'model.ckpt') | ||||||
| @ -46,6 +46,7 @@ parser.add_argument("--ldsr-models-path", type=str, help="Path to directory with | |||||||
| parser.add_argument("--opt-split-attention", action='store_true', help="force-enables cross-attention layer optimization. By default, it's on for torch.cuda and off for other torch devices.") | parser.add_argument("--opt-split-attention", action='store_true', help="force-enables cross-attention layer optimization. By default, it's on for torch.cuda and off for other torch devices.") | ||||||
| parser.add_argument("--disable-opt-split-attention", action='store_true', help="force-disables cross-attention layer optimization") | parser.add_argument("--disable-opt-split-attention", action='store_true', help="force-disables cross-attention layer optimization") | ||||||
| parser.add_argument("--opt-split-attention-v1", action='store_true', help="enable older version of split attention optimization that does not consume all the VRAM it can find") | parser.add_argument("--opt-split-attention-v1", action='store_true', help="enable older version of split attention optimization that does not consume all the VRAM it can find") | ||||||
|  | parser.add_argument("--use-cpu", nargs='+',choices=['SD', 'GFPGAN', 'BSRGAN', 'ESRGAN', 'SCUNet', 'CodeFormer'], help="use CPU as torch device for specified modules", default=[]) | ||||||
| parser.add_argument("--listen", action='store_true', help="launch gradio with 0.0.0.0 as server name, allowing to respond to network requests") | parser.add_argument("--listen", action='store_true', help="launch gradio with 0.0.0.0 as server name, allowing to respond to network requests") | ||||||
| parser.add_argument("--port", type=int, help="launch gradio with given server port, you need root/admin rights for ports < 1024, defaults to 7860 if available", default=None) | parser.add_argument("--port", type=int, help="launch gradio with given server port, you need root/admin rights for ports < 1024, defaults to 7860 if available", default=None) | ||||||
| parser.add_argument("--show-negative-prompt", action='store_true', help="does not do anything", default=False) | parser.add_argument("--show-negative-prompt", action='store_true', help="does not do anything", default=False) | ||||||
| @ -63,7 +64,11 @@ parser.add_argument("--enable-console-prompts", action='store_true', help="print | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| cmd_opts = parser.parse_args() | cmd_opts = parser.parse_args() | ||||||
| device = get_optimal_device() | 
 | ||||||
|  | devices.device, devices.device_gfpgan, devices.device_bsrgan, devices.device_esrgan, devices.device_scunet, devices.device_codeformer = \ | ||||||
|  | (devices.cpu if x in cmd_opts.use_cpu else devices.get_optimal_device() for x in ['SD', 'GFPGAN', 'BSRGAN', 'ESRGAN', 'SCUNet', 'CodeFormer']) | ||||||
|  | 
 | ||||||
|  | device = devices.device | ||||||
| 
 | 
 | ||||||
| batch_cond_uncond = cmd_opts.always_batch_cond_uncond or not (cmd_opts.lowvram or cmd_opts.medvram) | batch_cond_uncond = cmd_opts.always_batch_cond_uncond or not (cmd_opts.lowvram or cmd_opts.medvram) | ||||||
| parallel_processing_allowed = not cmd_opts.lowvram and not cmd_opts.medvram | parallel_processing_allowed = not cmd_opts.lowvram and not cmd_opts.medvram | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 AUTOMATIC1111
						AUTOMATIC1111