| |
|
| | import torch
|
| | import torch.nn as nn
|
| | import torch.nn.functional as F
|
| |
|
| | from diffusers.models.lora import LoRALinearLayer
|
| |
|
| |
|
| | class LoRAAttnProcessor(nn.Module):
|
| | r"""
|
| | Default processor for performing attention-related computations.
|
| | """
|
| |
|
| | def __init__(
|
| | self,
|
| | hidden_size=None,
|
| | cross_attention_dim=None,
|
| | rank=4,
|
| | network_alpha=None,
|
| | lora_scale=1.0,
|
| | ):
|
| | super().__init__()
|
| |
|
| | self.rank = rank
|
| | self.lora_scale = lora_scale
|
| |
|
| | self.to_q_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_k_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_v_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_out_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| |
|
| | def __call__(
|
| | self,
|
| | attn,
|
| | hidden_states,
|
| | encoder_hidden_states=None,
|
| | attention_mask=None,
|
| | temb=None,
|
| | *args,
|
| | **kwargs,
|
| | ):
|
| | residual = hidden_states
|
| |
|
| | if attn.spatial_norm is not None:
|
| | hidden_states = attn.spatial_norm(hidden_states, temb)
|
| |
|
| | input_ndim = hidden_states.ndim
|
| |
|
| | if input_ndim == 4:
|
| | batch_size, channel, height, width = hidden_states.shape
|
| | hidden_states = hidden_states.view(batch_size, channel, height * width).transpose(1, 2)
|
| |
|
| | batch_size, sequence_length, _ = (
|
| | hidden_states.shape if encoder_hidden_states is None else encoder_hidden_states.shape
|
| | )
|
| | attention_mask = attn.prepare_attention_mask(attention_mask, sequence_length, batch_size)
|
| |
|
| | if attn.group_norm is not None:
|
| | hidden_states = attn.group_norm(hidden_states.transpose(1, 2)).transpose(1, 2)
|
| |
|
| | query = attn.to_q(hidden_states) + self.lora_scale * self.to_q_lora(hidden_states)
|
| |
|
| | if encoder_hidden_states is None:
|
| | encoder_hidden_states = hidden_states
|
| | elif attn.norm_cross:
|
| | encoder_hidden_states = attn.norm_encoder_hidden_states(encoder_hidden_states)
|
| |
|
| | key = attn.to_k(encoder_hidden_states) + self.lora_scale * self.to_k_lora(encoder_hidden_states)
|
| | value = attn.to_v(encoder_hidden_states) + self.lora_scale * self.to_v_lora(encoder_hidden_states)
|
| |
|
| | query = attn.head_to_batch_dim(query)
|
| | key = attn.head_to_batch_dim(key)
|
| | value = attn.head_to_batch_dim(value)
|
| |
|
| | attention_probs = attn.get_attention_scores(query, key, attention_mask)
|
| | hidden_states = torch.bmm(attention_probs, value)
|
| | hidden_states = attn.batch_to_head_dim(hidden_states)
|
| |
|
| |
|
| | hidden_states = attn.to_out[0](hidden_states) + self.lora_scale * self.to_out_lora(hidden_states)
|
| |
|
| | hidden_states = attn.to_out[1](hidden_states)
|
| |
|
| | if input_ndim == 4:
|
| | hidden_states = hidden_states.transpose(-1, -2).reshape(batch_size, channel, height, width)
|
| |
|
| | if attn.residual_connection:
|
| | hidden_states = hidden_states + residual
|
| |
|
| | hidden_states = hidden_states / attn.rescale_output_factor
|
| |
|
| | return hidden_states
|
| |
|
| |
|
| | class LoRAIPAttnProcessor(nn.Module):
|
| | r"""
|
| | Attention processor for IP-Adapater.
|
| | Args:
|
| | hidden_size (`int`):
|
| | The hidden size of the attention layer.
|
| | cross_attention_dim (`int`):
|
| | The number of channels in the `encoder_hidden_states`.
|
| | scale (`float`, defaults to 1.0):
|
| | the weight scale of image prompt.
|
| | num_tokens (`int`, defaults to 4 when do ip_adapter_plus it should be 16):
|
| | The context length of the image features.
|
| | """
|
| |
|
| | def __init__(self, hidden_size, cross_attention_dim=None, rank=4, network_alpha=None, lora_scale=1.0, scale=1.0, num_tokens=4):
|
| | super().__init__()
|
| |
|
| | self.rank = rank
|
| | self.lora_scale = lora_scale
|
| |
|
| | self.to_q_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_k_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_v_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_out_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| |
|
| | self.hidden_size = hidden_size
|
| | self.cross_attention_dim = cross_attention_dim
|
| | self.scale = scale
|
| | self.num_tokens = num_tokens
|
| |
|
| | self.to_k_ip = nn.Linear(cross_attention_dim or hidden_size, hidden_size, bias=False)
|
| | self.to_v_ip = nn.Linear(cross_attention_dim or hidden_size, hidden_size, bias=False)
|
| |
|
| | def __call__(
|
| | self,
|
| | attn,
|
| | hidden_states,
|
| | encoder_hidden_states=None,
|
| | attention_mask=None,
|
| | temb=None,
|
| | *args,
|
| | **kwargs,
|
| | ):
|
| | residual = hidden_states
|
| |
|
| | if attn.spatial_norm is not None:
|
| | hidden_states = attn.spatial_norm(hidden_states, temb)
|
| |
|
| | input_ndim = hidden_states.ndim
|
| |
|
| | if input_ndim == 4:
|
| | batch_size, channel, height, width = hidden_states.shape
|
| | hidden_states = hidden_states.view(batch_size, channel, height * width).transpose(1, 2)
|
| |
|
| | batch_size, sequence_length, _ = (
|
| | hidden_states.shape if encoder_hidden_states is None else encoder_hidden_states.shape
|
| | )
|
| | attention_mask = attn.prepare_attention_mask(attention_mask, sequence_length, batch_size)
|
| |
|
| | if attn.group_norm is not None:
|
| | hidden_states = attn.group_norm(hidden_states.transpose(1, 2)).transpose(1, 2)
|
| |
|
| | query = attn.to_q(hidden_states) + self.lora_scale * self.to_q_lora(hidden_states)
|
| |
|
| | if encoder_hidden_states is None:
|
| | encoder_hidden_states = hidden_states
|
| | else:
|
| |
|
| | end_pos = encoder_hidden_states.shape[1] - self.num_tokens
|
| | encoder_hidden_states, ip_hidden_states = (
|
| | encoder_hidden_states[:, :end_pos, :],
|
| | encoder_hidden_states[:, end_pos:, :],
|
| | )
|
| | if attn.norm_cross:
|
| | encoder_hidden_states = attn.norm_encoder_hidden_states(encoder_hidden_states)
|
| |
|
| | key = attn.to_k(encoder_hidden_states) + self.lora_scale * self.to_k_lora(encoder_hidden_states)
|
| | value = attn.to_v(encoder_hidden_states) + self.lora_scale * self.to_v_lora(encoder_hidden_states)
|
| |
|
| | query = attn.head_to_batch_dim(query)
|
| | key = attn.head_to_batch_dim(key)
|
| | value = attn.head_to_batch_dim(value)
|
| |
|
| | attention_probs = attn.get_attention_scores(query, key, attention_mask)
|
| | hidden_states = torch.bmm(attention_probs, value)
|
| | hidden_states = attn.batch_to_head_dim(hidden_states)
|
| |
|
| |
|
| | ip_key = self.to_k_ip(ip_hidden_states)
|
| | ip_value = self.to_v_ip(ip_hidden_states)
|
| |
|
| | ip_key = attn.head_to_batch_dim(ip_key)
|
| | ip_value = attn.head_to_batch_dim(ip_value)
|
| |
|
| | ip_attention_probs = attn.get_attention_scores(query, ip_key, None)
|
| | self.attn_map = ip_attention_probs
|
| | ip_hidden_states = torch.bmm(ip_attention_probs, ip_value)
|
| | ip_hidden_states = attn.batch_to_head_dim(ip_hidden_states)
|
| |
|
| | hidden_states = hidden_states + self.scale * ip_hidden_states
|
| |
|
| |
|
| | hidden_states = attn.to_out[0](hidden_states) + self.lora_scale * self.to_out_lora(hidden_states)
|
| |
|
| | hidden_states = attn.to_out[1](hidden_states)
|
| |
|
| | if input_ndim == 4:
|
| | hidden_states = hidden_states.transpose(-1, -2).reshape(batch_size, channel, height, width)
|
| |
|
| | if attn.residual_connection:
|
| | hidden_states = hidden_states + residual
|
| |
|
| | hidden_states = hidden_states / attn.rescale_output_factor
|
| |
|
| | return hidden_states
|
| |
|
| |
|
| | class LoRAAttnProcessor2_0(nn.Module):
|
| |
|
| | r"""
|
| | Default processor for performing attention-related computations.
|
| | """
|
| |
|
| | def __init__(
|
| | self,
|
| | hidden_size=None,
|
| | cross_attention_dim=None,
|
| | rank=4,
|
| | network_alpha=None,
|
| | lora_scale=1.0,
|
| | ):
|
| | super().__init__()
|
| |
|
| | self.rank = rank
|
| | self.lora_scale = lora_scale
|
| |
|
| | self.to_q_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_k_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_v_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_out_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| |
|
| | def __call__(
|
| | self,
|
| | attn,
|
| | hidden_states,
|
| | encoder_hidden_states=None,
|
| | attention_mask=None,
|
| | temb=None,
|
| | *args,
|
| | **kwargs,
|
| | ):
|
| | residual = hidden_states
|
| |
|
| | if attn.spatial_norm is not None:
|
| | hidden_states = attn.spatial_norm(hidden_states, temb)
|
| |
|
| | input_ndim = hidden_states.ndim
|
| |
|
| | if input_ndim == 4:
|
| | batch_size, channel, height, width = hidden_states.shape
|
| | hidden_states = hidden_states.view(batch_size, channel, height * width).transpose(1, 2)
|
| |
|
| | batch_size, sequence_length, _ = (
|
| | hidden_states.shape if encoder_hidden_states is None else encoder_hidden_states.shape
|
| | )
|
| | attention_mask = attn.prepare_attention_mask(attention_mask, sequence_length, batch_size)
|
| |
|
| | if attn.group_norm is not None:
|
| | hidden_states = attn.group_norm(hidden_states.transpose(1, 2)).transpose(1, 2)
|
| |
|
| | query = attn.to_q(hidden_states) + self.lora_scale * self.to_q_lora(hidden_states)
|
| |
|
| | if encoder_hidden_states is None:
|
| | encoder_hidden_states = hidden_states
|
| | elif attn.norm_cross:
|
| | encoder_hidden_states = attn.norm_encoder_hidden_states(encoder_hidden_states)
|
| |
|
| | key = attn.to_k(encoder_hidden_states) + self.lora_scale * self.to_k_lora(encoder_hidden_states)
|
| | value = attn.to_v(encoder_hidden_states) + self.lora_scale * self.to_v_lora(encoder_hidden_states)
|
| |
|
| | inner_dim = key.shape[-1]
|
| | head_dim = inner_dim // attn.heads
|
| |
|
| | query = query.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| |
|
| | key = key.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| | value = value.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| |
|
| |
|
| |
|
| | hidden_states = F.scaled_dot_product_attention(
|
| | query, key, value, attn_mask=attention_mask, dropout_p=0.0, is_causal=False
|
| | )
|
| |
|
| | hidden_states = hidden_states.transpose(1, 2).reshape(batch_size, -1, attn.heads * head_dim)
|
| | hidden_states = hidden_states.to(query.dtype)
|
| |
|
| |
|
| | hidden_states = attn.to_out[0](hidden_states) + self.lora_scale * self.to_out_lora(hidden_states)
|
| |
|
| | hidden_states = attn.to_out[1](hidden_states)
|
| |
|
| | if input_ndim == 4:
|
| | hidden_states = hidden_states.transpose(-1, -2).reshape(batch_size, channel, height, width)
|
| |
|
| | if attn.residual_connection:
|
| | hidden_states = hidden_states + residual
|
| |
|
| | hidden_states = hidden_states / attn.rescale_output_factor
|
| |
|
| | return hidden_states
|
| |
|
| |
|
| | class LoRAIPAttnProcessor2_0(nn.Module):
|
| | r"""
|
| | Processor for implementing the LoRA attention mechanism.
|
| |
|
| | Args:
|
| | hidden_size (`int`, *optional*):
|
| | The hidden size of the attention layer.
|
| | cross_attention_dim (`int`, *optional*):
|
| | The number of channels in the `encoder_hidden_states`.
|
| | rank (`int`, defaults to 4):
|
| | The dimension of the LoRA update matrices.
|
| | network_alpha (`int`, *optional*):
|
| | Equivalent to `alpha` but it's usage is specific to Kohya (A1111) style LoRAs.
|
| | """
|
| |
|
| | def __init__(self, hidden_size, cross_attention_dim=None, rank=4, network_alpha=None, lora_scale=1.0, scale=1.0, num_tokens=4):
|
| | super().__init__()
|
| |
|
| | self.rank = rank
|
| | self.lora_scale = lora_scale
|
| | self.num_tokens = num_tokens
|
| |
|
| | self.to_q_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_k_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_v_lora = LoRALinearLayer(cross_attention_dim or hidden_size, hidden_size, rank, network_alpha)
|
| | self.to_out_lora = LoRALinearLayer(hidden_size, hidden_size, rank, network_alpha)
|
| |
|
| |
|
| | self.hidden_size = hidden_size
|
| | self.cross_attention_dim = cross_attention_dim
|
| | self.scale = scale
|
| |
|
| | self.to_k_ip = nn.Linear(cross_attention_dim or hidden_size, hidden_size, bias=False)
|
| | self.to_v_ip = nn.Linear(cross_attention_dim or hidden_size, hidden_size, bias=False)
|
| |
|
| | def __call__(
|
| | self, attn, hidden_states, encoder_hidden_states=None, attention_mask=None, scale=1.0, temb=None, *args, **kwargs,
|
| | ):
|
| | residual = hidden_states
|
| |
|
| | if attn.spatial_norm is not None:
|
| | hidden_states = attn.spatial_norm(hidden_states, temb)
|
| |
|
| | input_ndim = hidden_states.ndim
|
| |
|
| | if input_ndim == 4:
|
| | batch_size, channel, height, width = hidden_states.shape
|
| | hidden_states = hidden_states.view(batch_size, channel, height * width).transpose(1, 2)
|
| |
|
| | batch_size, sequence_length, _ = (
|
| | hidden_states.shape if encoder_hidden_states is None else encoder_hidden_states.shape
|
| | )
|
| | attention_mask = attn.prepare_attention_mask(attention_mask, sequence_length, batch_size)
|
| |
|
| | if attn.group_norm is not None:
|
| | hidden_states = attn.group_norm(hidden_states.transpose(1, 2)).transpose(1, 2)
|
| |
|
| | query = attn.to_q(hidden_states) + self.lora_scale * self.to_q_lora(hidden_states)
|
| |
|
| |
|
| | if encoder_hidden_states is None:
|
| | encoder_hidden_states = hidden_states
|
| | else:
|
| |
|
| | end_pos = encoder_hidden_states.shape[1] - self.num_tokens
|
| | encoder_hidden_states, ip_hidden_states = (
|
| | encoder_hidden_states[:, :end_pos, :],
|
| | encoder_hidden_states[:, end_pos:, :],
|
| | )
|
| | if attn.norm_cross:
|
| | encoder_hidden_states = attn.norm_encoder_hidden_states(encoder_hidden_states)
|
| |
|
| |
|
| | key = attn.to_k(encoder_hidden_states) + self.lora_scale * self.to_k_lora(encoder_hidden_states)
|
| | value = attn.to_v(encoder_hidden_states) + self.lora_scale * self.to_v_lora(encoder_hidden_states)
|
| |
|
| | inner_dim = key.shape[-1]
|
| | head_dim = inner_dim // attn.heads
|
| |
|
| | query = query.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| |
|
| | key = key.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| | value = value.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| |
|
| |
|
| |
|
| | hidden_states = F.scaled_dot_product_attention(
|
| | query, key, value, attn_mask=attention_mask, dropout_p=0.0, is_causal=False
|
| | )
|
| |
|
| | hidden_states = hidden_states.transpose(1, 2).reshape(batch_size, -1, attn.heads * head_dim)
|
| | hidden_states = hidden_states.to(query.dtype)
|
| |
|
| |
|
| | ip_key = self.to_k_ip(ip_hidden_states)
|
| | ip_value = self.to_v_ip(ip_hidden_states)
|
| |
|
| | ip_key = ip_key.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| | ip_value = ip_value.view(batch_size, -1, attn.heads, head_dim).transpose(1, 2)
|
| |
|
| |
|
| |
|
| | ip_hidden_states = F.scaled_dot_product_attention(
|
| | query, ip_key, ip_value, attn_mask=None, dropout_p=0.0, is_causal=False
|
| | )
|
| |
|
| |
|
| | ip_hidden_states = ip_hidden_states.transpose(1, 2).reshape(batch_size, -1, attn.heads * head_dim)
|
| | ip_hidden_states = ip_hidden_states.to(query.dtype)
|
| |
|
| | hidden_states = hidden_states + self.scale * ip_hidden_states
|
| |
|
| |
|
| | hidden_states = attn.to_out[0](hidden_states) + self.lora_scale * self.to_out_lora(hidden_states)
|
| |
|
| | hidden_states = attn.to_out[1](hidden_states)
|
| |
|
| | if input_ndim == 4:
|
| | hidden_states = hidden_states.transpose(-1, -2).reshape(batch_size, channel, height, width)
|
| |
|
| | if attn.residual_connection:
|
| | hidden_states = hidden_states + residual
|
| |
|
| | hidden_states = hidden_states / attn.rescale_output_factor
|
| |
|
| | return hidden_states
|
| |
|