mirror of
https://git.datalinker.icu/comfyanonymous/ComfyUI
synced 2026-11-12 07:20:04 +08:00
Merge branch 'comfyanonymous:master' into master
This commit is contained in:
commit
703dff6eef
@ -7,6 +7,7 @@ import torch
|
|||||||
import torch.nn as nn
|
import torch.nn as nn
|
||||||
from .. import attention
|
from .. import attention
|
||||||
from einops import rearrange, repeat
|
from einops import rearrange, repeat
|
||||||
|
from .util import timestep_embedding
|
||||||
|
|
||||||
def default(x, y):
|
def default(x, y):
|
||||||
if x is not None:
|
if x is not None:
|
||||||
@ -230,34 +231,8 @@ class TimestepEmbedder(nn.Module):
|
|||||||
)
|
)
|
||||||
self.frequency_embedding_size = frequency_embedding_size
|
self.frequency_embedding_size = frequency_embedding_size
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def timestep_embedding(t, dim, max_period=10000):
|
|
||||||
"""
|
|
||||||
Create sinusoidal timestep embeddings.
|
|
||||||
:param t: a 1-D Tensor of N indices, one per batch element.
|
|
||||||
These may be fractional.
|
|
||||||
:param dim: the dimension of the output.
|
|
||||||
:param max_period: controls the minimum frequency of the embeddings.
|
|
||||||
:return: an (N, D) Tensor of positional embeddings.
|
|
||||||
"""
|
|
||||||
half = dim // 2
|
|
||||||
freqs = torch.exp(
|
|
||||||
-math.log(max_period)
|
|
||||||
* torch.arange(start=0, end=half, dtype=torch.float32, device=t.device)
|
|
||||||
/ half
|
|
||||||
)
|
|
||||||
args = t[:, None].float() * freqs[None]
|
|
||||||
embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1)
|
|
||||||
if dim % 2:
|
|
||||||
embedding = torch.cat(
|
|
||||||
[embedding, torch.zeros_like(embedding[:, :1])], dim=-1
|
|
||||||
)
|
|
||||||
if torch.is_floating_point(t):
|
|
||||||
embedding = embedding.to(dtype=t.dtype)
|
|
||||||
return embedding
|
|
||||||
|
|
||||||
def forward(self, t, dtype, **kwargs):
|
def forward(self, t, dtype, **kwargs):
|
||||||
t_freq = self.timestep_embedding(t, self.frequency_embedding_size).to(dtype)
|
t_freq = timestep_embedding(t, self.frequency_embedding_size).to(dtype)
|
||||||
t_emb = self.mlp(t_freq)
|
t_emb = self.mlp(t_freq)
|
||||||
return t_emb
|
return t_emb
|
||||||
|
|
||||||
|
|||||||
@ -261,13 +261,22 @@ def model_config_from_unet(state_dict, unet_key_prefix, use_base_if_no_match=Fal
|
|||||||
return model_config
|
return model_config
|
||||||
|
|
||||||
def unet_prefix_from_state_dict(state_dict):
|
def unet_prefix_from_state_dict(state_dict):
|
||||||
if "model.model.postprocess_conv.weight" in state_dict: #audio models
|
candidates = ["model.diffusion_model.", #ldm/sgm models
|
||||||
unet_key_prefix = "model.model."
|
"model.model.", #audio models
|
||||||
elif "model.double_layers.0.attn.w1q.weight" in state_dict: #aura flow
|
]
|
||||||
unet_key_prefix = "model."
|
counts = {k: 0 for k in candidates}
|
||||||
|
for k in state_dict:
|
||||||
|
for c in candidates:
|
||||||
|
if k.startswith(c):
|
||||||
|
counts[c] += 1
|
||||||
|
break
|
||||||
|
|
||||||
|
top = max(counts, key=counts.get)
|
||||||
|
if counts[top] > 5:
|
||||||
|
return top
|
||||||
else:
|
else:
|
||||||
unet_key_prefix = "model.diffusion_model."
|
return "model." #aura flow and others
|
||||||
return unet_key_prefix
|
|
||||||
|
|
||||||
def convert_config(unet_config):
|
def convert_config(unet_config):
|
||||||
new_config = unet_config.copy()
|
new_config = unet_config.copy()
|
||||||
|
|||||||
@ -1,14 +1,18 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
class SPieceTokenizer:
|
class SPieceTokenizer:
|
||||||
|
add_eos = True
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_pretrained(path):
|
def from_pretrained(path):
|
||||||
return SPieceTokenizer(path)
|
return SPieceTokenizer(path)
|
||||||
|
|
||||||
def __init__(self, tokenizer_path):
|
def __init__(self, tokenizer_path):
|
||||||
import sentencepiece
|
import sentencepiece
|
||||||
self.tokenizer = sentencepiece.SentencePieceProcessor(model_file=tokenizer_path)
|
if isinstance(tokenizer_path, bytes):
|
||||||
self.end = self.tokenizer.eos_id()
|
self.tokenizer = sentencepiece.SentencePieceProcessor(model_proto=tokenizer_path, add_eos=self.add_eos)
|
||||||
|
else:
|
||||||
|
self.tokenizer = sentencepiece.SentencePieceProcessor(model_file=tokenizer_path, add_eos=self.add_eos)
|
||||||
|
|
||||||
def get_vocab(self):
|
def get_vocab(self):
|
||||||
out = {}
|
out = {}
|
||||||
@ -18,5 +22,4 @@ class SPieceTokenizer:
|
|||||||
|
|
||||||
def __call__(self, string):
|
def __call__(self, string):
|
||||||
out = self.tokenizer.encode(string)
|
out = self.tokenizer.encode(string)
|
||||||
out += [self.end]
|
|
||||||
return {"input_ids": out}
|
return {"input_ids": out}
|
||||||
|
|||||||
@ -223,7 +223,7 @@ class T5(torch.nn.Module):
|
|||||||
self.num_layers = config_dict["num_layers"]
|
self.num_layers = config_dict["num_layers"]
|
||||||
model_dim = config_dict["d_model"]
|
model_dim = config_dict["d_model"]
|
||||||
|
|
||||||
self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], config_dict["model_type"] == "t5", dtype, device, operations)
|
self.encoder = T5Stack(self.num_layers, model_dim, model_dim, config_dict["d_ff"], config_dict["dense_act_fn"], config_dict["is_gated_act"], config_dict["num_heads"], config_dict["model_type"] != "umt5", dtype, device, operations)
|
||||||
self.dtype = dtype
|
self.dtype = dtype
|
||||||
self.shared = torch.nn.Embedding(config_dict["vocab_size"], model_dim, device=device)
|
self.shared = torch.nn.Embedding(config_dict["vocab_size"], model_dim, device=device)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user