Phase 08: Generative AI

ControlNet، LoRA & Conditioning

يسمح لك ControlNet بتنسيق نموذج التوزيع المسبق للتدريب وتوجيهه باستخدام خريطة عمق أو هيكل عظمي أو خدش أو صورة حافة. يسمح لك LoRA بتحسين نموذج معايير 2B من خلال تدريب 10 ملايين ملامح. معا حولوا Diffusion Stable من لعبة إلى خط أنابيب الصور 2026 الذي يتم شحنه في كل وكالة.

Type: Build

Languages: Python

Prerequisites: Phase 8 · 07 (Latent Diffusion), Phase 10 (LLMs from Scratch — for LoRA foundation)

Time: ~75 minutes

المشكلة

إن إشارة مثل "مرأة في ثوب أحمر تمشي كلباً في شارع مزدحم" لا تعطي النموذج معلومات عن أين الكلب ، ما هي وضعية المرأة ، أو منظور من الشارع. يحدد النص حوالي 10% مما تحتاج إليه لتضمين صورة. الباقي بصري ولا يمكن وصفه بكلمات بكفاءة.

تعليماً نموذج مشروط جديد من الصفر لكل إشارة (موقف، عمق، حكمة، قسم) أمر محظور. تريد أن تبقي العمود الفقري SDXL 2.6B-param مقفوفة، وربط شبكة جانبية صغيرة تقرأ التشريع، وتجعلها تدفع الميزات المتوسطة للعمود الفقري. وهذا هو ControlNet.

كما تريد تعليم النموذج مفاهيم جديدة (وجهك، منتجك، أسلوبك) دون إعادة تدريب النموذج الكامل. تريد دلتا أصغر بنسبة 100 مرة. هذا هو مكيّفات LoRA منخفضة الدرجة التي تتواصل مع أوزان الاهتمام القائمة.

ControlNet + LoRA + text = مجموعة أدوات الممارس 2026. معظم خطوط أنابيب الصورة الإنتاجية تضم 2-5 LoRAs ، 1-3 ControlNets ، ومعدل IP فوق قاعدة SDXL / SD3 / Flux.

المفهوم

!ControlNet clones the encoder; LoRA adds low-rank deltas

(تشارون)

خذ SD متدربة مسبقاً. قم بتسجيلها من نصف تشفير U-Net. قم بتجميد الأصلي. قم بتسجيله لتقبل مدخل إضافي للتشغيل (الحواف والعمق والوضع). قم بتوصيل الكلون إلى نصف تشفير الأصلي مع صفر-convolution تخطي الاتصالات (1 × 1 convs المبدئية إلى الصفر تبدأ كإغلاق، تعلم دلتا).

SD U-Net decoder:   ... ← orig_enc_features + zero_conv(controlnet_enc(condition))

0-conv init يعني أن ControlNet يبدأ على شكل هوية لا ضرر حتى قبل التدريب. القطار على 1M (السرعة، الحالة، الصورة) يضاعف إلى ثلاثة أضعاف مع فقدان الانتشار القياسي.

تم إرسال ControlNets للطريقة الواحدة كنموذج جانبي صغير (~ 360M لـ SDXL، ~ 70M لـ SD 1.5).

features += weight_a * control_a(depth) + weight_b * control_b(pose)

(هو وزملاء)

لأي طبقة خطيةW ∈ R^{d×d}في النموذج، التجمد Wو أضف ديلتا منخفضة الدرجة:

W' = W + ΔW,  ΔW = B @ A,  A ∈ R^{r×d},  B ∈ R^{d×r}

معr << d. الدرجة 4-16 هي معيار للاهتمام، الدرجة 64-128 لخطوات دقيقة ثقيلة. عدد المعلمات الجديدة: 2 · d · rبدلاً منd². لـ (SDXL) الاهتمام معd=640،r=16: 20k في كل جهاز تعديل بدلا من 410k تخفيض 20x. عبر النموذج بأكمله: لورا عادة ما تكون 20-200MB مقابل 5GB القاعدة.

عند الاستنتاج يمكنك أن تقوم بتحقيق حجم المعدلW' = W + α · B @ A. .α = 0.5-1.5المواد المتعددة لـ LoRA تتراكم بشكل إضافي (مع الحذارة المعتادة بأنها تتفاعل بطريقة غير خطية).

المعدل المعدل (Ye et al., 2023)

مُعدّل صغير يقبل الصورة كشروط (بجانب النص). يستخدم مُرمّد الصورة CLIP لإنتاج رموز الصورة، ويُحققها في الاهتمام المتقاطع جنباً إلى جنب مع رموز النص. ~ 20 ميب لكل نموذج أساسي. يسمح لك بـ "إنتاج صورة في أسلوب هذا المرجع" دون لورا.

ماتريكس التراكم

ToolWhat it controlsSizeWhen to use
ControlNetSpatial structure (pose, depth, edges)70-360MBExact layout, composition
LoRAStyle, subject, concept20-200MBPersonalization, style
IP-AdapterStyle or subject from reference image20MBNo text can describe the look
Textual InversionSingle concept as a new token10KBLegacy, mostly replaced by LoRA
DreamBoothFull fine-tune on a subject2-5GBStrong identity, high compute
T2I-AdapterLighter ControlNet alternative70MBEdge devices, inference budget

شبكة التحكم فضائية، لورا معنوية، استخدم الاثنين

بناءها

code/main.pyيحاكي الآليين في 1-D:

  1. LoRA.طبقة خطية مسبقةWأجمدوه، تدربوا منخفضينB @ Aمثل هذاW + BAيطابق طبقة خطية هدف.r = 1يكفي لتعلم تصحيح الدرجة 1 بشكل مثالي
  1. ControlNet-lite."قاعدة مقفزة" و "شبكة جانبية" تقرأ إشارة إضافية. يتم إغلاق خروج الشبكة الجانبية بواسطة مقياس قابل للتعلم تم تشريعه إلى الصفر (إصدارنا من الصفر-conv). قم بتشغيل ومراقبة البوابة.

الخطوة الأولى: رياضيات لورا

pythondef lora(W, A, B, x, alpha=1.0):
    # W is frozen; A, B are the trainable low-rank factors.
    return [W[i][j] * x[j] for i, j in ...] + alpha * (B @ (A @ x))

الخطوة الثانية: شبكة جانبية صفر

pythonside_out = control_net(x, condition)
gated = gate * side_out  # gate initialized to 0
h = base(x) + gated

في الخطوة 0 تكون الناتجية متطابقة مع القاعدة. تحديثات التدريب المبكر gateببطء لا يوجد تدفق كارثي

الفخاخ

  • Over-scaling LoRAs. α = 2أوα = 3هو عملية "جعلها أقوى" شائعة التي تنتج نتائج أكثر من اللازمة.α ≤ 1.5. . .
  • ControlNet weight conflict.استخدام شبكة التحكم في الوزن 1.0 و شبكة التحكم في الغموض عند الوزن 1.0 عادة ما يتجاوز. مجموع الوزن ≈ 1.0 هو افتراض آمن.
  • LoRA on the wrong base.SDXL LoRA لا تعمل بصمت على SD 1.5 لأن أبعاد الاهتمام لا تتطابق.
  • Textual Inversion drift.الوهم المدربة في نقطة تفتيش تتحرك بشكل سيء في نقطة أخرى.
  • LoRA weight-merging and storage.يمكنك تطبيق لورا في أساس النموذج الوزن لتحديد أسرع (لا إضافة وقت التشغيل) ، ولكنك تفقد القدرة على التوسعαفي وقت تشغيل، احتفظ بالنسختين

استخدمها

Goal2026 pipeline
Reproduce a brand's art styleLoRA trained on ~30 curated images at rank 32
Put my face in a generated imageDreamBooth or LoRA + IP-Adapter-FaceID
Specific pose + promptControlNet-Openpose + SDXL + text
Depth-aware compositionControlNet-Depth + SD3
Reference + promptIP-Adapter + text
Exact layoutControlNet-Scribble or ControlNet-Canny
Background replaceControlNet-Seg + Inpainting (Lesson 09)
Fast 1-step styleLCM-LoRA on SDXL-Turbo

أرسله

إنقاذoutputs/skill-sd-toolkit-composer.md. تتولى المهارة مهمة (أصول المدخل: عجلة، صورة مرجعية اختيارية، وضع اختياري، عمق اختياري، مسرح اختياري) وتخرج كومة الأدوات، والأوزان، وبروتوكول البذور المتكملة.

التمارين

  1. Easy.فيcode/main.py، تغير رتبة لوراrمن 1 إلى 4 في أي صف يطابق لورا بالضبط دلتا الهدف من صف 2؟
  2. Medium.قم بتدريب اثنين من الـ LoRA على اثنين من تحويلات الهدف قم بتحميلها معاً وظهر تفاعلهم الإضافي متى ينتهي التفاعل الخطية؟
  3. Hard.استخدام الموزعات لتحديد: SDXL-base + Canny-ControlNet (وزن 0.8) + LoRA (α 0.8) + IP-Adapter (وزن 0.6).

الشروط الرئيسية

TermWhat people sayWhat it actually means
ControlNet"Spatial control"Cloned encoder + zero-conv skips; reads a conditioning image.
Zero convolution"Starts as identity"1×1 conv initialized to zero; ControlNet starts as no-op.
LoRA"Low-rank adapter"W + B @ A, r << d; 100x fewer params than a full fine-tune.
rank r"The knob"LoRA compression; 4-16 typical, 64+ for heavy personalization.
α"LoRA strength"Runtime scaling of the LoRA delta.
IP-Adapter"Reference image"Small image-conditioning adapter via CLIP-image tokens.
DreamBooth"Full subject fine-tune"Train the full model on ~30 images of a subject.
Textual Inversion"New token"Learn a new word embedding only; legacy, mostly replaced.

ملاحظة الإنتاج: تبادلات لوراء، خطوط مراقبة شبكة التشغيل، خدمة متعددة المستأجرين

يقدم SaaS الحقيقي من النص إلى الصورة مئات من LoRAs وعشرات ControlNets على نفس نقطة التفتيش القاعدة. تبدو مشكلة الخدمة على غرار LLM متعددة التأجير (غطي أدب الإنتاج حالة LLM تحت الإجراءات المستمرة والLoRAX / S-LoRA):

  • Hot-swap LoRAs, do not merge.الاندماجW' = W + α·B·Aفي القاعدة يعطي ~ 3-5% أسرع في خطوة استنتاج ولكن يتجمد αو القاعدة. الحفاظ على لورا ساخنة في VRAM كديلتا رتبة- r؛ الموزعات تعرض pipe.load_lora_weights()+ pipe.set_adapters([...], adapter_weights=[...])لتنشيط الطلب. تكلفة التبادل هي 2 · d · r · num_layersالوزن على مقياس MB، في الجزء الثاني.
  • ControlNet as a second attention lane.يعمل المُخترف المُستنسخ بالتوازي مع القاعدة. اثنين من ControlNets وزنها 1.0 كل واحد = مرتين إضافيتين إلى الأمام في كل خطوة، وليس مراراً واحداً مدمجاً. تنخفض مساحة المجموعة من الحجم التربيعي. ميزانية ~ 1.5 × تكلفة الخطوة لكل ControlNet نشطة.
  • Quantized LoRAs too.إذا قمت بتقييم القاعدة (انظر الدروس 07, التدفق على 8GB) ، فإن دلتا LoRA تقييمها أيضاً بشكل نظيف إلى 8 بتات أو 4 بتات. تسمح لك التحميل على شكل QLoRA بتجميع 5-10 LoRA على رأس قاعدة 4 بتات من التدفق دون تفجير الذاكرة.

تحديد التدفق: نيبوك نيلز التدفق على 8GB يقدر القاعدة إلى 4 بتات؛ وضع طراز LoRA (pipe.load_lora_weights("user/style-lora")) على هذه القاعدة الكمية في weight_name="pytorch_lora_weights.safetensors"هذا هو وصفة معظم وكالات SaaS تسافر في عام 2026.

المزيد من القراءة

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.