|
|
|
import torch |
|
|
|
from . import sd_hijack_clip, devices |
|
from .shared import opts |
|
|
|
|
|
|
|
|
|
class FrozenOpenCLIPEmbedderWithCustomWords(sd_hijack_clip.FrozenCLIPEmbedderWithCustomWordsBase): |
|
def __init__(self, wrapped, hijack): |
|
super().__init__(wrapped, hijack) |
|
self.tokenizer = tokenizer = self.wrapped.tokenizer |
|
|
|
self.comma_token = [v for k, v in tokenizer.encoder.items() if k == ',</w>'][0] |
|
|
|
|
|
self.id_start = tokenizer.bos_token_id |
|
self.id_end = tokenizer.eos_token_id |
|
self.id_pad = 0 |
|
|
|
def tokenize(self, texts): |
|
assert not opts.use_old_emphasis_implementation, 'Old emphasis implementation not supported for Open Clip' |
|
|
|
tokenized = [self.tokenizer.encode(text) for text in texts] |
|
|
|
return tokenized |
|
|
|
def encode_with_transformers(self, tokens): |
|
|
|
z = self.wrapped.encode_with_transformer(tokens) |
|
|
|
return z |
|
|
|
def encode_embedding_init_text(self, init_text, nvpt): |
|
ids = self.tokenizer.encode(init_text) |
|
ids = torch.asarray([ids], device=devices.device, dtype=torch.int) |
|
embedded = self.wrapped.model.token_embedding.wrapped(ids).squeeze(0) |
|
|
|
return embedded |
|
|
|
|
|
class FrozenOpenCLIPEmbedder2WithCustomWords(sd_hijack_clip.FrozenCLIPEmbedderWithCustomWordsBase): |
|
def __init__(self, wrapped, hijack): |
|
super().__init__(wrapped, hijack) |
|
self.tokenizer = tokenizer = self.wrapped.tokenizer |
|
|
|
self.comma_token = [v for k, v in tokenizer.encoder.items() if k == ',</w>'][0] |
|
|
|
|
|
self.id_start = tokenizer.bos_token_id |
|
self.id_end = tokenizer.eos_token_id |
|
self.id_pad = 0 |
|
|
|
def tokenize(self, texts): |
|
assert not opts.use_old_emphasis_implementation, 'Old emphasis implementation not supported for Open Clip' |
|
|
|
tokenized = [self.tokenizer.encode(text) for text in texts] |
|
|
|
return tokenized |
|
|
|
def encode_with_transformers(self, tokens): |
|
d = self.wrapped.encode_with_transformer(tokens) |
|
z = d[self.wrapped.layer] |
|
|
|
pooled = d.get("pooled") |
|
if pooled is not None: |
|
z.pooled = pooled |
|
|
|
return z |
|
|
|
def encode_embedding_init_text(self, init_text, nvpt): |
|
ids = self.tokenizer.encode(init_text) |
|
ids = torch.asarray([ids], device=devices.device, dtype=torch.int) |
|
embedded = self.wrapped.model.token_embedding.wrapped(ids.to(self.wrapped.model.token_embedding.wrapped.weight.device)).squeeze(0) |
|
|
|
return embedded |
|
|