Skip to content

Commit 6cf445d

Browse files
committed
add ras-sd35 experimental
Signed-off-by: Vladimir Mandic <mandic00@live.com>
1 parent 041f0bb commit 6cf445d

18 files changed

+777
-17
lines changed

.pylintrc

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,21 @@ ignore-paths=/usr/lib/.*$,
2323
modules/k-diffusion,
2424
modules/ldsr,
2525
modules/meissonic,
26+
modules/mod,
2627
modules/omnigen,
2728
modules/onnx_impl,
2829
modules/pag,
2930
modules/pixelsmith,
3031
modules/prompt_parser_xhinker.py,
3132
modules/pulid/eva_clip,
33+
modules/ras,
3234
modules/rife,
3335
modules/schedulers,
3436
modules/taesd,
3537
modules/teacache,
3638
modules/todo,
3739
modules/unipc,
3840
modules/xadapter,
39-
modules/mod,
4041
repositories,
4142
extensions-builtin/Lora,
4243
extensions-builtin/sd-webui-agent-scheduler,

.ruff.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ exclude = [
1717
"modules/k-diffusion",
1818
"modules/ldsr",
1919
"modules/meissonic",
20+
"modules/mod",
2021
"modules/omnigen",
2122
"modules/pag",
2223
"modules/pixelsmith",
2324
"modules/postprocess/aurasr_arch.py",
2425
"modules/prompt_parser_xhinker.py",
2526
"modules/pulid/eva_clip",
27+
"modules/ras",
2628
"modules/rife",
2729
"modules/schedulers",
2830
"modules/segmoe",
@@ -31,7 +33,6 @@ exclude = [
3133
"modules/todo",
3234
"modules/unipc",
3335
"modules/xadapter",
34-
"modules/mod",
3536
"repositories",
3637
"extensions-builtin/Lora",
3738
"extensions-builtin/sd-extension-chainner/nodes",

CHANGELOG.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,16 @@ We're back with another update with nearly 100 commits!
5050
result is model smaller than *Flux.1-Dev*, but with similar capabilities
5151
fully supports offloading and on-the-fly quantization
5252
simply select from *networks -> models -> reference*
53-
- **Pipelines**
53+
- **Functions**
5454
- [Mixture-of-Diffusers](https://huggingface.co/posts/elismasilva/251775641926329)
5555
Regional tiling type of a solution for SDXL models
5656
select from *scripts -> mixture of diffusers*
5757
- [Automatic Color Inpaint]
5858
Automatically creates mask based on selected color and triggers inpaint
5959
simply select in *scripts -> automatic color inpaint* when in img2img mode
60+
- [RAS: Region-Adaptive Sampling](https://github.com/microsoft/RAS) *experimental*
61+
Speeds up SD3.5 models by sampling only regions of interest
62+
Enable in *settings -> pipeline modifiers -> ras*
6063
- **Interrogate/Captioning**
6164
- Redesigned captioning UI
6265
split from Process tab into separate tab

modules/interrogate/deepseek.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
vl_chat_processor = None
2121

2222

23-
class fake_attrdict(object):
23+
class fake_attrdict():
2424
class AttrDict(dict): # dot notation access to dictionary attributes
2525
__getattr__ = dict.get
2626
__setattr__ = dict.__setitem__

modules/interrogate/interrogate.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def interrogate(image):
2828
elif shared.opts.interrogate_default_type == 'VLM':
2929
shared.log.info(f'Interrogate: type={shared.opts.interrogate_default_type} vlm="{shared.opts.interrogate_vlm_model}" prompt="{shared.opts.interrogate_vlm_prompt}"')
3030
from modules.interrogate import vqa
31-
prompt = vqa.interrogate(image=image, model_name=shared.opts.interrogate_vlm_model, question=shared.opts.interrogate_vlm_prompt)
31+
prompt = vqa.interrogate(image=image, model_name=shared.opts.interrogate_vlm_model, question=shared.opts.interrogate_vlm_prompt, prompt=None)
3232
shared.log.debug(f'Interrogate: time={time.time()-t0:.2f} answer="{prompt}"')
3333
return prompt
3434
else:

modules/interrogate/joytag.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,7 @@ def __init__(self, config: str):
896896
ty, line = line.split(":") if ":" in line else (line, "")
897897
options = line.split(",")
898898
options = [o.split("=") for o in options] if line else []
899-
options = {k: v for k, v in options} # noqa: C416
899+
options = {k: v for k, v in options} # pylint: disable=unnecessary-comprehension # noqa: C416
900900
if ty == 'conv':
901901
layers.append(nn.Conv2d(
902902
in_channels=channels,

modules/interrogate/openclip.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,11 @@ def close(self):
239239

240240
def update_interrogate_params():
241241
if ci is not None:
242-
ci.caption_max_length=shared.opts.interrogate_clip_max_length,
243-
ci.chunk_size=shared.opts.interrogate_clip_chunk_size,
244-
ci.flavor_intermediate_count=shared.opts.interrogate_clip_flavor_count,
245-
ci.clip_offload=shared.opts.interrogate_offload,
246-
ci.caption_offload=shared.opts.interrogate_offload,
242+
ci.caption_max_length=shared.opts.interrogate_clip_max_length
243+
ci.chunk_size=shared.opts.interrogate_clip_chunk_size
244+
ci.flavor_intermediate_count=shared.opts.interrogate_clip_flavor_count
245+
ci.clip_offload=shared.opts.interrogate_offload
246+
ci.caption_offload=shared.opts.interrogate_offload
247247

248248

249249
def get_clip_models():

modules/masking.py

-1
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,6 @@ def run_mask(input_image: Image.Image, input_mask: Image.Image = None, return_ty
408408
debug(f'Mask args legacy: blur={mask_blur} padding={mask_padding}')
409409
if invert is not None:
410410
opts.invert = invert
411-
print('HERE', opts.mask_blur, mask_blur)
412411
if mask_blur is not None: # compatibility with old img2img values which uses px values
413412
opts.mask_blur = round(4 * mask_blur / size, 3)
414413
if mask_padding is not None: # compatibility with old img2img values which uses px values

modules/postprocess/dcc.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import numpy as np
22

33

4-
def DetectDirect(A, type, k, T):
5-
if type == 1:
4+
def DetectDirect(A, dcc_type, k, T):
5+
if dcc_type == 1:
66
# 45 degree diagonal direction
77
t1 = abs(A[2,0]-A[0,2])
88
t2 = abs(A[4,0]-A[2,2])+abs(A[2,2]-A[0,4])

modules/processing_diffusers.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import torch
66
import torchvision.transforms.functional as TF
77
from PIL import Image
8-
from modules import shared, devices, processing, sd_models, errors, sd_hijack_hypertile, processing_vae, sd_models_compile, hidiffusion, timer, modelstats, extra_networks
8+
from modules import shared, devices, processing, sd_models, errors, sd_hijack_hypertile, processing_vae, sd_models_compile, hidiffusion, timer, modelstats, extra_networks, ras
99
from modules.processing_helpers import resize_hires, calculate_base_steps, calculate_hires_steps, calculate_refiner_steps, save_intermediate, update_sampler, is_txt2img, is_refiner_enabled, get_job_name
1010
from modules.processing_args import set_pipeline_args
1111
from modules.onnx_impl import preprocess_pipeline as preprocess_onnx_pipeline, check_parameters_changed as olive_check_parameters_changed
@@ -93,6 +93,7 @@ def process_base(p: processing.StableDiffusionProcessing):
9393
sd_models.move_model(shared.sd_model.transformer, devices.device)
9494
extra_networks.activate(p, exclude=['text_encoder', 'text_encoder_2', 'text_encoder_3'])
9595
hidiffusion.apply(p, shared.sd_model_type)
96+
ras.apply(shared.sd_model, p)
9697
timer.process.record('move')
9798
if hasattr(shared.sd_model, 'tgate') and getattr(p, 'gate_step', -1) > 0:
9899
base_args['gate_step'] = p.gate_step
@@ -106,6 +107,7 @@ def process_base(p: processing.StableDiffusionProcessing):
106107
if hasattr(output, 'images'):
107108
shared.history.add(output.images, info=processing.create_infotext(p), ops=p.ops)
108109
timer.process.record('pipeline')
110+
ras.unapply(shared.sd_model)
109111
hidiffusion.unapply()
110112
sd_models_compile.openvino_post_compile(op="base") # only executes on compiled vino models
111113
sd_models_compile.check_deepcache(enable=False)

modules/prompt_parser.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ def multiply_range(start_position, multiplier):
354354
# log.trace(f'Prompt: text="{text[m.start():m.end()]}" section="{section}" weight="{weight}"')
355355
if len(section) == 0:
356356
continue
357-
elif section.startswith('\\'):
357+
if section.startswith('\\'):
358358
if len(res) > 0 and text[m.start()-1] != ' ':
359359
res[-1][0] += section[1:] # append literal character to the last section
360360
else:

modules/ras/__init__.py

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# source <https://github.com/Trojaner/RAS_Simplified>
2+
# original: <https://github.com/microsoft/RAS>
3+
4+
from modules import shared, processing
5+
6+
7+
def apply(pipe, p: processing.StableDiffusionProcessing):
8+
if shared.sd_model_type != "sd3" or not shared.opts.ras_enable:
9+
return
10+
from .ras_manager import MANAGER
11+
from .ras_scheduler import RASFlowMatchEulerDiscreteScheduler
12+
from .ras_attention import RASJointAttnProcessor2_0
13+
from .ras_forward import ras_forward
14+
scheduler = RASFlowMatchEulerDiscreteScheduler.from_config(pipe.scheduler.config)
15+
pipe.scheduler = scheduler
16+
MANAGER.num_steps = p.steps
17+
MANAGER.scheduler_end_step = p.steps
18+
MANAGER.width = p.width
19+
MANAGER.height = p.height
20+
MANAGER.error_reset_steps = [int(1*p.steps/3), int(2*p.steps/3)]
21+
shared.log.info(f'RAS: scheduler={pipe.scheduler.__class__.__name__} {str(MANAGER)}')
22+
MANAGER.reset_cache()
23+
MANAGER.generate_skip_token_list()
24+
pipe.transformer.old_forward = pipe.transformer.forward
25+
pipe.transformer.forward = ras_forward.__get__(pipe.transformer, pipe.transformer.__class__) # pylint: disable=no-value-for-parameter
26+
for block in pipe.transformer.transformer_blocks:
27+
block.attn.set_processor(RASJointAttnProcessor2_0())
28+
29+
30+
def unapply(pipe):
31+
if hasattr(pipe, 'transformer') and hasattr(pipe.transformer, "old_forward"):
32+
from diffusers.models.attention_processor import JointAttnProcessor2_0
33+
pipe.transformer.forward = pipe.transformer.old_forward
34+
del pipe.transformer.old_forward
35+
for block in pipe.transformer.transformer_blocks:
36+
block.attn.set_processor(JointAttnProcessor2_0())

0 commit comments

Comments
 (0)