Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| baf6946e06 | |||
| 6f754ab98b | |||
| eed7b2776e | |||
| cbc38a903b | |||
| eeb685b0e5 | |||
| cbe1799797 | |||
| b6af0a3809 | |||
| 8c3e64f4f6 | |||
| 3ee1238630 | |||
| 17a66931da | |||
| 915d1da1cd | |||
| 884435796a |
@@ -1,3 +1,23 @@
|
|||||||
|
## 1.3.2
|
||||||
|
|
||||||
|
### Bug Fixes:
|
||||||
|
* fix files served out of tmp directory even if they are saved to disk
|
||||||
|
* fix postprocessing overwriting parameters
|
||||||
|
|
||||||
|
## 1.3.1
|
||||||
|
|
||||||
|
### Features:
|
||||||
|
* revert default cross attention optimization to Doggettx
|
||||||
|
|
||||||
|
### Bug Fixes:
|
||||||
|
* fix bug: LoRA don't apply on dropdown list sd_lora
|
||||||
|
* fix png info always added even if setting is not enabled
|
||||||
|
* fix some fields not applying in xyz plot
|
||||||
|
* fix "hires. fix" prompt sharing same labels with txt2img_prompt
|
||||||
|
* fix lora hashes not being added properly to infotex if there is only one lora
|
||||||
|
* fix --use-cpu failing to work properly at startup
|
||||||
|
* make --disable-opt-split-attention command line option work again
|
||||||
|
|
||||||
## 1.3.0
|
## 1.3.0
|
||||||
|
|
||||||
### Features:
|
### Features:
|
||||||
|
|||||||
+1
-1
@@ -62,7 +62,7 @@ parser.add_argument("--opt-split-attention-invokeai", action='store_true', help=
|
|||||||
parser.add_argument("--opt-split-attention-v1", action='store_true', help="prefer older version of split attention optimization for automatic choice of optimization")
|
parser.add_argument("--opt-split-attention-v1", action='store_true', help="prefer older version of split attention optimization for automatic choice of optimization")
|
||||||
parser.add_argument("--opt-sdp-attention", action='store_true', help="prefer scaled dot product cross-attention layer optimization for automatic choice of optimization; requires PyTorch 2.*")
|
parser.add_argument("--opt-sdp-attention", action='store_true', help="prefer scaled dot product cross-attention layer optimization for automatic choice of optimization; requires PyTorch 2.*")
|
||||||
parser.add_argument("--opt-sdp-no-mem-attention", action='store_true', help="prefer scaled dot product cross-attention layer optimization without memory efficient attention for automatic choice of optimization, makes image generation deterministic; requires PyTorch 2.*")
|
parser.add_argument("--opt-sdp-no-mem-attention", action='store_true', help="prefer scaled dot product cross-attention layer optimization without memory efficient attention for automatic choice of optimization, makes image generation deterministic; requires PyTorch 2.*")
|
||||||
parser.add_argument("--disable-opt-split-attention", action='store_true', help="does not do anything")
|
parser.add_argument("--disable-opt-split-attention", action='store_true', help="prefer no cross-attention layer optimization for automatic choice of optimization")
|
||||||
parser.add_argument("--disable-nan-check", action='store_true', help="do not check if produced images/latent spaces have nans; useful for running without a checkpoint in CI")
|
parser.add_argument("--disable-nan-check", action='store_true', help="do not check if produced images/latent spaces have nans; useful for running without a checkpoint in CI")
|
||||||
parser.add_argument("--use-cpu", nargs='+', help="use CPU as torch device for specified modules", default=[], type=str.lower)
|
parser.add_argument("--use-cpu", nargs='+', help="use CPU as torch device for specified modules", default=[], type=str.lower)
|
||||||
parser.add_argument("--listen", action='store_true', help="launch gradio with 0.0.0.0 as server name, allowing to respond to network requests")
|
parser.add_argument("--listen", action='store_true', help="launch gradio with 0.0.0.0 as server name, allowing to respond to network requests")
|
||||||
|
|||||||
@@ -488,10 +488,6 @@ def save_image_with_geninfo(image, geninfo, filename, extension=None, existing_p
|
|||||||
|
|
||||||
image_format = Image.registered_extensions()[extension]
|
image_format = Image.registered_extensions()[extension]
|
||||||
|
|
||||||
existing_pnginfo = existing_pnginfo or {}
|
|
||||||
if opts.enable_pnginfo:
|
|
||||||
existing_pnginfo['parameters'] = geninfo
|
|
||||||
|
|
||||||
if extension.lower() == '.png':
|
if extension.lower() == '.png':
|
||||||
if opts.enable_pnginfo:
|
if opts.enable_pnginfo:
|
||||||
pnginfo_data = PngImagePlugin.PngInfo()
|
pnginfo_data = PngImagePlugin.PngInfo()
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ def apply_optimizations():
|
|||||||
|
|
||||||
if selection == "None":
|
if selection == "None":
|
||||||
matching_optimizer = None
|
matching_optimizer = None
|
||||||
|
elif selection == "Automatic" and shared.cmd_opts.disable_opt_split_attention:
|
||||||
|
matching_optimizer = None
|
||||||
elif matching_optimizer is None:
|
elif matching_optimizer is None:
|
||||||
matching_optimizer = optimizers[0]
|
matching_optimizer = optimizers[0]
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class SdOptimizationSdpNoMem(SdOptimization):
|
|||||||
name = "sdp-no-mem"
|
name = "sdp-no-mem"
|
||||||
label = "scaled dot product without memory efficient attention"
|
label = "scaled dot product without memory efficient attention"
|
||||||
cmd_opt = "opt_sdp_no_mem_attention"
|
cmd_opt = "opt_sdp_no_mem_attention"
|
||||||
priority = 90
|
priority = 80
|
||||||
|
|
||||||
def is_available(self):
|
def is_available(self):
|
||||||
return hasattr(torch.nn.functional, "scaled_dot_product_attention") and callable(torch.nn.functional.scaled_dot_product_attention)
|
return hasattr(torch.nn.functional, "scaled_dot_product_attention") and callable(torch.nn.functional.scaled_dot_product_attention)
|
||||||
@@ -73,7 +73,7 @@ class SdOptimizationSdp(SdOptimizationSdpNoMem):
|
|||||||
name = "sdp"
|
name = "sdp"
|
||||||
label = "scaled dot product"
|
label = "scaled dot product"
|
||||||
cmd_opt = "opt_sdp_attention"
|
cmd_opt = "opt_sdp_attention"
|
||||||
priority = 80
|
priority = 70
|
||||||
|
|
||||||
def apply(self):
|
def apply(self):
|
||||||
ldm.modules.attention.CrossAttention.forward = scaled_dot_product_attention_forward
|
ldm.modules.attention.CrossAttention.forward = scaled_dot_product_attention_forward
|
||||||
@@ -116,7 +116,7 @@ class SdOptimizationInvokeAI(SdOptimization):
|
|||||||
class SdOptimizationDoggettx(SdOptimization):
|
class SdOptimizationDoggettx(SdOptimization):
|
||||||
name = "Doggettx"
|
name = "Doggettx"
|
||||||
cmd_opt = "opt_split_attention"
|
cmd_opt = "opt_split_attention"
|
||||||
priority = 20
|
priority = 90
|
||||||
|
|
||||||
def apply(self):
|
def apply(self):
|
||||||
ldm.modules.attention.CrossAttention.forward = split_cross_attention_forward
|
ldm.modules.attention.CrossAttention.forward = split_cross_attention_forward
|
||||||
|
|||||||
@@ -313,8 +313,6 @@ def load_model_weights(model, checkpoint_info: CheckpointInfo, state_dict, timer
|
|||||||
|
|
||||||
timer.record("apply half()")
|
timer.record("apply half()")
|
||||||
|
|
||||||
devices.dtype = torch.float32 if shared.cmd_opts.no_half else torch.float16
|
|
||||||
devices.dtype_vae = torch.float32 if shared.cmd_opts.no_half or shared.cmd_opts.no_half_vae else torch.float16
|
|
||||||
devices.dtype_unet = model.model.diffusion_model.dtype
|
devices.dtype_unet = model.model.diffusion_model.dtype
|
||||||
devices.unet_needs_upcast = shared.cmd_opts.upcast_sampling and devices.dtype == torch.float16 and devices.dtype_unet == torch.float16
|
devices.unet_needs_upcast = shared.cmd_opts.upcast_sampling and devices.dtype == torch.float16 and devices.dtype_unet == torch.float16
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import threading
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
import gradio as gr
|
import gradio as gr
|
||||||
|
import torch
|
||||||
import tqdm
|
import tqdm
|
||||||
|
|
||||||
import modules.interrogate
|
import modules.interrogate
|
||||||
@@ -76,6 +77,9 @@ cmd_opts.disable_extension_access = (cmd_opts.share or cmd_opts.listen or cmd_op
|
|||||||
devices.device, devices.device_interrogate, devices.device_gfpgan, devices.device_esrgan, devices.device_codeformer = \
|
devices.device, devices.device_interrogate, devices.device_gfpgan, devices.device_esrgan, devices.device_codeformer = \
|
||||||
(devices.cpu if any(y in cmd_opts.use_cpu for y in [x, 'all']) else devices.get_optimal_device() for x in ['sd', 'interrogate', 'gfpgan', 'esrgan', 'codeformer'])
|
(devices.cpu if any(y in cmd_opts.use_cpu for y in [x, 'all']) else devices.get_optimal_device() for x in ['sd', 'interrogate', 'gfpgan', 'esrgan', 'codeformer'])
|
||||||
|
|
||||||
|
devices.dtype = torch.float32 if cmd_opts.no_half else torch.float16
|
||||||
|
devices.dtype_vae = torch.float32 if cmd_opts.no_half or cmd_opts.no_half_vae else torch.float16
|
||||||
|
|
||||||
device = devices.device
|
device = devices.device
|
||||||
weight_load_location = None if cmd_opts.lowram else "cpu"
|
weight_load_location = None if cmd_opts.lowram else "cpu"
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
|
import warnings
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import zlib
|
import zlib
|
||||||
from PIL import Image, ImageDraw, ImageFont
|
from PIL import Image, ImageDraw
|
||||||
import torch
|
import torch
|
||||||
|
|
||||||
|
|
||||||
@@ -129,14 +131,17 @@ def extract_image_data_embed(image):
|
|||||||
|
|
||||||
|
|
||||||
def caption_image_overlay(srcimage, title, footerLeft, footerMid, footerRight, textfont=None):
|
def caption_image_overlay(srcimage, title, footerLeft, footerMid, footerRight, textfont=None):
|
||||||
|
from modules.images import get_font
|
||||||
|
if textfont:
|
||||||
|
warnings.warn(
|
||||||
|
'passing in a textfont to caption_image_overlay is deprecated and does nothing',
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
from math import cos
|
from math import cos
|
||||||
|
|
||||||
image = srcimage.copy()
|
image = srcimage.copy()
|
||||||
fontsize = 32
|
fontsize = 32
|
||||||
if textfont is None:
|
|
||||||
from modules.images import get_font
|
|
||||||
textfont = get_font(fontsize)
|
|
||||||
|
|
||||||
factor = 1.5
|
factor = 1.5
|
||||||
gradient = Image.new('RGBA', (1, image.size[1]), color=(0, 0, 0, 0))
|
gradient = Image.new('RGBA', (1, image.size[1]), color=(0, 0, 0, 0))
|
||||||
for y in range(image.size[1]):
|
for y in range(image.size[1]):
|
||||||
@@ -147,12 +152,12 @@ def caption_image_overlay(srcimage, title, footerLeft, footerMid, footerRight, t
|
|||||||
|
|
||||||
draw = ImageDraw.Draw(image)
|
draw = ImageDraw.Draw(image)
|
||||||
|
|
||||||
font = ImageFont.truetype(textfont, fontsize)
|
font = get_font(fontsize)
|
||||||
padding = 10
|
padding = 10
|
||||||
|
|
||||||
_, _, w, h = draw.textbbox((0, 0), title, font=font)
|
_, _, w, h = draw.textbbox((0, 0), title, font=font)
|
||||||
fontsize = min(int(fontsize * (((image.size[0]*0.75)-(padding*4))/w)), 72)
|
fontsize = min(int(fontsize * (((image.size[0]*0.75)-(padding*4))/w)), 72)
|
||||||
font = ImageFont.truetype(textfont, fontsize)
|
font = get_font(fontsize)
|
||||||
_, _, w, h = draw.textbbox((0, 0), title, font=font)
|
_, _, w, h = draw.textbbox((0, 0), title, font=font)
|
||||||
draw.text((padding, padding), title, anchor='lt', font=font, fill=(255, 255, 255, 230))
|
draw.text((padding, padding), title, anchor='lt', font=font, fill=(255, 255, 255, 230))
|
||||||
|
|
||||||
@@ -163,7 +168,7 @@ def caption_image_overlay(srcimage, title, footerLeft, footerMid, footerRight, t
|
|||||||
_, _, w, h = draw.textbbox((0, 0), footerRight, font=font)
|
_, _, w, h = draw.textbbox((0, 0), footerRight, font=font)
|
||||||
fontsize_right = min(int(fontsize * (((image.size[0]/3)-(padding))/w)), 72)
|
fontsize_right = min(int(fontsize * (((image.size[0]/3)-(padding))/w)), 72)
|
||||||
|
|
||||||
font = ImageFont.truetype(textfont, min(fontsize_left, fontsize_mid, fontsize_right))
|
font = get_font(min(fontsize_left, fontsize_mid, fontsize_right))
|
||||||
|
|
||||||
draw.text((padding, image.size[1]-padding), footerLeft, anchor='ls', font=font, fill=(255, 255, 255, 230))
|
draw.text((padding, image.size[1]-padding), footerLeft, anchor='ls', font=font, fill=(255, 255, 255, 230))
|
||||||
draw.text((image.size[0]/2, image.size[1]-padding), footerMid, anchor='ms', font=font, fill=(255, 255, 255, 230))
|
draw.text((image.size[0]/2, image.size[1]-padding), footerMid, anchor='ms', font=font, fill=(255, 255, 255, 230))
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ transformers==4.25.1
|
|||||||
accelerate==0.18.0
|
accelerate==0.18.0
|
||||||
basicsr==1.4.2
|
basicsr==1.4.2
|
||||||
gfpgan==1.3.8
|
gfpgan==1.3.8
|
||||||
gradio==3.31.0
|
gradio==3.32.0
|
||||||
numpy==1.23.5
|
numpy==1.23.5
|
||||||
Pillow==9.5.0
|
Pillow==9.5.0
|
||||||
realesrgan==0.3.0
|
realesrgan==0.3.0
|
||||||
|
|||||||
Reference in New Issue
Block a user