diff --git a/README.md b/README.md
index 530d6e097..94a9edf64 100644
--- a/README.md
+++ b/README.md
@@ -19,14 +19,15 @@ If you are looking an amazing simple-to-use Stable Diffusion tool, I'd suggest [
### Fork does differ in few things
-- New logger
+- New installer
+- New logger
- New error and exception handlers
-- Built-in performance profiler
- Enhanced environment tuning
+- Optimized startup and models lazy-loading
+- Built-in performance profiler
- Updated libraries to latest known compatible versions
- Includes opinionated **System** and **Options** configuration
- Does not rely on `Accelerate` as it only affects distributed systems
-- Optimized startup
Gradio web server will be initialized much earlier which model load is done in the background
Faster model loading plus ability to fallback on corrupt models
- Uses simplified folder structure
@@ -36,35 +37,18 @@ If you are looking an amazing simple-to-use Stable Diffusion tool, I'd suggest [
- Majority of settings configurable via UI without the need for command line flags
e.g, cross-optimization methods, system folders, etc.
-### User Interface
-
-- Includes updated **UI**: reskinned and reorganized
- Black and orange dark theme with fixed width options panels and larger previews
-
### Optimizations
- Optimized for `Torch` 2.0
- Runs with `SDP` memory attention enabled by default if supported by system
+ *Note*: `xFormers` and other cross-optimization methods are still available
- Auto-adjust parameters when running on **CPU** or **CUDA**
*Note:* AMD and M1 platforms are supported, but without out-of-the-box optimizations
-### Removed
-
-- Drops compatibility with older versions of `python` and requires **3.9** or **3.10**
-- Drops localizations
-- Drops automated tests
-
-### Integrated CLI/API tools
-
-Fork adds extra functionality:
-
-- New skin and UI layout
-- Ships with set of **CLI** tools that rely on *SD API* for execution:
- e.g. `generate`, `train`, `bench`, etc.
- [Full list]()
-
### Integrated Extensions
+Hand-picked list of extensions that are deeply integrated into core workflows:
+
- [System Info](https://github.com/vladmandic/sd-extension-system-info)
- [ControlNet](https://github.com/Mikubill/sd-webui-controlnet)
- [Image Browser](https://github.com/AlUlkesh/stable-diffusion-webui-images-browser)
@@ -76,6 +60,26 @@ Fork adds extra functionality:
- [Steps Animation](https://github.com/vladmandic/sd-extension-steps-animation)
- [Seed Travel](https://github.com/yownas/seed_travel)
- [Model Keyword](https://github.com/mix1009/model-keyword)
+- [Multi-Diffusion Upscaler](https://github.com/pkuliyi2015/multidiffusion-upscaler-for-automatic1111)
+
+### User Interface
+
+- Includes updated **UI**: reskinned and reorganized
+ Black and orange dark theme with fixed width options panels and larger previews
+
+### Removed
+
+- Drops compatibility with older versions of `python` and requires **3.9** or **3.10**
+- Drops localizations
+
+### Integrated CLI/API tools
+
+Fork adds extra functionality:
+
+- New skin and UI layout
+- Ships with set of **CLI** tools that rely on *SD API* for execution:
+ e.g. `generate`, `train`, `bench`, etc.
+ [Full list]()
diff --git a/TODO.md b/TODO.md
index cec1410d5..6da182fde 100644
--- a/TODO.md
+++ b/TODO.md
@@ -7,7 +7,8 @@ Stuff to be fixed...
- Reconnect UI to ops in progress on browser restart
- Redo Extensions tab: see
- Cleanup & integrate CSS into single file
-- Replace EXIF metadata handler
+- Allow user themes
+- Replace PngInfo/EXIF metadata handler
- Pick & merge PRs from main repo
- Create new GitHub hooks/actions for CI/CD
- Investigate integration with `Torch-DirectML`
diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info
index 0254985c8..3e528a56c 160000
--- a/extensions-builtin/sd-extension-system-info
+++ b/extensions-builtin/sd-extension-system-info
@@ -1 +1 @@
-Subproject commit 0254985c819240fc7e065870828d3e38948c0dd7
+Subproject commit 3e528a56c3c3ca614d20767e0d00740b9b1c336c
diff --git a/extensions-builtin/sd-webui-controlnet b/extensions-builtin/sd-webui-controlnet
index c9a88e5b6..33608671c 160000
--- a/extensions-builtin/sd-webui-controlnet
+++ b/extensions-builtin/sd-webui-controlnet
@@ -1 +1 @@
-Subproject commit c9a88e5b66c396ae5ebe99528df25a7b9c924cc6
+Subproject commit 33608671cac0ead9e9e0206b9a613a66f95f5fb9
diff --git a/requirements.txt b/requirements.txt
index 6e18d31dd..8140b5cf1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,7 +9,6 @@ basicsr
bitsandbytes
blendmodes
clean-fid
-clip
easydev
extcolors
facexlib
@@ -29,6 +28,7 @@ lmdb
lpips
numpy
omegaconf
+open-clip-torch
opencv-contrib-python
opencv-python
piexif
diff --git a/setup.py b/setup.py
index baead2144..c0a6ddfd3 100644
--- a/setup.py
+++ b/setup.py
@@ -51,11 +51,14 @@ def setup_logging(clean=False):
# check if package is installed
-def installed(package):
+def installed(package, friendly: str = None):
import pkg_resources
ok = True
try:
- pkgs = [p for p in package.split() if not p.startswith('-') and not p.startswith('git+') and not p.startswith('http') and not p.startswith('=')]
+ if friendly:
+ pkgs = [friendly]
+ else:
+ pkgs = [p for p in package.split() if not p.startswith('-') and not p.startswith('git+') and not p.startswith('http') and not p.startswith('=')]
for pkg in pkgs:
p = pkg.split('==')
spec = pkg_resources.working_set.by_key.get(p[0], None) # more reliable than importlib
@@ -64,15 +67,15 @@ def installed(package):
if spec is None:
spec = pkg_resources.working_set.by_key.get(p[0].replace('_', '-'), None) # check name variations
ok = ok and spec is not None
- if ok and len(p) > 1:
+ if ok:
version = pkg_resources.get_distribution(p[0]).version
- ok = ok and version == p[1]
- if not ok:
- log.warning(f"Package wrong version found: {p[0]} {version} required {p[1]}")
- # if ok:
- # log.debug(f"Package already installed: {p[0]} {version}")
- # else:
- # log.debug(f"Package not installed: {p[0]} {version}")
+ log.debug(f"Package version found: {p[0]} {version}")
+ if len(p) > 1:
+ ok = ok and version == p[1]
+ if not ok:
+ log.warning(f"Package wrong version: {p[0]} required {p[1]}")
+ else:
+ log.debug(f"Package version not found: {p[0]}")
return ok
except ModuleNotFoundError:
log.debug(f"Package not installed: {pkgs}")
@@ -80,7 +83,7 @@ def installed(package):
# install package using pip if not already installed
-def install(package):
+def install(package, friendly: str = None):
def pip(arg: str):
log.debug(f"Running pip: {arg}")
result = subprocess.run(f'"{sys.executable}" -m pip {arg}', shell=True, check=False, env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
@@ -94,7 +97,7 @@ def install(package):
log.debug(f'Pip output: {txt}')
return txt
- if not installed(package):
+ if not installed(package, friendly):
pip(f"install --upgrade {package}")
@@ -182,12 +185,12 @@ def check_torch():
# install required packages
def install_packages():
log.info('Installing packages')
- gfpgan_package = os.environ.get('GFPGAN_PACKAGE', "git+https://github.com/TencentARC/GFPGAN.git@8d2447a2d918f8eba5a4a01463fd48e45126a379")
+ # gfpgan_package = os.environ.get('GFPGAN_PACKAGE', "git+https://github.com/TencentARC/GFPGAN.git@8d2447a2d918f8eba5a4a01463fd48e45126a379")
+ # openclip_package = os.environ.get('OPENCLIP_PACKAGE', "git+https://github.com/mlfoundations/open_clip.git@bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b")
+ # install(gfpgan_package, 'gfpgan')
+ # install(openclip_package, 'open-clip-torch')
clip_package = os.environ.get('CLIP_PACKAGE', "git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1")
- openclip_package = os.environ.get('OPENCLIP_PACKAGE', "git+https://github.com/mlfoundations/open_clip.git@bb6e834e9c70d9c27d0dc3ecedeebeaeb1ffad6b")
- install(gfpgan_package)
- install(clip_package)
- install(openclip_package)
+ install(clip_package, 'clip')
try:
xformers_package = os.environ.get('XFORMERS_PACKAGE', 'xformers')
install(f'--no-deps {xformers_package}')
@@ -310,7 +313,7 @@ def set_environment():
def check_extensions():
- newest_all = 0
+ newest_all = os.path.getmtime('requirements.txt')
for folder in ['extensions-builtin', 'extensions']:
extensions_dir = os.path.join(os.path.dirname(__file__), folder)
extensions = list_extensions(extensions_dir)
@@ -369,9 +372,7 @@ def check_timestamp():
lines = f.readlines()
for line in lines:
if 'Setup complete without errors' in line:
- setup_time = line.split(' ')[0]
- return True
- # setup_time = os.path.getmtime('setup.log')
+ setup_time = int(line.split(' ')[-1])
version_time = int(git('log -1 --pretty=format:"%at"'))
log.debug(f'Repository update time: {time.ctime(int(version_time))}')
if setup_time == -1:
@@ -380,6 +381,7 @@ def check_timestamp():
if setup_time < version_time:
return False
extension_time = check_extensions()
+ log.debug(f'Latest extensions time: {time.ctime(extension_time)}')
if setup_time < extension_time:
return False
return True