Skip to content

Commit 4df7797

Browse files
committed
Code for V2 added, completely new UI and lots of features
1 parent 284a127 commit 4df7797

File tree

162 files changed

+19923
-33052
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

162 files changed

+19923
-33052
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Diffusion Bee - Stable Diffusion GUI App for MacOS
22
[![Twitter](https://img.shields.io/twitter/url.svg?label=Follow%20%40divamgupta&style=social&url=https%3A%2F%2Ftwitter.com%2Fdivamgupta)](https://twitter.com/divamgupta)
33

4+
a
5+
46

57
### Diffusion Bee is the easiest way to run Stable Diffusion locally on your Intel / M1 Mac. Comes with a one-click installer. No dependencies or technical knowledge needed.
68

@@ -14,6 +16,7 @@
1416
Download at https://diffusionbee.com/
1517

1618

19+
1720
<br>
1821

1922
For prompt ideas visit https://arthub.ai

backends/model_converter/convert_model.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ def convert_model(checkpoint_filename=None, out_filename=None, torch_weights=No
4242

4343

4444
for k in (list(state_dict.keys())):
45+
46+
if ".encoder." in k or ".decoder." in k:
47+
for v , s in [('q' , 'to_q') , ('v' , 'to_v' ) , ('k' , 'to_k') , ('proj_out' , 'to_out.0')]:
48+
if f'.{s}.' in k:
49+
state_dict[ k.replace(f'.{s}.' , f'.{v}.') ] = state_dict[k]
50+
4551
if '.norm' in k and '.bias' in k:
4652
k2 = k.replace(".bias" , ".weight")
4753
k3 = k.replace(".bias" , ".bias_by_weight")
@@ -106,6 +112,15 @@ def convert_model(checkpoint_filename=None, out_filename=None, torch_weights=No
106112
outfile.write_key(key=k , tensor=np_arr)
107113

108114
outfile.finish_write()
115+
sd_version = model_type.replace("_float16" , "").replace("_float32" , "")
116+
if sd_version in ["SD_1x" , "SD_2x"]:
117+
sd_type = "sd_model"
118+
elif sd_version in ["SD_1x_inpaint" , "SD_2x_inpaint"]:
119+
sd_type = "sd_model_inpaint"
120+
else:
121+
raise ValueError("Invalid sd_version "+ sd_version)
122+
model_metadata = {"float_type" : cur_dtype , "sd_type" :sd_version, "type" : sd_type }
123+
print("__converted_model_data__" , json.dumps(model_metadata))
109124

110125

111126
def usage():

backends/model_converter/sd_shapes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ def add_aux_shapes(d):
7777
"SD_1x_float16": 1012 ,
7878
"SD_1x_inpaint_float16": 1013 ,
7979
"SD_1x_just_controlnet_16" : 1014,
80-
"SD_2x_float16": 1015 }
80+
"SD_2x_float16": 1015 ,
81+
"sdxl_base_unet_f8_rest_f16" : 3031,
82+
}
83+
8184

8285

8386
extra_keys = ['temb_coefficients_fp32' , 'temb_coefficients_fp16' , 'causal_mask' , 'aux_output_conv.weight' , 'aux_output_conv.bias', 'alphas_cumprod']

backends/model_converter/tdict.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def pad_bytes(self, nb):
2222
self.out_file.write(b'\x00' * nb )
2323
self.filep += nb
2424

25-
def write_block(self, block_array):
25+
def write_block(self, block_array ):
2626

2727
if self.filep %64 != 0:
2828
npad = 64 - self.filep % 64
@@ -73,7 +73,11 @@ def read_block(self, header_pos, np_shape=None, np_dtype=None):
7373
block = self.in_file.read(l)
7474

7575
if np_dtype is not None:
76-
block = np.frombuffer(block, dtype=np_dtype)
76+
if "cus_" in np_dtype: #custom dtype, which is not supported by numpy
77+
block = np.frombuffer(block, dtype='uint8')
78+
block = decode_custom_dtype(block , np_dtype )
79+
else:
80+
block = np.frombuffer(block, dtype=np_dtype)
7781

7882
if np_shape is not None:
7983
block = block.reshape(np_shape)
@@ -145,13 +149,24 @@ def read_key(self , key):
145149
assert len(ret_arr.tobytes()) == w_idx_len
146150
return ret_arr.copy()
147151

148-
def write_key(self , key , tensor):
152+
def write_key(self , key , tensor, custom_dtype=None ):
149153
assert key not in self.keys_info
150154
dtype = str(tensor.dtype)
155+
if custom_dtype is not None:
156+
dtype = custom_dtype
157+
raise not NotImplementedError("Casting not implemented.")
158+
151159
write_info = self.write_block(tensor)
152160
shape = list(tensor.shape)
153161
self.keys_info[key] = {"start": write_info['n_start_data'] , "end" : write_info['n_end_data'] , "shape": shape , "dtype" : dtype }
154162

163+
def write_key_custom_dype(self, uint8_arr , key, custom_dtype , shape ):
164+
assert key not in self.keys_info
165+
dtype = custom_dtype
166+
write_info = self.write_block(uint8_arr)
167+
self.keys_info[key] = {"start": write_info['n_start_data'] , "end" : write_info['n_end_data'] , "shape": shape , "dtype" : dtype }
168+
169+
155170
def finish_write(self):
156171

157172
if self.filep %64 != 0:
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import json
2+
3+
def update_state_raw(key , val ):
4+
print( "utds " + key + "___U_P_D_A_T_E___" + json.dumps(val))
5+
6+
7+
registered_applets = {}
8+
9+
def register_applet(model_container, applet_cls):
10+
applet_name = applet_cls.applet_name
11+
applet = applet_cls()
12+
applet.init_applet(model_container)
13+
registered_applets[applet_name] = applet
14+
15+
def run_applet(applet_name , params_dict):
16+
registered_applets[applet_name].run(params_dict)
17+
18+
19+
class AppletBase:
20+
21+
applet_name = None
22+
applet_title = None
23+
is_stop_avail = False
24+
applet_description = ""
25+
applet_icon = "file"
26+
applet_icon_fname = None
27+
28+
def run(self, params):
29+
raise NotImplementedError("base cls")
30+
31+
def get_input_form(self):
32+
return []
33+
34+
def update_output( self, key , val ):
35+
self.update_state( "outputs." + key , val)
36+
37+
def update_state(self , key , val ):
38+
key = "registered_ext_applets." + self.applet_name + "." + key
39+
update_state_raw(key , val)
40+
41+
def init_applet(self, model_container):
42+
43+
self.model_container = model_container
44+
45+
update_state_raw( "registered_ext_applets." + self.applet_name , {})
46+
update_state_raw( "registered_ext_applets." + self.applet_name + ".id" , self.applet_name)
47+
update_state_raw( "registered_ext_applets." + self.applet_name + ".title" , self.applet_title)
48+
update_state_raw( "registered_ext_applets." + self.applet_name + ".description" , self.applet_description)
49+
update_state_raw( "registered_ext_applets." + self.applet_name + ".icon" , self.applet_icon )
50+
if self.applet_icon_fname is not None:
51+
update_state_raw( "registered_ext_applets." + self.applet_name + ".img_icon" , self.applet_icon_fname )
52+
update_state_raw( "registered_ext_applets." + self.applet_name + ".home_category" , "misc")
53+
update_state_raw( "registered_ext_applets." + self.applet_name + ".inputs" , self.get_input_form() )
54+
update_state_raw( "registered_ext_applets." + self.applet_name + ".outputs" , [] )
55+
update_state_raw( "registered_ext_applets." + self.applet_name + ".is_stop_avail" , self.is_stop_avail )
56+
57+
58+
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import random
2+
3+
def get_textbox(id, type="str" , default="" , title="" , description=""):
4+
5+
types = {"str" : "text" , "int" : "number" , "float" : "number"}
6+
7+
return {
8+
"id": str(random.randint(0,19989999)),
9+
"component": "InputWithDesc",
10+
"title": title,
11+
"description":description ,
12+
"children": [
13+
{
14+
"id": id,
15+
"component": "Textbox",
16+
"placeholder" : "",
17+
"default_value" : default ,
18+
"type" : types[type],
19+
"output_type" :type ,
20+
"is_persistant" : False
21+
}
22+
]
23+
}
24+
25+
def get_output_text(text):
26+
return {
27+
"id": str(random.randint(0,19989999)),
28+
"component": "OutputText",
29+
"text" : text
30+
}
31+
def get_output_img(img_path, save_ext='.png' , is_save=False):
32+
return {
33+
"id": str(random.randint(0,19989999)),
34+
"component": "OutputImage",
35+
"img_path" : img_path,
36+
"is_save" : is_save ,
37+
"save_ext" : save_ext
38+
}
39+
40+
def get_file_textbox(id , path_type="", title="" , description="" ):
41+
return {
42+
"id": str(random.randint(0,19989999)),
43+
"component": "InputWithDesc",
44+
"full_width": True,
45+
"title": title,
46+
"description": description,
47+
"children": [
48+
{
49+
"id": id ,
50+
"component": "FilePathTextBox",
51+
"placeholder" : "",
52+
"is_persistant" : False,
53+
"path_type" : path_type
54+
},
55+
]
56+
}
57+
58+
def get_textarea(id , title="" , description="" ):
59+
return {
60+
"id": str(random.randint(0,19989999)),
61+
"component": "InputWithDesc",
62+
"full_width": True,
63+
"title": title,
64+
"description": description,
65+
"children": [
66+
{
67+
"id": id ,
68+
"component": "Textarea",
69+
"placeholder" : title ,
70+
"is_small" : True,
71+
"is_persistant" : False,
72+
},
73+
]
74+
}
75+

0 commit comments

Comments
 (0)