Diffusers documentation
Textual Inversion
Textual Inversion
Textual Inversion — это метод обучения для персонализации моделей путём обучения новых текстовых эмбеддингов на основе нескольких примеров изображений. Файл, полученный в результате обучения, крайне мал (несколько КБ), а новые эмбеддинги можно загрузить в текстовый энкодер.
TextualInversionLoaderMixin предоставляет функцию для загрузки эмбеддингов Textual Inversion из Diffusers и Automatic1111 в текстовый энкодер, а также для загрузки специального токена, активирующего эти эмбеддинги.
Чтобы узнать больше о том, как загружать эмбеддинги Textual Inversion, см. руководство по загрузке Textual Inversion.
TextualInversionLoaderMixin
Загрузите токены и эмбеддинги Textual Inversion в токенизатор и текстовый энкодер.
load_textual_inversion
< source >( pretrained_model_name_or_path: str | list[str] | dict[str, torch.Tensor] | list[dict[str, torch.Tensor]]token: str | list[str] | None = Nonetokenizer: 'PreTrainedTokenizer' | None = Nonetext_encoder: 'PreTrainedModel' | None = None**kwargs )
Параметры
- pretrained_model_name_or_path (
strилиos.PathLikeилиlist[str or os.PathLike]илиDictилиlist[Dict]) — Может быть одним из следующих вариантов или списком таких вариантов:- Строка, идентификатор модели (например,
sd-concepts-library/low-poly-hd-logos-icons) предобученной модели, размещенной на Hub. - Путь к каталогу (например,
./my_text_inversion_directory/), содержащему веса текстовой инверсии. - Путь к файлу (например,
./my_text_inversions.pt), содержащему веса текстовой инверсии. - Словарь состояния torch.
- Строка, идентификатор модели (например,
- token (
strилиlist[str], необязательный) — Переопределяет токен, используемый для весов текстовой инверсии. Еслиpretrained_model_name_or_pathявляется списком, тоtokenтакже должен быть списком той же длины. - text_encoder (CLIPTextModel, необязательный) — Замороженный текстовый энкодер (clip-vit-large-patch14). Если не указан, функция возьмет self.tokenizer.
- tokenizer (CLIPTokenizer, необязательный) —
CLIPTokenizerдля токенизации текста. Если не указан, функция использует self.tokenizer. - weight_name (
str, необязательный) — Имя файла с кастомными весами. Это следует использовать, когда:- Сохранённый файл текстовой инверсии находится в формате 🤗 Diffusers, но был сохранён под конкретным именем весов, например
text_inv.bin. - Сохранённый файл текстовой инверсии находится в формате Automatic1111.
- Сохранённый файл текстовой инверсии находится в формате 🤗 Diffusers, но был сохранён под конкретным именем весов, например
- cache_dir (
str | os.PathLike, необязательный) — Путь к каталогу, в котором кэшируется загруженная конфигурация предобученной модели, если стандартный кэш не используется. - force_download (
bool, необязательный, по умолчаниюFalse) — Следует ли принудительно (пере)скачивать веса модели и файлы конфигурации, игнорируя кэшированные версии, если они существуют. - proxies (
dict[str, str], необязательный) — Словарь прокси-серверов, используемых по протоколу или конечной точке, например,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}. Прокси применяются при каждом запросе. - local_files_only (
bool, необязательный, по умолчаниюFalse) — Определяет, следует ли загружать только локальные веса модели и файлы конфигурации. Если установлено значениеTrue, модель не будет скачана с Hub. - hf_token (
strили bool, необязательный) — Токен, используемый в качестве HTTP bearer-авторизации для удалённых файлов. ЕслиTrue, используется токен, сгенерированный командойdiffusers-cli login(сохранённый в~/.huggingface). - revision (
str, необязательный, по умолчанию"main") — Конкретная версия модели, которую следует использовать. Может быть именем ветки, именем тега, идентификатором коммита или любым другим идентификатором, поддерживаемым Git. - subfolder (
str, необязательный, по умолчанию"") — Расположение подпапки файла модели внутри более крупного репозитория моделей на Hub или локально. - mirror (
str, optional) — Источник зеркала для решения проблем с доступностью при загрузке модели в Китае. Мы не гарантируем актуальность или безопасность источника, поэтому за дополнительной информацией обращайтесь на сайт зеркала.
Загрузите эмбеддинги Textual Inversion в текстовый энкодер StableDiffusionPipeline (поддерживаются форматы 🤗 Diffusers и Automatic1111).
Пример:
Для загрузки вектора встраивания Textual Inversion в формате 🤗 Diffusers:
from diffusers import StableDiffusionPipeline
import torch
model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")
pipe.load_textual_inversion("sd-concepts-library/cat-toy")
prompt = "A <cat-toy> backpack"
image = pipe(prompt, num_inference_steps=50).images[0]
image.save("cat-backpack.png")Чтобы загрузить вектор встраивания Textual Inversion в формате Automatic1111, сначала скачайте вектор (например, с civitAI), а затем загрузите его
локально:
from diffusers import StableDiffusionPipeline
import torch
model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to("cuda")
pipe.load_textual_inversion("./charturnerv2.pt", token="charturnerv2")
prompt = "charturnerv2, multiple views of the same character in the same outfit, a character turnaround of a woman wearing a black jacket and red shirt, best quality, intricate details."
image = pipe(prompt, num_inference_steps=50).images[0]
image.save("character.png")maybe_convert_prompt
< source >( prompt: str | list[str]tokenizer: 'PreTrainedTokenizer' ) → str or list of str
Обрабатывает промпты, содержащие специальный токен, соответствующий многовекторному текстовому инверсионному эмбеддингу, который должен быть заменён несколькими специальными токенами, каждый из которых соответствует одному из векторов. Если в промпте нет токена текстовой инверсии или если токен текстовой инверсии представляет собой одномерный вектор, входной промпт возвращается без изменений.
unload_textual_inversion
< source >( tokens: str | list[str] | None = Nonetokenizer: 'PreTrainedTokenizer' | None = Nonetext_encoder: 'PreTrainedModel' | None = None )
Разгрузите эмбеддинги Textual Inversion из текстового энкодера StableDiffusionPipeline
Пример:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5")
# Example 1
pipeline.load_textual_inversion("sd-concepts-library/gta5-artwork")
pipeline.load_textual_inversion("sd-concepts-library/moeb-style")
# Remove all token embeddings
pipeline.unload_textual_inversion()
# Example 2
pipeline.load_textual_inversion("sd-concepts-library/moeb-style")
pipeline.load_textual_inversion("sd-concepts-library/gta5-artwork")
# Remove just one token
pipeline.unload_textual_inversion("<moe-bius>")
# Example 3: unload from SDXL
pipeline = AutoPipelineForText2Image.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0")
embedding_path = hf_hub_download(
repo_id="linoyts/web_y2k", filename="web_y2k_emb.safetensors", repo_type="model"
)
# load embeddings to the text encoders
state_dict = load_file(embedding_path)
# load embeddings of text_encoder 1 (CLIP ViT-L/14)
pipeline.load_textual_inversion(
state_dict["clip_l"],
tokens=["<s0>", "<s1>"],
text_encoder=pipeline.text_encoder,
tokenizer=pipeline.tokenizer,
)
# load embeddings of text_encoder 2 (CLIP ViT-G/14)
pipeline.load_textual_inversion(
state_dict["clip_g"],
tokens=["<s0>", "<s1>"],
text_encoder=pipeline.text_encoder_2,
tokenizer=pipeline.tokenizer_2,
)
# Unload explicitly from both text encoders and tokenizers
pipeline.unload_textual_inversion(
tokens=["<s0>", "<s1>"], text_encoder=pipeline.text_encoder, tokenizer=pipeline.tokenizer
)
pipeline.unload_textual_inversion(
tokens=["<s0>", "<s1>"], text_encoder=pipeline.text_encoder_2, tokenizer=pipeline.tokenizer_2
)