From ad7d0bbf6a58af3cb1cbe21823a1644df262e0d1 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 11 Apr 2024 15:12:50 -0400 Subject: [PATCH] add pixart-sigma --- CHANGELOG.md | 11 +- TODO.md | 1 - html/reference.json | 6 + ...pha--pixart_sigma_sdxlvae_T5_diffusers.jpg | Bin 0 -> 35494 bytes modules/sd_hijack_pixart.py | 547 ++++++++++++++++++ modules/sd_models.py | 22 +- modules/sd_vae_taesd.py | 6 +- modules/shared_items.py | 5 +- 8 files changed, 592 insertions(+), 6 deletions(-) create mode 100644 models/Reference/PixArt-alpha--pixart_sigma_sdxlvae_T5_diffusers.jpg create mode 100644 modules/sd_hijack_pixart.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f61554c3b..ae403696f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log for SD.Next +## Pending + +- PixArt-Σ requires `diffusers-0.28.0.dev0` + ## Update for 2024-04-11 - **Features**: @@ -26,7 +30,12 @@ > --ipadapter 'Plus:~/generative/Samples/cutie-512.png:0.5' - Add API endpoint `/sdapi/v1/vqa` and CLI util `cli/simple-vqa.py` - **Models**: - - support for [SDXS](https://github.com/IDKiro/sdxs) + - [PixArt-Σ](https://pixart-alpha.github.io/PixArt-sigma-project/) + pixart-Σ is a high end diffusion Transformer model (DiT) with a T5 encoder/decoder capable of directly generating images at 4K resolution + to use, simply select from *networks -> models -> PixArt-Σ* + *note*: this is a very large model at ~22GB + set parameters: *precision: fp32*, *sampler: Default* + - [SDXS](https://github.com/IDKiro/sdxs) sdxs is an extremely fast 1-step generation model that also uses TAESD as quick VAE out-of-the-box to use, simply select from *networks -> models -> SDXS* set parameters: *sampler: CMSI, steps: 1, cfg_scale: 0.0* diff --git a/TODO.md b/TODO.md index 5244c7ad8..ab11bacd6 100644 --- a/TODO.md +++ b/TODO.md @@ -13,7 +13,6 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ### Models - stable diffusion 3.0 -- pixart-sigma: - powerpaint: - ella: diff --git a/html/reference.json b/html/reference.json index 685aa783d..6eb093afc 100644 --- a/html/reference.json +++ b/html/reference.json @@ -145,6 +145,12 @@ "preview": "PixArt-alpha--PixArt-XL-2-1024-MS.jpg", "extras": "width: 1024, height: 1024, sampler: Default, cfg_scale: 2.0" }, + "Pixart-Σ": { + "path": "PixArt-alpha/pixart_sigma_sdxlvae_T5_diffusers", + "desc": "PixArt-Σ, a Diffusion Transformer model (DiT) capable of directly generating images at 4K resolution. PixArt-Σ represents a significant advancement over its predecessor, PixArt-α, offering images of markedly higher fidelity and improved alignment with text prompts.", + "preview": "PixArt-alpha--pixart_sigma_sdxlvae_T5_diffusers.jpg", + "extras": "width: 1024, height: 1024, sampler: Default, cfg_scale: 2.0" + }, "Kandinsky 2.1": { "path": "kandinsky-community/kandinsky-2-1", diff --git a/models/Reference/PixArt-alpha--pixart_sigma_sdxlvae_T5_diffusers.jpg b/models/Reference/PixArt-alpha--pixart_sigma_sdxlvae_T5_diffusers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40a9a76b99f72586d778d4204db2b52b02fe1fec GIT binary patch literal 35494 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 Union[ImagePipelineOutput, Tuple]: + """ + Function invoked when calling the pipeline for generation. + + Args: + prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. + instead. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds` instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` is + less than `1`). + num_inference_steps (`int`, *optional*, defaults to 100): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. + timesteps (`List[int]`, *optional*): + Custom timesteps to use for the denoising process. If not defined, equal spaced `num_inference_steps` + timesteps are used. Must be in descending order. + guidance_scale (`float`, *optional*, defaults to 4.5): + Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). + `guidance_scale` is defined as `w` of equation 2. of [Imagen + Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > + 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, + usually at the expense of lower image quality. + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + height (`int`, *optional*, defaults to self.unet.config.sample_size): + The height in pixels of the generated image. + width (`int`, *optional*, defaults to self.unet.config.sample_size): + The width in pixels of the generated image. + eta (`float`, *optional*, defaults to 0.0): + Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to + [`schedulers.DDIMScheduler`], will be ignored for others. + generator (`torch.Generator` or `List[torch.Generator]`, *optional*): + One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) + to make generation deterministic. + latents (`torch.FloatTensor`, *optional*): + Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image + generation. Can be used to tweak the same generation with different prompts. If not provided, a latents + tensor will ge generated by sampling using the supplied random `generator`. + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + prompt_attention_mask (`torch.FloatTensor`, *optional*): Pre-generated attention mask for text embeddings. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. For PixArt-Alpha this negative prompt should be "". If not + provided, negative_prompt_embeds will be generated from `negative_prompt` input argument. + negative_prompt_attention_mask (`torch.FloatTensor`, *optional*): + Pre-generated attention mask for negative text embeddings. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generate image. Choose between + [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~pipelines.stable_diffusion.IFPipelineOutput`] instead of a plain tuple. + callback (`Callable`, *optional*): + A function that will be called every `callback_steps` steps during inference. The function will be + called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. + callback_steps (`int`, *optional*, defaults to 1): + The frequency at which the `callback` function will be called. If not specified, the callback will be + called at every step. + clean_caption (`bool`, *optional*, defaults to `True`): + Whether or not to clean the caption before creating embeddings. Requires `beautifulsoup4` and `ftfy` to + be installed. If the dependencies are not installed, the embeddings will be created from the raw + prompt. + use_resolution_binning (`bool` defaults to `True`): + If set to `True`, the requested height and width are first mapped to the closest resolutions using + `ASPECT_RATIO_1024_BIN`. After the produced latents are decoded into images, they are resized back to + the requested resolution. Useful for generating non-square images. + + Examples: + + Returns: + [`~pipelines.ImagePipelineOutput`] or `tuple`: + If `return_dict` is `True`, [`~pipelines.ImagePipelineOutput`] is returned, otherwise a `tuple` is + returned where the first element is a list with the generated images + """ + if "mask_feature" in kwargs: + deprecation_message = "The use of `mask_feature` is deprecated. It is no longer used in any computation and that doesn't affect the end results. It will be removed in a future version." + deprecate("mask_feature", "1.0.0", deprecation_message, standard_warn=False) + # 1. Check inputs. Raise error if not correct + height = height or self.transformer.config.sample_size * self.vae_scale_factor + width = width or self.transformer.config.sample_size * self.vae_scale_factor + if use_resolution_binning: + if self.transformer.config.sample_size == 32: + aspect_ratio_bin = ASPECT_RATIO_256_BIN + elif self.transformer.config.sample_size == 64: + aspect_ratio_bin = ASPECT_RATIO_512_BIN + elif self.transformer.config.sample_size == 128: + aspect_ratio_bin = ASPECT_RATIO_1024_BIN + elif self.transformer.config.sample_size == 256: + aspect_ratio_bin = ASPECT_RATIO_2048_BIN + else: + raise ValueError("Invalid sample size") + orig_height, orig_width = height, width + height, width = self.classify_height_width_bin(height, width, ratios=aspect_ratio_bin) + + self.check_inputs( + prompt, + height, + width, + negative_prompt, + callback_steps, + prompt_embeds, + negative_prompt_embeds, + prompt_attention_mask, + negative_prompt_attention_mask, + ) + + # 2. Default height and width to transformer + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + device = self._execution_device # pylint: disable=protected-access + + # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + do_classifier_free_guidance = guidance_scale > 1.0 + + # 3. Encode input prompt + ( + prompt_embeds, + prompt_attention_mask, + negative_prompt_embeds, + negative_prompt_attention_mask, + ) = self.encode_prompt( + prompt, + do_classifier_free_guidance, + negative_prompt=negative_prompt, + num_images_per_prompt=num_images_per_prompt, + device=device, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + prompt_attention_mask=prompt_attention_mask, + negative_prompt_attention_mask=negative_prompt_attention_mask, + clean_caption=clean_caption, + max_sequence_length=max_sequence_length, + ) + if do_classifier_free_guidance: + prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds], dim=0) + prompt_attention_mask = torch.cat([negative_prompt_attention_mask, prompt_attention_mask], dim=0) + + # 4. Prepare timesteps + timesteps, num_inference_steps = retrieve_timesteps(self.scheduler, num_inference_steps, device, timesteps) + + # 5. Prepare latents. + latent_channels = self.transformer.config.in_channels + latents = self.prepare_latents( + batch_size * num_images_per_prompt, + latent_channels, + height, + width, + prompt_embeds.dtype, + device, + generator, + latents, + ) + + # 6. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 6.1 Prepare micro-conditions. + added_cond_kwargs = {"resolution": None, "aspect_ratio": None} + if self.transformer.config.sample_size == 128: + resolution = torch.tensor([height, width]).repeat(batch_size * num_images_per_prompt, 1) + aspect_ratio = torch.tensor([float(height / width)]).repeat(batch_size * num_images_per_prompt, 1) + resolution = resolution.to(dtype=prompt_embeds.dtype, device=device) + aspect_ratio = aspect_ratio.to(dtype=prompt_embeds.dtype, device=device) + + if do_classifier_free_guidance: + resolution = torch.cat([resolution, resolution], dim=0) + aspect_ratio = torch.cat([aspect_ratio, aspect_ratio], dim=0) + + added_cond_kwargs = {"resolution": resolution, "aspect_ratio": aspect_ratio} + + # 7. Denoising loop + num_warmup_steps = max(len(timesteps) - num_inference_steps * self.scheduler.order, 0) + + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + current_timestep = t + if not torch.is_tensor(current_timestep): + is_mps = latent_model_input.device.type == "mps" + if isinstance(current_timestep, float): + dtype = torch.float32 if is_mps else torch.float64 + else: + dtype = torch.int32 if is_mps else torch.int64 + current_timestep = torch.tensor([current_timestep], dtype=dtype, device=latent_model_input.device) + elif len(current_timestep.shape) == 0: + current_timestep = current_timestep[None].to(latent_model_input.device) + # broadcast to batch dimension in a way that's compatible with ONNX/Core ML + current_timestep = current_timestep.expand(latent_model_input.shape[0]) + + # predict noise model_output + noise_pred = self.transformer( + latent_model_input, + encoder_hidden_states=prompt_embeds, + encoder_attention_mask=prompt_attention_mask, + timestep=current_timestep, + added_cond_kwargs=added_cond_kwargs, + return_dict=False, + )[0] + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) + + # learned sigma + if self.transformer.config.out_channels // 2 == latent_channels: + noise_pred = noise_pred.chunk(2, dim=1)[0] + + # compute previous image: x_t -> x_t-1 + if num_inference_steps == 1: + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).pred_original_sample + else: + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs, return_dict=False)[0] + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): + progress_bar.update() + if callback is not None and i % callback_steps == 0: + step_idx = i // getattr(self.scheduler, "order", 1) + callback(step_idx, t, latents) + + if output_type != "latent": + image = self.vae.decode(latents / self.vae.config.scaling_factor, return_dict=False)[0] + if use_resolution_binning: + image = self.resize_and_crop_tensor(image, orig_width, orig_height) + else: + image = latents + + if output_type != "latent": + image = self.image_processor.postprocess(image, output_type=output_type) + + # Offload all models + self.maybe_free_model_hooks() + + if not return_dict: + return (image,) + + return ImagePipelineOutput(images=image) + + +class PixArtSigmaPipeline(PixArtAlphaPipeline): + r""" + tmp Pipeline for text-to-image generation using PixArt-Sigma. + """ + + def __init__( + self, + tokenizer: T5Tokenizer, + text_encoder: T5EncoderModel, + vae: AutoencoderKL, + transformer: Transformer2DModel, + scheduler: DPMSolverMultistepScheduler, + ): + super().__init__(tokenizer, text_encoder, vae, transformer, scheduler) + + self.register_modules( + tokenizer=tokenizer, text_encoder=text_encoder, vae=vae, transformer=transformer, scheduler=scheduler + ) + + self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) + self.image_processor = VaeImageProcessor(vae_scale_factor=self.vae_scale_factor) + + +def pixart_sigma_init_patched_inputs(self, norm_type): + assert self.config.sample_size is not None, "Transformer2DModel over patched input must provide sample_size" + + self.height = self.config.sample_size + self.width = self.config.sample_size + + self.patch_size = self.config.patch_size + interpolation_scale = ( + self.config.interpolation_scale + if self.config.interpolation_scale is not None + else max(self.config.sample_size // 64, 1) + ) + self.pos_embed = PatchEmbed( + height=self.config.sample_size, + width=self.config.sample_size, + patch_size=self.config.patch_size, + in_channels=self.in_channels, + embed_dim=self.inner_dim, + interpolation_scale=interpolation_scale, + ) + + self.transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock( + self.inner_dim, + self.config.num_attention_heads, + self.config.attention_head_dim, + dropout=self.config.dropout, + cross_attention_dim=self.config.cross_attention_dim, + activation_fn=self.config.activation_fn, + num_embeds_ada_norm=self.config.num_embeds_ada_norm, + attention_bias=self.config.attention_bias, + only_cross_attention=self.config.only_cross_attention, + double_self_attention=self.config.double_self_attention, + upcast_attention=self.config.upcast_attention, + norm_type=norm_type, + norm_elementwise_affine=self.config.norm_elementwise_affine, + norm_eps=self.config.norm_eps, + attention_type=self.config.attention_type, + ) + for _ in range(self.config.num_layers) + ] + ) + + if self.config.norm_type != "ada_norm_single": + self.norm_out = nn.LayerNorm(self.inner_dim, elementwise_affine=False, eps=1e-6) + self.proj_out_1 = nn.Linear(self.inner_dim, 2 * self.inner_dim) + self.proj_out_2 = nn.Linear( + self.inner_dim, self.config.patch_size * self.config.patch_size * self.out_channels + ) + elif self.config.norm_type == "ada_norm_single": + self.norm_out = nn.LayerNorm(self.inner_dim, elementwise_affine=False, eps=1e-6) + self.scale_shift_table = nn.Parameter(torch.randn(2, self.inner_dim) / self.inner_dim ** 0.5) + self.proj_out = nn.Linear( + self.inner_dim, self.config.patch_size * self.config.patch_size * self.out_channels + ) + + # PixArt-Sigma blocks. + self.adaln_single = None + self.use_additional_conditions = False + if self.config.norm_type == "ada_norm_single": + # TODO(Sayak, PVP) clean this, PixArt-Sigma doesn't use additional_conditions anymore + # additional conditions until we find better name + self.adaln_single = AdaLayerNormSingle( + self.inner_dim, use_additional_conditions=self.use_additional_conditions + ) + + self.caption_projection = None + if self.caption_channels is not None: + self.caption_projection = PixArtAlphaTextProjection( + in_features=self.caption_channels, hidden_size=self.inner_dim + ) + +def patch_pixart_sigma_transformer(): + setattr(Transformer2DModel, '_init_patched_inputs', pixart_sigma_init_patched_inputs) # noqa:B010 + transformer = Transformer2DModel.from_pretrained( + "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", + subfolder='transformer', + use_safetensors=True, + ) + return transformer diff --git a/modules/sd_models.py b/modules/sd_models.py index 57f6cfa6b..46155fa7c 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -602,14 +602,18 @@ def detect_pipeline(f: str, op: str = 'model', warning=True): if shared.backend == shared.Backend.ORIGINAL: warn(f'Model detected as SegMoE model, but attempting to load using backend=original: {op}={f} size={size} MB') guess = 'SegMoE' - if 'pixart' in f.lower(): + if 'pixart-xl' in f.lower(): if shared.backend == shared.Backend.ORIGINAL: warn(f'Model detected as PixArt Alpha model, but attempting to load using backend=original: {op}={f} size={size} MB') - guess = 'PixArt Alpha' + guess = 'PixArt-Alpha' if 'stable-cascade' in f.lower() or 'stablecascade' in f.lower(): if shared.backend == shared.Backend.ORIGINAL: warn(f'Model detected as Stable Cascade model, but attempting to load using backend=original: {op}={f} size={size} MB') guess = 'Stable Cascade' + if 'pixart_sigma' in f.lower(): + if shared.backend == shared.Backend.ORIGINAL: + warn(f'Model detected as PixArt-Sigma model, but attempting to load using backend=original: {op}={f} size={size} MB') + guess = 'PixArt-Sigma' # switch for specific variant if guess == 'Stable Diffusion' and 'inpaint' in f.lower(): guess = 'Stable Diffusion Inpaint' @@ -976,6 +980,20 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No if debug_load: errors.display(e, 'Load') return + elif model_type in ['PixArt-Sigma']: # forced pipeline + try: + from modules.sd_hijack_pixart import PixArtSigmaPipeline, patch_pixart_sigma_transformer + sd_model = PixArtSigmaPipeline.from_pretrained( + checkpoint_info.path, + transformer=patch_pixart_sigma_transformer(), + use_safetensors=True, + cache_dir=shared.opts.diffusers_dir, + **diffusers_load_config) + except Exception as e: + shared.log.error(f'Diffusers Failed loading {op}: {checkpoint_info.path} {e}') + if debug_load: + errors.display(e, 'Load') + return elif model_type is not None and pipeline is not None and 'ONNX' in model_type: # forced pipeline try: sd_model = pipeline.from_pretrained(checkpoint_info.path) diff --git a/modules/sd_vae_taesd.py b/modules/sd_vae_taesd.py index fc82acb9d..2a3c427ee 100644 --- a/modules/sd_vae_taesd.py +++ b/modules/sd_vae_taesd.py @@ -12,6 +12,7 @@ from modules import devices, paths taesd_models = { 'sd-decoder': None, 'sd-encoder': None, 'sdxl-decoder': None, 'sdxl-encoder': None } +previous_warnings = False def conv(n_in, n_out, **kwargs): @@ -142,12 +143,15 @@ def decode(latents): def encode(image): + global previous_warnings # pylint: disable=global-statement from modules import shared model_class = shared.sd_model_type if model_class == 'ldm': model_class = 'sd' if 'sd' not in model_class: - shared.log.warning(f'TAESD unsupported model type: {model_class}') + if not previous_warnings: + previous_warnings = True + shared.log.warning(f'TAESD unsupported model type: {model_class}') return Image.new('RGB', (8, 8), color = (0, 0, 0)) vae = taesd_models[f'{model_class}-encoder'] if vae is None: diff --git a/modules/shared_items.py b/modules/shared_items.py index dc7fa185e..3206a8d1a 100644 --- a/modules/shared_items.py +++ b/modules/shared_items.py @@ -53,7 +53,7 @@ def get_pipelines(): 'Stable Diffusion XL Inpaint': getattr(diffusers, 'StableDiffusionXLInpaintPipeline', None), 'Stable Diffusion XL Instruct': getattr(diffusers, 'StableDiffusionXLInstructPix2PixPipeline', None), 'Latent Consistency Model': getattr(diffusers, 'LatentConsistencyModelPipeline', None), - 'PixArt Alpha': getattr(diffusers, 'PixArtAlphaPipeline', None), + 'PixArt-Alpha': getattr(diffusers, 'PixArtAlphaPipeline', None), 'UniDiffuser': getattr(diffusers, 'UniDiffuserPipeline', None), 'Wuerstchen': getattr(diffusers, 'WuerstchenCombinedPipeline', None), 'Kandinsky 2.1': getattr(diffusers, 'KandinskyPipeline', None), @@ -78,6 +78,9 @@ def get_pipelines(): if hasattr(diffusers, 'StableCascadeCombinedPipeline'): pipelines['Stable Cascade'] = getattr(diffusers, 'StableCascadeCombinedPipeline', None) + from modules.sd_hijack_pixart import PixArtSigmaPipeline + pipelines['PixArt-Sigma'] = PixArtSigmaPipeline + for k, v in pipelines.items(): if k != 'Autodetect' and v is None: log.error(f'Not available: pipeline={k} diffusers={diffusers.__version__} path={diffusers.__file__}')