Этот репозиторий предоставляет самый простой учебный код для исследователей AIGC для использования LORA всего за несколько строк. Используя это руководство, вы можете легко играть с любой моделью LORA из активных сообществ, таких как HuggingFace и Cititai.
Теперь мы также поддерживаем Controlnet-For-Diffusers, T2-Adapter-For-Diffusers.
Microsoft разработала адаптация моделей крупных языков (LORA) для уменьшения количества обучаемых параметров путем изучения пар матриц по сбору рангов, в то же время замораживая исходные веса. Лора пытается точно настроить «остаток» модели вместо всей модели: т.е. тренировать
Где
Этот тренировочный трюк весьма полезен для настроек Fune-Tuning индивидуальных моделей на большой общей базовой модели. Различные модели текста к изображениям были разработаны на вершине официальной стабильной диффузии. Теперь, с Lora, вы можете эффективно обучить свою собственную модель с гораздо меньшим количеством ресурсов.
Safetensors-это новый простой формат для безопасного хранения тензоров (в отличие от Pickle), выпущенного обнимающим лицом, и это все еще быстро (нулевая копия). Для своей эффективности многие стабильные диффузионные модели, особенно модели LORA, выпускаются в формате Safetensors. Вы можете найти больше его преимуществ от Huggingface/Safetensors и установить его с помощью PIP установки.
pip install safetensorsВ этом уроке мы показываем, чтобы загрузить или вставить предварительно обученную LORA в рамку диффузоров. Многие интересные проекты можно найти в Huggingface и Cititai, но в основном в рамках стабильной диффузии-Webui, что не удобно для продвинутых разработчиков. Мы очень мотивированы CloneOfsimo/Lora о загрузке, слиянии и интерполяции обученных лора. В основном мы обсуждаем модели в формате Safetensors, который не очень совместим с диффузорами.
Полная модель включает в себя все необходимые модули (базовая модель с или без слоев LORA), они обычно хранятся в формате .CKPT или .Safetensors. Мы предоставляем два примера ниже, чтобы показать, как использовать под рукой.
Stabilityai/Stable-Diffusion-2-1 от Huggingface.
Dreamshaper от Civitai.
Вы можете скачать только файл .ckpt или .safetensors. Хотя диффузоры не поддерживают загрузку их напрямую, они обеспечивают конвертирующий сценарий. Сначала скачать диффузоры на локальные.
git clone https://github.com/huggingface/diffusers cd ./diffusers
# assume you have downloaded xxx.safetensors, it will out save_dir in diffusers format.
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.safetensors --dump_path save_dir --from_safetensors
# assume you have downloaded xxx.ckpt, it will out save_dir in diffusers format.
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.ckpt --dump_path save_dirЗатем вы можете загрузить модель
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained(save_dir,torch_dtype=torch.float32)На данный момент диффузоры не могут поддерживать вес нагрузки в Лоре (обычно в формате .safetensor). Здесь мы показываем наши попытки в неэлегантном стиле. Мы также приведем один пример.
Обратите внимание, что размер файла намного меньше, чем полная модель, так как он содержит только дополнительные веса Lora. В случае, мы должны загрузить базовую модель. Также можно просто загрузить стабильную диффузию 1.5 в качестве базы, но для получения удовлетворенных результатов рекомендуется загрузить предложенную базовую модель.
Наш метод очень прост: взять вес у .safetensor и объединить вес LORA в диффузоры, поддерживаемый вес. Мы не конвертируем .safetensor в другой формат, вместо этого мы обновляем вес базовой модели.
Наш сценарий должен работать с большинством моделей от Huggingface и Cititai, если нет, вы также можете изменить код самостоятельно. Поверьте мне, это действительно просто, и вы можете сделать это.
# the default mergering ratio is 0.75, you can manually set it
python convert_lora_safetensor_to_diffusers.pyМы сделали пиар для диффузоров по этому вопросу, где мы дополнительно деформируем конвертирующую функцию, чтобы она была более гибкой. Вы можете напрямую проверить это, если не можете ждать. Скоро он будет объединен в диффузоры!
Diffusers предоставляет простой Train_text_to_image_lora.py, чтобы обучить свою модель на LORA. Пожалуйста, следуйте его инструкциям для установки требований.
export MODEL_NAME= " CompVis/stable-diffusion-v1-4 "
export DATASET_NAME= " lambdalabs/pokemon-blip-captions "
accelerate launch --mixed_precision= " fp16 " train_text_to_image_lora.py
--pretrained_model_name_or_path= $MODEL_NAME
--dataset_name= $DATASET_NAME --caption_column= " text "
--resolution=512 --random_flip
--train_batch_size=1
--num_train_epochs=100 --checkpointing_steps=5000
--learning_rate=1e-04 --lr_scheduler= " constant " --lr_warmup_steps=0
--seed=42
--output_dir= " sd-pokemon-model-lora "
--validation_prompt= " cute dragon creature " --report_to= " wandb "После того, как вы обучили модель, используя команду выше, вывод можно сделать просто с помощью StablediffusionPipeline после загрузки обученных весов LORA. Вам необходимо пройти output_dir для загрузки весов LORA, которые, в данном случае, является SD-Pokemon-Model-Lora.
import torch
from diffusers import StableDiffusionPipeline
model_path = " your_path/sd-model-finetuned-lora-t4 "
pipe = StableDiffusionPipeline.from_pretrained( " CompVis/stable-diffusion-v1-4 " , torch_dtype=torch.float16)
pipe.unet.load_attn_procs(model_path)
pipe.to( " cuda " )
prompt = " A pokemon with green eyes and red legs. "
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save( " pokemon.png " )На данный момент диффузоры поддерживают только Train Lora для UNET. Мы поддерживали и сделали PR, если вам это нужно, пожалуйста, проверьте наш PR или откройте проблему.
Колоссалай уже поддерживает Лору. Нам нужно изменить только несколько строк в верхней части Train_dreambooth_colossalai.py. Этот пример предназначен для Dreambooth, но вы можете легко принять его регулярный текст к обучению изображениям. Сгенерированные веса LORA предназначены только для слоев внимания в UNET. Если вы также хотите поддерживать текстовый энкодер, используйте структуру Acceletate в диффузорах, так как Colossalai еще не поддерживает несколько моделей.
from diffusers.loaders import AttnProcsLayers
from diffusers.models.cross_attention import LoRACrossAttnProcessor
# attention here! It is necessaray to init unet under ColoInitContext, not just lora layers
with ColoInitContext(device=get_current_device()):
unet = UNet2DConditionModel.from_pretrained(
args.pretrained_model_name_or_path,
subfolder= " unet " ,
revision=args.revision,
low_cpu_mem_usage=False
)
unet.requires_grad_(False)
# Set correct lora layers
lora_attn_procs = {}
for name in unet.attn_processors.keys ():
cross_attention_dim = None if name.endswith( " attn1.processor " ) else unet.config.cross_attention_dim
if name.startswith( " mid_block " ):
hidden_size = unet.config.block_out_channels[-1]
elif name.startswith( " up_blocks " ):
block_id = int(name[len( " up_blocks. " )])
hidden_size = list(reversed(unet.config.block_out_channels))[block_id]
elif name.startswith( " down_blocks " ):
block_id = int(name[len( " down_blocks. " )])
hidden_size = unet.config.block_out_channels[block_id]
lora_attn_procs[name] = LoRACrossAttnProcessor(
hidden_size=hidden_size, cross_attention_dim=cross_attention_dim
)
unet.set_attn_processor(lora_attn_procs)
lora_layers = AttnProcsLayers(unet.attn_processors)
# DDP
unet = gemini_zero_dpp(unet, args.placement)
# config optimizer for colossalai zero, set initial_scale to large value to avoid underflow
optimizer = GeminiAdamOptimizer(unet,
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
initial_scale=2 ** 16,
clipping_norm=args.max_grad_norm)Вот и мы, единственное, что это способ инициализации UNET. Чтобы сэкономить только веса Лоры,
torch_unet = get_static_torch_model(unet)
if gpc.get_local_rank(ParallelMode.DATA) == 0:
torch_unet = torch_unet.to(torch.float32)
torch_unet.save_attn_procs(save_path)Затем сделайте вывод
from diffusers import StableDiffusionPipeline
import torch
model_path = " sd-model-finetuned-lora "
pipe = StableDiffusionPipeline.from_pretrained( " CompVis/stable-diffusion-v1-4 " , torch_dtype=torch.float16)
pipe.unet.load_attn_procs(model_path)
pipe.to( " cuda " )
prompt = " A pokemon with green eyes and red legs. "
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save( " pokemon.png " )Вы можете обнаружить, что сгенерированный вес LORA составляет всего около 3 МБ, это связано с настройкой по умолчанию. Чтобы увеличить размер, вы можете вручную установить ранг (размер для разложения низкого ранга) для слоев LORA.
lora_attn_procs[name] = LoRACrossAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=128)Затем веса LORA будет составлять около 100-200 МБ. Имейте в виду, что слои LORA легко переполнять, вообще говоря, этого должно быть достаточно, чтобы тренировать только 100 - 2000 шагов на небольших наборах данных (менее 1K изображений) с размером партии = 64.
(1) Могу ли я вручную отрегулировать вес LORA при слиянии?
Да, альфа вот вес для Лоры. Мы представили PR диффузорам, где мы предоставляем гибкую военную функцию.
(2) Могу ли я преобразовать LORA (.Safetensors) в другие форматы, которые поддерживают диффузоры?
Вы можете, но мы не предлагаем, увидеть эти проблемы. Есть много ограничений. Например, наш сценарий не может обобщать все. Сафетенсоры, потому что некоторые из них имеют различное именование. Кроме того, текущая структура диффузоров только поддерживает добавление LORA в слои внимания UNET, в то время как многие. Safetensors из Civitai содержат веса LORA для других модулей, таких как Text Encoder. Но в ближайшее время должна быть поддержана Lora для текстового энкодера.
(3) Могу ли я смешать более одной модели LORA?
Да, единственное, что можно слияние дважды. Но, пожалуйста, аккуратно установите альфа (вес Лоры), модель разлагается, если альфа слишком большая.
(4) Какова мотивация этого проекта?
Мы находим, что на платформе Civitai есть много невероятных моделей, но большинство весов Lora находятся в формате Safetensors, что не удобно для пользователей диффузоров. Таким образом, мы пишем конвертирующий сценарий, чтобы вы могли использовать эти лора в диффузорах. Имейте в виду, что мы не являемся мишенью для стабильной диффузии-вабуи, которая уже очень зрелая, но имеет совершенно разные API в качестве диффузоров.