Diffusers documentation

LoRA

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

LoRA

يعمل LoRA (Low-Rank Adaptation) على تكييف نموذج مُدرَّب مسبقًا مع مهمة جديدة من خلال تجميد الأوزان الأصلية وتدريب مجموعة صغيرة من المعاملات الجديدة. يكون التكييف أسرع وأقل تكلفة من الضبط الدقيق الكامل، مما يجعله عمليًا لمهام مثل توليد الصور بأسلوب جديد.

عادةً ما تكون نقاط التفتيش الخاصة بـ LoRA بحجم بضعة مئات من الميجابايتات فقط. حمّلها باستخدام pipeline.load_lora_weights وقم بتعيين weight_name إلى اسم ملف نقطة التفتيش. راجع load_lora_weights() للاطلاع على المعلمات المشتركة.

النص إلى صورة
النص إلى فيديو
import torch
from diffusers import AutoPipelineForText2Image

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/super-cereal-sdxl-lora",
    weight_name="cereal_box_sdxl_v1.safetensors",
    adapter_name="cereal"
)
pipeline("bears, pizza bites").images[0]

تعمل واجهات برمجة تطبيقات LoRA الخاصة بالخطوط الأنابيب في هذه الصفحة بنفس الطريقة عبر عائلات النماذج. وحدة إزالة الضوضاء هي pipeline.unet في Stable Diffusion وSDXL، وهي pipeline.transformer في نماذج نمط DiT مثل Flux وStable Diffusion 3 وAuraFlow وLTX. ينطبق النمط نفسه على نماذج الفيديو مثل CogVideoX وHunyuanVideo وWan. تستخدم طرق PEFT على مستوى النموذج ذلك السمة مع prefix مطابق ("unet" أو "transformer").

pipeline.load_lora_weights هو الطريقة المفضلة لتحميل أوزان LoRA إلى مُزيل الضوضاء (UNet أو transformer) ومُشفّرات النص. راجع load_lora_weights() للاطلاع على المعلمات المشتركة. يمكنه التعامل مع الحالات التي:

  • تشارك نقطة التفتيش المفاتيح بين مُزيل الضوضاء ومُشفّرات النص
  • يستخدم نقطة التفتيش مفاتيح منفصلة لمزيل الضوضاء ومشفّر النص

تقوم طريقة load_lora_adapter() بتحميل مُكيّف LoRA على مستوى النموذج في أي نموذج من نماذج Diffusers يرث من PeftAdapterMixin، مثل UNet أو transformer. وتقوم هذه الطريقة ببناء إعداد المُكيّف وتجهيزه، ثم تحميل الأوزان في ذلك الوحدة.

استخدم prefix لتصفية مفاتيح state dict الخاصة بالوحدة المستهدفة ("unet" أو "transformer"). القيمة الافتراضية هي "transformer"، لذا يجب على Stable Diffusion و SDXL تمرير prefix="unet".

import torch
from diffusers import AutoPipelineForText2Image

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.unet.load_lora_adapter(
    "jbilcke-hf/sdxl-cinematic-1",
    weight_name="pytorch_lora_weights.safetensors",
    adapter_name="cinematic",
    prefix="unet"
)
# use cnmt in the prompt to trigger the LoRA
pipeline("A cute cnmt eating a slice of pizza, stunning color scheme, masterpiece, illustration").images[0]
import torch
from diffusers import FluxPipeline

pipeline = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.transformer.load_lora_adapter(
    "alvarobartt/ghibli-characters-flux-lora",
    adapter_name="lora",
    prefix="transformer",
)

torch.compile

يسرّع torch.compile الاستدلال من خلال تجميع نموذج PyTorch لاستخدام نواة مُحسّنة. وقبل التجميع، يجب دمج أوزان LoRA في النموذج الأساسي ثم تفريغها أولاً.

import torch
from diffusers import DiffusionPipeline

# load base model and LoRA
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)

# activate LoRA and set adapter weight
pipeline.set_adapters("ikea", adapter_weights=0.7)

# fuse LoRAs and unload weights
pipeline.fuse_lora(adapter_names=["ikea"], lora_scale=1.0)
pipeline.unload_lora_weights()

عادةً، قم بتجميع مُزيل الضوضاء لأنه المكوّن الأكثر استهلاكًا للقدرات الحاسوبية في خط المعالجة.

unet
transformer
pipeline.unet.to(memory_format=torch.channels_last)
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)

pipeline("A bowl of ramen shaped like a cute kawaii bear").images[0]

راجع قسم hotswapping لمعرفة كيفية تجنب إعادة التجميع عند العمل مع نماذج مُجمَّعة ومتعددات LoRA.

مقياس الأوزان

استخدم معامل adapter_weights في set_adapters() للتحكم في مقدار تطبيق LoRA. الوزن 0 يعادل استخدام أوزان النموذج الأساسي فقط، والوزن 1 يعادل استخدام LoRA بالكامل.

وزن قياسي
مقاييس لكل مكوّن

مرّر قيمة قياسية إلى adapter_weights في set_adapters() للتحكم في مدى قوة تطبيق LoRA.

import torch
from diffusers import AutoPipelineForText2Image

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/super-cereal-sdxl-lora",
    weight_name="cereal_box_sdxl_v1.safetensors",
    adapter_name="cereal"
)
pipeline.set_adapters("cereal", adapter_weights=1.0)
pipeline("bears, pizza bites").images[0]

set_adapters كنمط أساسي، لكن بعض خطوط الأنابيب تقبل أيضًا cross_attention_kwargs={"scale": 1.0} عند الاستدعاء كطريقة ثانوية لتغيير مقياس الانتباه. الخطوط الأنابيب التي لا تستخدم الانتباه المتقاطع تعرض عادةً attention_kwargs بدلاً من ذلك (أو joint_attention_kwargs في Flux وStable Diffusion 3).

جدولة التوسع

إن ضبط مقياس LoRA ديناميكيًا أثناء أخذ العينات يمنحك تحكمًا أفضل في التكوين العام والتخطيط، لأن بعض الخطوات قد تستفيد أكثر من زيادة المقياس أو تقليله.

يبدأ LoRA للشخصية في المثال التالي بمقياس أعلى يتلاشى تدريجياً خلال الخطوات العشرين الأولى لإرساء توليد الشخصية. في الخطوات اللاحقة، يُطبَّق مقياس 0.2 فقط لتجنب إضافة ميزات LoRA بشكل مفرط إلى أجزاء أخرى من الصورة لم يتم تدريب LoRA عليها.

import torch
from diffusers import FluxPipeline

pipeline = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

pipeline.load_lora_weights("alvarobartt/ghibli-characters-flux-lora", adapter_name="lora")

num_inference_steps = 30
lora_steps = 20
lora_scales = torch.linspace(1.5, 0.7, lora_steps).tolist()
lora_scales += [0.2] * (num_inference_steps - lora_steps + 1)

pipeline.set_adapters("lora", lora_scales[0])

def callback(pipeline: FluxPipeline, step: int, timestep: torch.LongTensor, callback_kwargs: dict):
    pipeline.set_adapters("lora", lora_scales[step + 1])
    return callback_kwargs

prompt = """
Ghibli style The Grinch, a mischievous green creature with a sly grin, peeking out from behind a snow-covered tree while plotting his antics, 
in a quaint snowy village decorated for the holidays, warm light glowing from cozy homes, with playful snowflakes dancing in the air
"""
pipeline(
    prompt=prompt,
    guidance_scale=3.0,
    num_inference_steps=num_inference_steps,
    generator=torch.Generator().manual_seed(42),
    callback_on_step_end=callback,
).images[0]

تبديل

يُعد تبديل نماذج LoRA طريقة فعّالة للتعامل مع عدة نماذج LoRA مع تجنّب تراكم الذاكرة الناتج عن استدعاءات متعددة لدالة load_lora_weights، وفي بعض الحالات، إعادة التجميع إذا كان النموذج مُجمَّعًا. تتطلب هذه العملية وجود نموذج LoRA محمّل مسبقًا، حيث تُستبدل أوزان نموذج LoRA الجديد في مكان النموذج المحمّل الحالي.

import torch
from diffusers import DiffusionPipeline

# load base model and LoRAs
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)

لا يُدعم تبديل LoRAs التي تستهدف مُشفّر النص.

اضبط hotswap=True على load_lora_weights لاستبدال LoRA الثاني. استخدم معامل adapter_name للإشارة إلى LoRA الذي تريد استبداله. إذا أهملت adapter_name عند التحميل، فإن Diffusers يسمي المكيّفات default_0، default_1، وهكذا. المكيّفات المسماة أسهل في الاستهداف صراحةً.

pipeline.load_lora_weights(
    "lordjia/by-feng-zikai",
    hotswap=True,
    adapter_name="ikea"
)

النماذج المُجمَّعة

بالنسبة للنماذج المُجمَّعة، استخدم enable_lora_hotswap() لتجنب إعادة التجميع عند تبديل LoRAs بشكل فوري. يجب استدعاء هذه الطريقة قبل تحميل أول LoRA، ويجب استدعاء torch.compile بعد تحميل أول LoRA.

لا يكون من الضروري دائمًا استخدام طريقة enable_lora_hotswap() إذا كان الهدف من LoRA الثاني هو رتب ومقاييس LoRA متطابقة مع تلك الخاصة بـ LoRA الأول.

داخل enable_lora_hotswap()، اضبط target_rank على أعلى رتبة بين المُكيّفات التي تخطط لتحميلها (الافتراضي 128).

import torch
from diffusers import DiffusionPipeline

# load base model and LoRAs
pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
# 1. enable_lora_hotswap
pipeline.enable_lora_hotswap(target_rank=128)
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)
# 2. torch.compile
pipeline.unet = torch.compile(pipeline.unet, mode="reduce-overhead", fullgraph=True)

# 3. hotswap
pipeline.load_lora_weights(
    "lordjia/by-feng-zikai",
    hotswap=True,
    adapter_name="ikea"
)

انقل كودك داخل مُدير السياق with torch._dynamo.config.patch(error_on_recompile=True) للكشف عما إذا كان النموذج قد أُعيد تجميعه. إذا أُعيد تجميع النموذج رغم اتباع جميع الخطوات المذكورة أعلاه، يرجى فتح مشكلة تتضمن مثالًا قابلًا للتكرار.

إذا كنت تتوقع دقة متغيرة أثناء الاستدلال باستخدام هذه الميزة، فتأكد من تعيين dynamic=True أثناء التجميع. راجع تجميع الأشكال الديناميكية لمزيد من التفاصيل.

لا تزال هناك سيناريوهات يكون فيها إعادة التجميع أمراً لا مفر منه، مثل عندما يستهدف LoRA المُستبدل الساخن طبقات أكثر من المُكيّف الأولي. حاول تحميل LoRA الذي يستهدف أكبر عدد من الطبقات أولاً. لمزيد من التفاصيل حول هذا القيد، راجع وثائق hotswapping الخاصة بـ PEFT.

Why `target_rank` and load order matter

تحوّل الطريقة enable_lora_hotswap() معامل توسيع LoRA من أرقام عشرية إلى torch.tensors وتُضيف حشواً إلى شكل الأوزان ليصبح مطابقاً لأكبر شكل مطلوب، وذلك لتجنّب إعادة تعيين الخاصية بأكملها عند استبدال البيانات داخل الأوزان.

ولهذا السبب يُعدّ الحُجّة target_rank مهمة. تبقى النتائج دون تغيير حتى عند ملء القيم بأصفار. ومع ذلك، قد يكون الحساب أبطأ اعتمادًا على حجم الملء.

بما أنه لا يتم إضافة أي سمات LoRA جديدة، فإن كل LoRA تالٍ يُسمح له فقط باستهداف نفس الطبقات التي يستهدفها LoRA الأول، أو مجموعة فرعية منها. إن اختيار ترتيب تحميل LoRAs أمر مهم، لأنه إذا استهدفت LoRAs طبقات غير متداخلة، فقد ينتهي بك الأمر إلى إنشاء LoRA وهمي يستهدف اتحاد جميع الطبقات المستهدفة.

اطّلع على منشور المدونة LoRA fast لمزيد من المعلومات حول تبديل LoRA مع النماذج المُجمّعة، وللاطلاع على مزيد من تفاصيل التنفيذ، راجع ملف hotswap.py.

دمج

يمكن دمج الأوزان من كل LoRA معًا لإنتاج مزيج من أنماط متعددة موجودة مسبقًا. توجد عدة طرق لدمج LoRAs، تختلف كل منها في كيفية دمج الأوزان (قد يؤثر ذلك على جودة التوليد).

set_adapters

تدمج طريقة set_adapters() نماذج LoRA عن طريق دمج مصفوفاتها الموزونة. مرر أسماء نماذج LoRA إلى set_adapters() واستخدم معامل adapter_weights للتحكم في مقياس كل نموذج LoRA. على سبيل المثال، إذا كان adapter_weights=[0.5, 0.5]، فإن المخرجات ستكون متوسطًا للنموذجين.

يُفضَّل استخدام adapter_weights في set_adapters() للتحكم في مقدار كل LoRA مدمج يُطبَّق. راجع قسم Weight scale لمزيد من التفاصيل.

import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)
pipeline.load_lora_weights(
    "lordjia/by-feng-zikai",
    weight_name="fengzikai_v1.0_XL.safetensors",
    adapter_name="feng"
)
pipeline.set_adapters(["ikea", "feng"], adapter_weights=[0.7, 0.8])
# use by Feng Zikai to activate the lordjia/by-feng-zikai LoRA
pipeline("A bowl of ramen shaped like a cute kawaii bear, by Feng Zikai").images[0]

add_weighted_adapter

هذه طريقة تجريبية، ويمكنك الرجوع إلى دمج النماذج في PEFT لمزيد من التفاصيل. اطّلع على هذا المشكلة إذا كنت مهتمًا بالدوافع والتصميم وراء هذا التكامل.

تُمكّن طريقة add_weighted_adapter من استخدام طرق دمج أكثر كفاءة مثل TIES أو DARE. تقوم طرق الدمج هذه بإزالة المعاملات الزائدة والتي قد تتداخل مع بعضها في النماذج المدمجة. يرجى ملاحظة أن رتب LoRA يجب أن تكون متطابقة للتمكن من الدمج. يستخدم الشرح أدناه UNet الخاص بـ SDXL.

تأكد من تثبيت أحدث إصدار مستقر من Diffusers و PEFT.

pip install -U -q diffusers peft

قم بتحميل UNet يتوافق مع UNet الخاص بـ LoRA.

import copy
import torch
from diffusers import AutoModel, DiffusionPipeline
from peft import get_peft_model, LoraConfig, PeftModel

unet = AutoModel.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
    subfolder="unet",
).to("cuda")  # or "mps", "xpu", "cpu"

حمّل خط أنابيب، مرّر UNet إليه، ثم حمّل LoRA.

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    variant="fp16",
    dtype=torch.float16,
    unet=unet
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)

أنشئ PeftModel من نقطة التفتيش LoRA عن طريق دمج أول UNet قمت بتحميله مع UNet الخاص بـ LoRA من خط الأنابيب.

sdxl_unet = copy.deepcopy(unet)
ikea_peft_model = get_peft_model(
    sdxl_unet,
    pipeline.unet.peft_config["ikea"],
    adapter_name="ikea"
)

original_state_dict = {f"base_model.model.{k}": v for k, v in pipeline.unet.state_dict().items()}
ikea_peft_model.load_state_dict(original_state_dict, strict=True)

يمكنك حفظ ikea_peft_model وإعادة استخدامه عن طريق رفعه إلى Hub كما هو موضح أدناه.

ikea_peft_model.push_to_hub("ikea_peft_model", token=TOKEN)

كرر هذه العملية وأنشئ PeftModel لـ LoRA الثاني.

pipeline.delete_adapters("ikea")
sdxl_unet.delete_adapters("ikea")

pipeline.load_lora_weights(
    "lordjia/by-feng-zikai",
    weight_name="fengzikai_v1.0_XL.safetensors",
    adapter_name="feng"
)
pipeline.set_adapters(adapter_names="feng")

feng_peft_model = get_peft_model(
    sdxl_unet,
    pipeline.unet.peft_config["feng"],
    adapter_name="feng"
)

original_state_dict = {f"base_model.model.{k}": v for k, v in pipeline.unet.state_dict().items()}
feng_peft_model.load_state_dict(original_state_dict, strict=True)

تحميل نموذج UNet الأساسي وتحميل المكيّفات.

base_unet = AutoModel.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
    subfolder="unet",
).to("cuda")  # or "mps", "xpu", "cpu"

model = PeftModel.from_pretrained(
    base_unet,
    "stevhliu/ikea_peft_model",
    use_safetensors=True,
    subfolder="ikea",
    adapter_name="ikea"
)
model.load_adapter(
    "stevhliu/feng_peft_model",
    use_safetensors=True,
    subfolder="feng",
    adapter_name="feng"
)

ادمج LoRAs باستخدام add_weighted_adapter وحدد كيفية دمجها عبر combination_type. يستخدم المثال أدناه طريقة "dare_linear" (راجع هذا المقال لمعرفة المزيد حول طرق الدمج هذه)، حيث تقصّ عشوائياً بعض الأوزان ثم تنفّذ مجموعاً موزوناً للمصفوفات بناءً على الوزن المحدد لكل LoRA في weights.

فعّل LoRAs المدمجة باستخدام set_adapters().

model.add_weighted_adapter(
    adapters=["ikea", "feng"],
    combination_type="dare_linear",
    weights=[1.0, 1.0],
    adapter_name="ikea-feng"
)
model.set_adapters("ikea-feng")

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    unet=model,
    variant="fp16",
    dtype=torch.float16,
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline("A bowl of ramen shaped like a cute kawaii bear, by Feng Zikai").images[0]

fuse_lora

تدمج طريقة fuse_lora() أوزان LoRA مباشرةً مع أوزان مُزيل الضوضاء الأصلي (UNet أو transformer) ومُشفّر النص للنموذج الأساسي. يقلل هذا من العبء الناتج عن تحميل النموذج الأساسي لكل LoRA لأنه يُحمّل النموذج مرة واحدة فقط، مما يُخفض استهلاك الذاكرة ويزيد من سرعة الاستدلال.

import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)
pipeline.load_lora_weights(
    "lordjia/by-feng-zikai",
    weight_name="fengzikai_v1.0_XL.safetensors",
    adapter_name="feng"
)
pipeline.set_adapters(["ikea", "feng"], adapter_weights=[0.7, 0.8])

استدعِ fuse_lora() لدمجها. يتحكم معامل lora_scale في مقدار توسيع المخرجات باستخدام أوزان LoRA. من المهم إجراء هذا التعديل الآن لأن تمرير scale إلى cross_attention_kwargs لن يعمل في خط المعالجة.

pipeline.fuse_lora(adapter_names=["ikea", "feng"], lora_scale=1.0)

قم بإزالة أوزان LoRA لأنها مدمجة بالفعل مع النموذج الأساسي. احفظ خط الأنابيب المدمج إما باستخدام save_pretrained() لحفظه محليًا أو باستخدام ~PushToHubMixin.push_to_hub لحفظه على Hub.

الحفظ محليًا
الحفظ في Hub
pipeline.unload_lora_weights()
pipeline.save_pretrained("path/to/fused-pipeline")

يمكن الآن تحميل خط الأنابيب المدمج بسرعة للاستدلال دون الحاجة إلى تحميل كل LoRA بشكل منفصل.

pipeline = DiffusionPipeline.from_pretrained(
    "username/fused-ikea-feng", dtype=torch.float16,
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline("A bowl of ramen shaped like a cute kawaii bear, by Feng Zikai").images[0]

استخدم unfuse_lora() لاستعادة أوزان النموذج الأساسي، على سبيل المثال، إذا كنت ترغب في استخدام قيمة مختلفة لـ lora_scale. يمكنك إلغاء الدمج فقط إذا كان هناك LoRA واحد مدمج. على سبيل المثال، لن يعمل ذلك مع خط المعالجة المذكور أعلاه لأن هناك عدة LoRAs مدمجة. في هذه الحالات، ستحتاج إلى إعادة تحميل النموذج بالكامل.

pipeline.unfuse_lora()

إدارة

توفر مكتبة Diffusers عدة طرق لمساعدتك في إدارة العمل مع LoRAs. وقد تكون هذه الطرق مفيدة بشكل خاص إذا كنت تعمل مع عدة LoRAs.

set_adapters

كما يُفعّل set_adapters() الـ LoRA الحالي للاستخدام في حال وجود عدة LoRAs نشطة. وهذا يتيح لك التبديل بين LoRAs مختلفة عن طريق تحديد اسمها.

import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights(
    "ostris/ikea-instructions-lora-sdxl",
    weight_name="ikea_instructions_xl_v1_5.safetensors",
    adapter_name="ikea"
)
pipeline.load_lora_weights(
    "lordjia/by-feng-zikai",
    weight_name="fengzikai_v1.0_XL.safetensors",
    adapter_name="feng"
)
# activates the feng LoRA instead of the ikea LoRA
pipeline.set_adapters("feng")

save_lora_adapter

احفظ مُكيّفًا باستخدام save_lora_adapter() على الوحدة نفسها التي حمّلتها في (pipeline.unet أو pipeline.transformer).

import torch
from diffusers import AutoPipelineForText2Image

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.unet.load_lora_adapter(
    "jbilcke-hf/sdxl-cinematic-1",
    weight_name="pytorch_lora_weights.safetensors",
    adapter_name="cinematic",
    prefix="unet"
)
pipeline.unet.save_lora_adapter("path/to/save", adapter_name="cinematic")

unload_lora_weights

تُزيل طريقة unload_lora_weights() أي أوزان LoRA في خط المعالجة لاستعادة أوزان النموذج الأساسي.

pipeline.unload_lora_weights()

disable_lora

تعطّل طريقة disable_lora() جميع وحدات LoRA (لكنها تبقى محفوظة على خط المعالجة) وتعيد خط المعالجة إلى أوزان النموذج الأساسي.

pipeline.disable_lora()

get_active_adapters

تعيد طريقة get_active_adapters() قائمةً بمُكيّفات LoRA النشطة المرتبطة بخط المعالجة.

pipeline.get_active_adapters()
# ["cereal", "ikea"]

get_list_adapters

يعيد أسلوب get_list_adapters() جميع وحدات LoRA المحمّلة لكل مكوّن في خط المعالجة. تتطابق مفاتيح القاموس مع الوحدات المحمّلة، مثل unet أو transformer وأي مشفّرات نصية.

pipeline.get_list_adapters()
# {"unet": ["cereal", "ikea"], "text_encoder_2": ["cereal"]}

delete_adapters

تزيل طريقة delete_adapters() وحدة LoRA وطبقاتها بالكامل من النموذج.

pipeline.delete_adapters("ikea")

الخطوات التالية

  • تصفّح LoRA Studio لاستكشاف LoRAs مختلفة للاستخدام، أو يمكنك رفع LoRAs المفضلة لديك من Civitai إلى Hub باستخدام المساحة أدناه.
Update on GitHub