Предыдущая статья《Используйте диффузоры для вызова контрольно-пропускного пункта и LoRA в Civitai.》использовать ПонятноDiffusersсценарий ВоляCстоять(civitai)изcheckpointиLoRAпреобразован вDiffusersможно идентифицироватьиз Формат,Тогда служи Диффузериспользовать.
С точки зрения лора метод из предыдущей статьи имеет следующие проблемы:
Решение, представленное в этой статье, работает хорошо и быстро, хотя оно требует дополнительного управления альфа-весом LoRA. Нам нужно создать переменную для запоминания текущего альфа-веса LoRA. Потому что загрузка кода LoRA просто добавляет вместе матрицы A и B в LoRA.
Затем он объединяется с весом модели основной контрольной точки W.
Чтобы удалить веса LoRA, нам нужен отрицательный -α для удаления весов LoRA или воссоздания конвейера.
Другой способ использования LoRA — изменить код, выполняющий процесс пересылки модулей, и ввести веса LoRA во время расчета вложений текста и оценок внимания.
Это метод загрузки LoRA LoraLoaderMixin от Diffusers до версии 0.20.0. Преимущество этого подхода заключается в том, что вместо обновления весов модели мы можем легко сбросить LoRA и предоставить новый α для определения весов LoRA. Однако этот метод отличается от метода sd-webui, предложенного вьетнамским боссом, что приводит к множеству неприятностей при использовании Диффузоров.
После Diffusers v0.20.0 эти проблемы частично решены. Тем не менее, мы можем использовать диффузоры для загрузки модели контрольных точек с помощью LoRA и получить точно такие же результаты, используя sd-webui.
Давайте сначала посмотрим на диффузоры. docsсерединарекомендоватьиз Способ。https://huggingface.co/docs/diffusers/v0.20.0/en/training/lora。
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"emilianJR/chilloutmix_NiPrunedFp32Fix",
torch_dtype = torch.float16,
safety_checker = None
)
pipe = pipe.to("cuda")
lora_path = "<path/to/lora.safetensors>"
pipe.load_lora_weights(lora_path)
seed = int.from_bytes(os.urandom(2), "big")
generator = torch.Generator("cuda").manual_seed(seed)
image = pipe(
prompt="(masterpiece),(best quality),(ultra-detailed),1boy, full body, chibi, yellow, outdoors, beret",
negative_prompt="(low quality:1.3), (worst quality:1.3)",
width=512,
height=768,
guidance_scale=9,
num_inference_steps=30,
generator=generator
).images[0]
output_path = f"/tmp/out-{seed}.png"
image.save(output_path)
Всего одна строка кода: Pipe.load_lora_weights(lora_path) может завершить загрузку модели Лоры. Если вам нужно загрузить несколько лора, вызовите Pipe.load_lora_weights(lora_path) несколько раз.
Примечание:
<path/to/lora.safetensors>да ВоляCстоятьизLoRAСкачатьиз*.safetensorsПоставить на локальный жесткий дискизконкретный путьиимя файла;
emilianJR/chilloutmix_NiPrunedFp32Fix берется из содержимого в красном поле на картинке, его не нужно загружать вручную.
Если вы хотите использовать локальный кеш после однократной загрузки, вы можете добавить параметр cache_dir. Пример:
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"emilianJR/chilloutmix_NiPrunedFp32Fix"
, torch_dtype = torch.float16
, safety_checker = None
, cache_dir="diffusers-cache"
).to("cuda")
lora_path = "<path/to/lora.safetensors>"
pipe.load_lora_weights(lora_path)
Чтобы сбросить LoRA, просто вызовите функцию unload_lora_weights:
pipe.unload_lora_weights()
Здесь мы можем найти проблему,Это мы в SD-Webui,Можно установитьloraизмасса,Например, мыpromptПрисоединяйтесь:<lora:myLora:0.5>。но здесьда Не поддерживаетсяиз。Что делать?Andrew Zhuпоставлять Понятноабзацкодрешить эту проблему:
pipe.unload_lora_weights()
lora_path = "<path/to/lora.safetensors>"
lora_w = 0.5
pipe._lora_scale = lora_w
state_dict, network_alphas = pipe.lora_state_dict(
lora_path
)
for key in network_alphas:
network_alphas[key] = network_alphas[key] * lora_w
#network_alpha = network_alpha * lora_w
pipe.load_lora_into_unet(
state_dict = state_dict
, network_alphas = network_alphas
, unet = pipe.unet
)
pipe.load_lora_into_text_encoder(
state_dict = state_dict
, network_alphas = network_alphas
, text_encoder = pipe.text_encoder
)
Давайте посмотрим на сравнение воздействия этого слова-подсказки с обеих сторон:
(masterpiece),(best quality),(ultra-detailed),1boy, full body, chibi, yellow, outdoors, beret<lora:blindbox_v1_mix:0.5>
Negative prompt: (low quality:1.3), (worst quality:1.3)
Steps: 30, Sampler: Euler, CFG scale: 9, Seed: 1875473241, Size: 512x768, Model hash: fc2511737a, Model: chilloutmix_NiPrunedFp32Fix, Lora hashes: "blindbox_v1_mix: ee3fbe5a8576", Version: v1.3.2
Вы видите разницу?
В этой статье описаны последние события в поддержке Лоры со стороны Diffusers. Благодаря обновлению Diffusers v0.20.0 мы можем получить тот же эффект, что и sd-webui, через Diffusers, что облегчает сравнение эффектов между различными платформами. Конечно, есть еще ряд проблем, которые необходимо решить: