Menu

Tree [cd4ba1] main latest_cu121 /
 History

HTTPS access


File Date Author Commit
 backend 2024-08-26 layerdiffusion layerdiffusion [f22b80] restrict baking to 16bits
 embeddings 2022-09-30 AUTOMATIC AUTOMATIC [98cc6c] add embeddings dir
 extensions 2022-10-29 AUTOMATIC AUTOMATIC [78b879] delete the submodule dir (why do you keep doing...
 extensions-builtin 2024-08-22 Igor Aherne Igor Aherne [865d6d] bugfix: controlnet works in API - image no long...
 html 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 javascript 2024-08-25 DenOfEquity DenOfEquity [424baa] Update dragdrop.js
 k_diffusion 2024-08-20 Panchovix Panchovix [2fc170] Add samplers: HeunPP2, IPDNM, IPNDM_V, DEIS
 localizations 2022-11-08 AUTOMATIC AUTOMATIC [ac0856] Remove old localizations from the main repo.
 models 2024-08-06 lllyasviel lllyasviel [e8e5fd] Create text encoder folder
 modules 2024-08-26 DenOfEquity DenOfEquity [d7b812] Update txt2img.py: fix the hrfix fix
 modules_forge 2024-08-25 DenOfEquity DenOfEquity [8c6b64] main_entry.py: add support for new text_encoder...
 packages_3rdparty 2024-08-26 layerdiffusion layerdiffusion [acf99d] fix old version of pytorch
 scripts 2024-08-25 DenOfEquity DenOfEquity [187faf] restore postprocessing_focal_crop.py
 .eslintignore 2024-02-09 Chenlei Hu Chenlei Hu [66c224] Ignore ControlNet extension in eslint (#136)
 .eslintrc.js 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 .git-blame-ignore-revs 2023-05-19 Aarni Koskela Aarni Koskela [330f14] Add .git-blame-ignore-revs
 .gitignore 2024-08-19 layerdiffusion layerdiffusion [4e7c8b] add gitignore
 .pylintrc 2022-10-15 Robert Smieja Robert Smieja [d3ffc9] Add basic Pylint to catch syntax errors on PRs
 CHANGELOG.md 2024-07-27 layerdiffusion layerdiffusion [d4e763] sync change log
 CITATION.cff 2023-08-21 AUTOMATIC1111 AUTOMATIC1111 [18fb52] citation mk2
 CODEOWNERS 2024-01-26 lllyasviel lllyasviel [077dfe] Update CODEOWNERS
 LICENSE.txt 2024-08-09 layerdiffusion layerdiffusion [bf94f4] license
 README.md 2024-08-26 layerdiffusion layerdiffusion [7cd94b] Revert "Update README.md"
 _typos.toml 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 download_supported_configs.py 2024-08-12 layerdiffusion layerdiffusion [12a02b] upload Schnell support files
 environment-wsl2.yaml 2023-04-03 Vladimir Mandic Vladimir Mandic [4fa59b] update xformers
 launch.py 2024-08-19 layerdiffusion layerdiffusion [d38e56] Implement some rethinking about LoRA system
 package.json 2023-05-17 Aarni Koskela Aarni Koskela [13f4c6] Add basic ESLint configuration for formatting
 pyproject.toml 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 requirements_versions.txt 2024-08-21 layerdiffusion layerdiffusion [3e2530] huggingface-hub==0.24.6
 script.js 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 spaces.py 2024-08-22 layerdiffusion layerdiffusion [64b5ce] revise space memory management subsystem
 style.css 2024-08-17 lllyasviel lllyasviel [93b40f] Forge Space and BiRefNet
 styles_integrated.csv 2024-08-11 lllyasviel lllyasviel [cfa524] forge 2.0.0
 webui-macos-env.sh 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 webui-user.bat 2024-02-09 Yuki Shindo Yuki Shindo [847d45] Fix command line arguments format in webui-user...
 webui-user.sh 2023-05-30 Aarni Koskela Aarni Koskela [5fcdaa] Vendor in the single module used from taming_tr...
 webui.bat 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10
 webui.py 2024-08-17 lllyasviel lllyasviel [93b40f] Forge Space and BiRefNet
 webui.sh 2024-07-26 layerdiffusion layerdiffusion [e26abf] Gradio 4 + WebUI 1.10

Read Me

Stable Diffusion WebUI Forge

Stable Diffusion WebUI Forge is a platform on top of Stable Diffusion WebUI (based on Gradio ) to make development easier, optimize resource management, speed up inference, and study experimental features.

The name "Forge" is inspired from "Minecraft Forge". This project is aimed at becoming SD WebUI's Forge.

Forge is currently based on SD-WebUI 1.10.1 at this commit. (Because original SD-WebUI is almost static now, Forge will sync with original WebUI every 90 days, or when important fixes.)

Quick List

Gradio 4 UI Must Read (TLDR: You need to use RIGHT MOUSE BUTTON to move canvas!)

Flux Tutorial (BitsandBytes Models, NF4, "GPU Weight", "Offload Location", "Offload Method", etc)

Flux Tutorial 2 (Seperated Full Models, GGUF, Technically Correct Comparison between GGUF and NF4, etc)

How to Skip" Patching LoRAs"; How to only load LoRA one time rather than each generation; How to report LoRAs that do not work

Report Flux Performance Problems (TLDR: DO NOT set "GPU Weight" too high! Lower "GPU Weight" solves 99% problems!)

How to solve "Connection errored out" / "Press anykey to continue ..." / etc

(Save Flux BitsandBytes UNet/Checkpoint)

LayerDiffuse Transparent Image Editing

Tell us what is missing in ControlNet Integrated

(Policy) Soft Advertisement Removal Policy

(Flux BNB NF4 / GGUF Q8_0/Q5_0/Q5_1/Q4_0/Q4_1 are all natively supported with GPU weight slider and Quene/Async Swap toggle and swap location toggle. All Flux BNB NF4 / GGUF Q8_0/Q5_0/Q4_0 have LoRA support.)

Installing Forge

Just use this one-click installation package (with git and python included).

>>> Click Here to Download One-Click Package (CUDA 12.1 + Pytorch 2.3.1) <<<

Some other CUDA/Torch Versions:

Forge with CUDA 12.1 + Pytorch 2.3.1 <- Recommended

Forge with CUDA 12.4 + Pytorch 2.4 <- Fastest, but MSVC may be broken, xformers may not work

Forge with CUDA 12.1 + Pytorch 2.1 <- the previously used old environments

After you download, you uncompress, use update.bat to update, and use run.bat to run.

Note that running update.bat is important, otherwise you may be using a previous version with potential bugs unfixed.

image

Advanced Install

If you are proficient in Git and you want to install Forge as another branch of SD-WebUI, please see here. In this way, you can reuse all SD checkpoints and all extensions you installed previously in your OG SD-WebUI, but you should know what you are doing.

If you know what you are doing, you can also install Forge using same method as SD-WebUI. (Install Git, Python, Git Clone the forge repo https://github.com/lllyasviel/stable-diffusion-webui-forge.git and then run webui-user.bat).

Previous Versions

You can download previous versions here.

Forge Status

Based on manual test one-by-one:

Component Status Last Test
Basic Diffusion Normal 2024 July 27
GPU Memory Management System Normal 2024 July 27
LoRAs Normal 2024 July 27
All Preprocessors Normal 2024 July 27
All ControlNets Normal 2024 July 27
All IP-Adapters Normal 2024 July 27
All Instant-IDs Normal 2024 July 27
All Reference-only Methods Normal 2024 July 27
All Integrated Extensions Normal 2024 July 27
Popular Extensions (Adetailer, etc) Normal 2024 July 27
Gradio 4 UIs Normal 2024 July 27
Gradio 4 Forge Canvas Normal 2024 July 27
LoRA/Checkpoint Selection UI for Gradio 4 Normal 2024 July 27
Photopea/OpenposeEditor/etc for ControlNet Normal 2024 July 27
Wacom 128 level touch pressure support for Canvas Normal 2024 July 15
Microsoft Surface touch pressure support for Canvas Broken, pending fix 2024 July 29
txt2img and img2img API Endpoints Broken, pending fix 2024 July 29

Feel free to open issue if anything is broken and I will take a look every several days. If I do not update this "Forge Status" then it means I cannot reproduce any problem. In that case, fresh re-install should help most.

UnetPatcher

Below are self-supported single file of all codes to implement FreeU V2.

See also extension-builtin/sd_forge_freeu/scripts/forge_freeu.py:

import torch
import gradio as gr

from modules import scripts


def Fourier_filter(x, threshold, scale):
    # FFT
    x_freq = torch.fft.fftn(x.float(), dim=(-2, -1))
    x_freq = torch.fft.fftshift(x_freq, dim=(-2, -1))

    B, C, H, W = x_freq.shape
    mask = torch.ones((B, C, H, W), device=x.device)

    crow, ccol = H // 2, W // 2
    mask[..., crow - threshold:crow + threshold, ccol - threshold:ccol + threshold] = scale
    x_freq = x_freq * mask

    # IFFT
    x_freq = torch.fft.ifftshift(x_freq, dim=(-2, -1))
    x_filtered = torch.fft.ifftn(x_freq, dim=(-2, -1)).real

    return x_filtered.to(x.dtype)


def patch_freeu_v2(unet_patcher, b1, b2, s1, s2):
    model_channels = unet_patcher.model.diffusion_model.config["model_channels"]
    scale_dict = {model_channels * 4: (b1, s1), model_channels * 2: (b2, s2)}
    on_cpu_devices = {}

    def output_block_patch(h, hsp, transformer_options):
        scale = scale_dict.get(h.shape[1], None)
        if scale is not None:
            hidden_mean = h.mean(1).unsqueeze(1)
            B = hidden_mean.shape[0]
            hidden_max, _ = torch.max(hidden_mean.view(B, -1), dim=-1, keepdim=True)
            hidden_min, _ = torch.min(hidden_mean.view(B, -1), dim=-1, keepdim=True)
            hidden_mean = (hidden_mean - hidden_min.unsqueeze(2).unsqueeze(3)) / (hidden_max - hidden_min).unsqueeze(2).unsqueeze(3)

            h[:, :h.shape[1] // 2] = h[:, :h.shape[1] // 2] * ((scale[0] - 1) * hidden_mean + 1)

            if hsp.device not in on_cpu_devices:
                try:
                    hsp = Fourier_filter(hsp, threshold=1, scale=scale[1])
                except:
                    print("Device", hsp.device, "does not support the torch.fft.")
                    on_cpu_devices[hsp.device] = True
                    hsp = Fourier_filter(hsp.cpu(), threshold=1, scale=scale[1]).to(hsp.device)
            else:
                hsp = Fourier_filter(hsp.cpu(), threshold=1, scale=scale[1]).to(hsp.device)

        return h, hsp

    m = unet_patcher.clone()
    m.set_model_output_block_patch(output_block_patch)
    return m


class FreeUForForge(scripts.Script):
    sorting_priority = 12  # It will be the 12th item on UI.

    def title(self):
        return "FreeU Integrated"

    def show(self, is_img2img):
        # make this extension visible in both txt2img and img2img tab.
        return scripts.AlwaysVisible

    def ui(self, *args, **kwargs):
        with gr.Accordion(open=False, label=self.title()):
            freeu_enabled = gr.Checkbox(label='Enabled', value=False)
            freeu_b1 = gr.Slider(label='B1', minimum=0, maximum=2, step=0.01, value=1.01)
            freeu_b2 = gr.Slider(label='B2', minimum=0, maximum=2, step=0.01, value=1.02)
            freeu_s1 = gr.Slider(label='S1', minimum=0, maximum=4, step=0.01, value=0.99)
            freeu_s2 = gr.Slider(label='S2', minimum=0, maximum=4, step=0.01, value=0.95)

        return freeu_enabled, freeu_b1, freeu_b2, freeu_s1, freeu_s2

    def process_before_every_sampling(self, p, *script_args, **kwargs):
        # This will be called before every sampling.
        # If you use highres fix, this will be called twice.

        freeu_enabled, freeu_b1, freeu_b2, freeu_s1, freeu_s2 = script_args

        if not freeu_enabled:
            return

        unet = p.sd_model.forge_objects.unet

        unet = patch_freeu_v2(unet, freeu_b1, freeu_b2, freeu_s1, freeu_s2)

        p.sd_model.forge_objects.unet = unet

        # Below codes will add some logs to the texts below the image outputs on UI.
        # The extra_generation_params does not influence results.
        p.extra_generation_params.update(dict(
            freeu_enabled=freeu_enabled,
            freeu_b1=freeu_b1,
            freeu_b2=freeu_b2,
            freeu_s1=freeu_s1,
            freeu_s2=freeu_s2,
        ))

        return

See also Forge's Unet Implementation.

Under Construction

WebUI Forge is now under some constructions, and docs / UI / functionality may change with updates.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.