Files
ethanfel-ComfyUI-LoRA-Optim…/assets/the-problem.svg
T

202 lines
15 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 760">
<defs>
<linearGradient id="pbg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0f172a"/>
<stop offset="100%" style="stop-color:#1e1b4b"/>
</linearGradient>
<marker id="pa" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
<path d="M0,0 L8,3 L0,6" fill="none" stroke="#475569" stroke-width="1"/>
</marker>
<marker id="paG" markerWidth="8" markerHeight="6" refX="8" refY="3" orient="auto">
<path d="M0,0 L8,3 L0,6" fill="none" stroke="#22c55e" stroke-width="1"/>
</marker>
</defs>
<!-- Background -->
<rect width="600" height="760" rx="12" fill="url(#pbg)"/>
<!-- ===== TOP: STANDARD STACKING ===== -->
<rect x="20" y="14" width="560" height="24" rx="6" fill="#e94560" opacity="0.12"/>
<text x="300" y="31" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#e94560" text-anchor="middle" font-weight="700" letter-spacing="2">STANDARD LORA STACKING</text>
<!-- Pipeline: Model → +A → +B → +C → Output -->
<rect x="20" y="52" width="60" height="28" rx="6" fill="#334155" stroke="#64748b" stroke-width="1"/>
<text x="50" y="70" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8" text-anchor="middle">Model</text>
<line x1="80" y1="66" x2="100" y2="66" stroke="#475569" stroke-width="1.5" marker-end="url(#pa)"/>
<rect x="108" y="52" width="96" height="28" rx="6" fill="#1e293b" stroke="#f87171" stroke-width="1.5"/>
<text x="156" y="70" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#f87171" text-anchor="middle" font-weight="600">+ LoRA A (0.8)</text>
<line x1="204" y1="66" x2="218" y2="66" stroke="#475569" stroke-width="1.5" marker-end="url(#pa)"/>
<rect x="226" y="52" width="96" height="28" rx="6" fill="#1e293b" stroke="#c084fc" stroke-width="1.5"/>
<text x="274" y="70" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#c084fc" text-anchor="middle" font-weight="600">+ LoRA B (0.7)</text>
<line x1="322" y1="66" x2="336" y2="66" stroke="#475569" stroke-width="1.5" marker-end="url(#pa)"/>
<rect x="344" y="52" width="96" height="28" rx="6" fill="#1e293b" stroke="#38bdf8" stroke-width="1.5"/>
<text x="392" y="70" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#38bdf8" text-anchor="middle" font-weight="600">+ LoRA C (0.6)</text>
<line x1="440" y1="66" x2="454" y2="66" stroke="#475569" stroke-width="1.5" marker-end="url(#pa)"/>
<rect x="462" y="52" width="60" height="28" rx="6" fill="#e94560" opacity="0.15" stroke="#e94560" stroke-width="1.5"/>
<text x="492" y="70" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#e94560" text-anchor="middle" font-weight="600">Output</text>
<!-- Total effect bar -->
<text x="20" y="100" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#64748b">Total effect:</text>
<rect x="100" y="92" width="420" height="12" rx="4" fill="#334155"/>
<rect x="100" y="92" width="420" height="12" rx="4" fill="#e94560" opacity="0.5"/>
<line x1="300" y1="89" x2="300" y2="107" stroke="#f59e0b" stroke-width="1.5"/>
<text x="300" y="118" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#f59e0b" text-anchor="middle">1.0 safe limit</text>
<text x="520" y="118" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#e94560" text-anchor="end">2.1x — oversaturated</text>
<!-- Problem cards: 2 columns -->
<!-- Card 1: Overshoot -->
<rect x="20" y="130" width="270" height="130" rx="10" fill="#1e293b" stroke="#e94560" stroke-width="1"/>
<text x="42" y="154" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#e94560" font-weight="700">Strength Overshoot</text>
<text x="42" y="172" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Effects add up blindly — total strength</text>
<text x="42" y="186" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">far exceeds what the model can handle.</text>
<!-- Visual: stacking bars -->
<rect x="42" y="200" width="230" height="7" rx="2" fill="#334155"/>
<rect x="42" y="200" width="85" height="7" rx="2" fill="#f87171" opacity="0.7"/>
<rect x="42" y="211" width="230" height="7" rx="2" fill="#334155"/>
<rect x="42" y="211" width="160" height="7" rx="2" fill="#c084fc" opacity="0.5"/>
<rect x="42" y="222" width="230" height="7" rx="2" fill="#334155"/>
<rect x="42" y="222" width="215" height="7" rx="2" fill="#38bdf8" opacity="0.4"/>
<line x1="210" y1="197" x2="210" y2="232" stroke="#f59e0b" stroke-width="1" stroke-dasharray="3,2"/>
<text x="214" y="246" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#f59e0b">safe limit</text>
<text x="42" y="246" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#64748b">A alone → A+B → A+B+C</text>
<!-- Card 2: Conflicts -->
<rect x="310" y="130" width="270" height="130" rx="10" fill="#1e293b" stroke="#f59e0b" stroke-width="1"/>
<text x="332" y="154" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#f59e0b" font-weight="700">Weight Conflicts</text>
<text x="332" y="172" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">LoRAs push the same weights in opposite</text>
<text x="332" y="186" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">directions — they cancel each other out.</text>
<!-- Visual: opposing arrows -->
<rect x="332" y="200" width="65" height="16" rx="4" fill="#f87171" opacity="0.2" stroke="#f87171" stroke-width="0.5"/>
<text x="365" y="212" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#f87171" text-anchor="middle">A: +0.8</text>
<line x1="402" y1="208" x2="438" y2="208" stroke="#f87171" stroke-width="2.5"/>
<polygon points="438,204 448,208 438,212" fill="#f87171"/>
<rect x="332" y="222" width="65" height="16" rx="4" fill="#c084fc" opacity="0.2" stroke="#c084fc" stroke-width="0.5"/>
<text x="365" y="234" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c084fc" text-anchor="middle">B: −0.7</text>
<line x1="438" y1="230" x2="402" y2="230" stroke="#c084fc" stroke-width="2.5"/>
<polygon points="402,226 392,230 402,234" fill="#c084fc"/>
<text x="465" y="216" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#64748b">=</text>
<rect x="480" y="210" width="8" height="14" rx="2" fill="#f59e0b" opacity="0.5"/>
<text x="496" y="221" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#f59e0b">+0.1</text>
<text x="480" y="247" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#64748b">Both lost</text>
<!-- Card 3: Bleeding (full width centered) -->
<rect x="120" y="272" width="360" height="100" rx="10" fill="#1e293b" stroke="#c084fc" stroke-width="1"/>
<text x="142" y="296" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#c084fc" font-weight="700">Style Bleeding</text>
<text x="142" y="314" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Each LoRA is applied to the output of the previous one —</text>
<text x="142" y="328" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">one style contaminates the next.</text>
<!-- Visual: overlapping circles -->
<circle cx="310" cy="342" r="18" fill="#f87171" opacity="0.2" stroke="#f87171" stroke-width="1.5"/>
<text x="310" y="345" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#f87171" text-anchor="middle">Style</text>
<circle cx="338" cy="336" r="18" fill="#c084fc" opacity="0.2" stroke="#c084fc" stroke-width="1.5"/>
<text x="338" y="339" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#c084fc" text-anchor="middle">Char</text>
<circle cx="366" cy="342" r="18" fill="#38bdf8" opacity="0.2" stroke="#38bdf8" stroke-width="1.5"/>
<text x="366" y="345" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#38bdf8" text-anchor="middle">Pose</text>
<text x="400" y="340" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#64748b">Overlap =</text>
<text x="400" y="354" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c084fc">artifacts</text>
<!-- ===== DIVIDER ===== -->
<line x1="40" y1="390" x2="560" y2="390" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
<!-- ===== BOTTOM: OPTIMIZER ===== -->
<rect x="20" y="404" width="560" height="24" rx="6" fill="#22c55e" opacity="0.12"/>
<text x="300" y="421" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#22c55e" text-anchor="middle" font-weight="700" letter-spacing="2">LORA OPTIMIZER</text>
<!-- Pipeline: Model → Optimizer [A+B+C] → Output -->
<rect x="20" y="442" width="60" height="28" rx="6" fill="#334155" stroke="#64748b" stroke-width="1"/>
<text x="50" y="460" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8" text-anchor="middle">Model</text>
<line x1="80" y1="456" x2="100" y2="456" stroke="#475569" stroke-width="1.5" marker-end="url(#pa)"/>
<!-- Optimizer box -->
<rect x="108" y="438" width="280" height="36" rx="8" fill="#1e293b" stroke="#22c55e" stroke-width="2"/>
<text x="128" y="454" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#22c55e" font-weight="700">Optimizer</text>
<text x="128" y="467" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#64748b">analyze + resolve + merge</text>
<!-- LoRA chips -->
<rect x="260" y="445" width="36" height="18" rx="4" fill="#f87171" opacity="0.2" stroke="#f87171" stroke-width="0.5"/>
<text x="278" y="458" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#f87171" text-anchor="middle">A</text>
<rect x="302" y="445" width="36" height="18" rx="4" fill="#c084fc" opacity="0.2" stroke="#c084fc" stroke-width="0.5"/>
<text x="320" y="458" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c084fc" text-anchor="middle">B</text>
<rect x="344" y="445" width="36" height="18" rx="4" fill="#38bdf8" opacity="0.2" stroke="#38bdf8" stroke-width="0.5"/>
<text x="362" y="458" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle">C</text>
<line x1="388" y1="456" x2="420" y2="456" stroke="#22c55e" stroke-width="1.5" marker-end="url(#paG)"/>
<rect x="428" y="442" width="60" height="28" rx="6" fill="#22c55e" opacity="0.15" stroke="#22c55e" stroke-width="1.5"/>
<text x="458" y="460" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#22c55e" text-anchor="middle" font-weight="600">Output</text>
<!-- Balanced effect bar -->
<text x="20" y="496" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#64748b">Total effect:</text>
<rect x="100" y="488" width="420" height="12" rx="4" fill="#334155"/>
<rect x="100" y="488" width="200" height="12" rx="4" fill="#22c55e" opacity="0.5"/>
<line x1="300" y1="485" x2="300" y2="503" stroke="#f59e0b" stroke-width="1.5"/>
<text x="300" y="514" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#f59e0b" text-anchor="middle">1.0</text>
<!-- Solution cards: 2 columns -->
<!-- Card 1: Balanced -->
<rect x="20" y="526" width="270" height="130" rx="10" fill="#1e293b" stroke="#22c55e" stroke-width="1"/>
<text x="42" y="550" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#22c55e" font-weight="700">Auto-Balanced Strength</text>
<text x="42" y="568" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Computes weight diffs and normalizes</text>
<text x="42" y="582" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">per group — stays within safe range.</text>
<!-- Visual: balanced bars -->
<rect x="42" y="596" width="230" height="7" rx="2" fill="#334155"/>
<rect x="42" y="596" width="85" height="7" rx="2" fill="#f87171" opacity="0.6"/>
<rect x="42" y="607" width="230" height="7" rx="2" fill="#334155"/>
<rect x="42" y="607" width="73" height="7" rx="2" fill="#c084fc" opacity="0.6"/>
<rect x="42" y="618" width="230" height="7" rx="2" fill="#334155"/>
<rect x="42" y="618" width="62" height="7" rx="2" fill="#38bdf8" opacity="0.6"/>
<rect x="42" y="631" width="230" height="9" rx="3" fill="#334155"/>
<rect x="42" y="631" width="170" height="9" rx="3" fill="#22c55e" opacity="0.4"/>
<text x="42" y="650" font-family="Segoe UI, Arial, sans-serif" font-size="8" fill="#22c55e">Combined — within range</text>
<line x1="210" y1="593" x2="210" y2="642" stroke="#f59e0b" stroke-width="1" stroke-dasharray="3,2"/>
<!-- Card 2: Resolved -->
<rect x="310" y="526" width="270" height="130" rx="10" fill="#1e293b" stroke="#22c55e" stroke-width="1"/>
<text x="332" y="550" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#22c55e" font-weight="700">Conflict Resolution</text>
<text x="332" y="568" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">TIES detects sign conflicts per weight</text>
<text x="332" y="582" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">and elects the dominant direction.</text>
<!-- Visual: conflict resolved -->
<rect x="332" y="598" width="65" height="16" rx="4" fill="#f87171" opacity="0.2" stroke="#f87171" stroke-width="0.5"/>
<text x="365" y="610" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#f87171" text-anchor="middle">A: +0.8</text>
<line x1="402" y1="606" x2="438" y2="606" stroke="#f87171" stroke-width="2.5"/>
<polygon points="438,602 448,606 438,610" fill="#f87171"/>
<rect x="332" y="620" width="65" height="16" rx="4" fill="#c084fc" opacity="0.1" stroke="#c084fc" stroke-width="0.5" stroke-dasharray="2,2"/>
<text x="365" y="632" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c084fc" text-anchor="middle" opacity="0.4">B: −0.7</text>
<line x1="402" y1="628" x2="438" y2="628" stroke="#c084fc" stroke-width="1.5" opacity="0.3" stroke-dasharray="3,2"/>
<text x="465" y="614" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#64748b">=</text>
<rect x="480" y="602" width="44" height="12" rx="3" fill="#22c55e" opacity="0.5"/>
<text x="532" y="613" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#22c55e">+0.8</text>
<text x="480" y="645" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#64748b">Winner keeps strength</text>
<!-- Card 3: Clean Separation (centered) -->
<rect x="120" y="668" width="360" height="76" rx="10" fill="#1e293b" stroke="#22c55e" stroke-width="1"/>
<text x="142" y="690" font-family="Segoe UI, Arial, sans-serif" font-size="13" fill="#22c55e" font-weight="700">Clean Separation</text>
<text x="142" y="708" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">All LoRAs merged in one pass at the weight level —</text>
<text x="142" y="722" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">no sequential contamination.</text>
<!-- Visual: clean circles -->
<circle cx="380" cy="710" r="14" fill="#f87171" opacity="0.15" stroke="#f87171" stroke-width="1.5"/>
<text x="380" y="713" font-family="Segoe UI, Arial, sans-serif" font-size="7" fill="#f87171" text-anchor="middle">Style</text>
<circle cx="416" cy="710" r="14" fill="#c084fc" opacity="0.15" stroke="#c084fc" stroke-width="1.5"/>
<text x="416" y="713" font-family="Segoe UI, Arial, sans-serif" font-size="7" fill="#c084fc" text-anchor="middle">Char</text>
<circle cx="452" cy="710" r="14" fill="#38bdf8" opacity="0.15" stroke="#38bdf8" stroke-width="1.5"/>
<text x="452" y="713" font-family="Segoe UI, Arial, sans-serif" font-size="7" fill="#38bdf8" text-anchor="middle">Pose</text>
</svg>