diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index 5cf9a6778..366b13d32 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -137,7 +137,7 @@ class Script(scripts.Script): shared.log.error('PuLID: no images') return None - supported_model_list = ['sdxl'] + supported_model_list = ['sdxl', 'f1'] if shared.sd_model_type not in supported_model_list: shared.log.error(f'PuLID: class={shared.sd_model.__class__.__name__} model={shared.sd_model_type} required={supported_model_list}') return None @@ -168,15 +168,12 @@ class Script(scripts.Script): p.batch_size = 1 sdp = shared.opts.cross_attention_optimization == "Scaled-Dot-Product" - sampler_fn = getattr(self.pulid.sampling, f'sample_{sampler}', None) strength = getattr(p, 'pulid_strength', strength) zero = getattr(p, 'pulid_zero', zero) ortho = getattr(p, 'pulid_ortho', ortho) sampler = getattr(p, 'pulid_sampler', sampler) restore = getattr(p, 'pulid_restore', restore) p.pulid_restore = restore - if sampler_fn is None: - sampler_fn = self.pulid.sampling.sample_dpmpp_2m_sde if shared.sd_model_type == 'sdxl' and not hasattr(shared.sd_model, 'pipe'): try: @@ -203,9 +200,42 @@ class Script(scripts.Script): shared.log.error(f'PuLID: failed to create pipeline: {e}') errors.display(e, 'PuLID') return None + elif shared.sd_model_type == 'f1': + # TODO nunchaku: pulid-f1 + shared.log.error('PuLID: f1 not supported') + return None + if shared.sd_model_type == 'sdxl': + processed = self.run_sdxl(p, images, strength, zero, sampler, ortho, restore, offload, version) + elif shared.sd_model_type == 'f1': + processed = None + else: + shared.log.error(f'PuLID: class={shared.sd_model.__class__.__name__} model={shared.sd_model_type} required={supported_model_list}') + processed = None + return processed + + def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, *args): # pylint: disable=unused-argument + _strength, _zero, _sampler, _ortho, _gallery, restore, _offload, _version = args + if shared.sd_model_type == "sdxl" and hasattr(shared.sd_model, 'pipe'): + restore = getattr(p, 'pulid_restore', restore) + if restore: + if hasattr(shared.sd_model, 'app'): + shared.sd_model.app = None + shared.sd_model.ip_adapter = None + shared.sd_model.face_helper = None + shared.sd_model.clip_vision_model = None + shared.sd_model.handler_ante = None + shared.sd_model = shared.sd_model.pipe + devices.torch_gc(force=True) + shared.log.debug(f'PuLID complete: class={shared.sd_model.__class__.__name__} preprocess={self.preprocess:.2f} pipe={"restore" if restore else "cache"}') + return processed + + def run_sdxl(self, p: processing.StableDiffusionProcessing, images: list, strength: float, zero: int, sampler: str, ortho: str, restore: bool, offload: bool, version: str): + sampler_fn = getattr(self.pulid.sampling, f'sample_{sampler}', None) + if sampler_fn is None: + sampler_fn = self.pulid.sampling.sample_dpmpp_2m_sde shared.sd_model.sampler = sampler_fn - shared.log.info(f'PuLID: class={shared.sd_model.__class__.__name__} version="{version}" sdp={sdp} strength={strength} zero={zero} ortho={ortho} sampler={sampler_fn} images={[i.shape for i in images]} offload={offload} restore={restore}') + shared.log.info(f'PuLID: class={shared.sd_model.__class__.__name__} version="{version}" strength={strength} zero={zero} ortho={ortho} sampler={sampler_fn} images={[i.shape for i in images]} offload={offload} restore={restore}') self.pulid.attention.NUM_ZERO = zero self.pulid.attention.ORTHO = ortho == 'v1' self.pulid.attention.ORTHO_v2 = ortho == 'v2' @@ -256,19 +286,3 @@ class Script(scripts.Script): # interim = [Image.fromarray(img) for img in shared.sd_model.debug_img_list] # shared.log.debug(f'PuLID: time={t1-t0:.2f}') return processed - - def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, *args): # pylint: disable=unused-argument - _strength, _zero, _sampler, _ortho, _gallery, restore, _offload, _version = args - if hasattr(shared.sd_model, 'pipe') and shared.sd_model_type == "sdxl": - restore = getattr(p, 'pulid_restore', restore) - if restore: - if hasattr(shared.sd_model, 'app'): - shared.sd_model.app = None - shared.sd_model.ip_adapter = None - shared.sd_model.face_helper = None - shared.sd_model.clip_vision_model = None - shared.sd_model.handler_ante = None - shared.sd_model = shared.sd_model.pipe - devices.torch_gc(force=True) - shared.log.debug(f'PuLID complete: class={shared.sd_model.__class__.__name__} preprocess={self.preprocess:.2f} pipe={"restore" if restore else "cache"}') - return processed diff --git a/wiki b/wiki index d4bdcc986..cfc7c23e8 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit d4bdcc986d39a11bb65c456b4daa199bd09ac3c6 +Subproject commit cfc7c23e8001ee110addd78c16aad4ed25d487d3