-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp_model.py
150 lines (127 loc) · 4.1 KB
/
app_model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import sys
import os
import streamlit as st
import torch
from diffusers import (
DDIMScheduler,
LMSDiscreteScheduler,
EulerDiscreteScheduler,
EulerAncestralDiscreteScheduler,
StableDiffusionImg2ImgPipeline,
StableDiffusionPipeline,
)
# Upscaler
sys.path.append("../Real-ESRGAN")
from basicsr.archs.rrdbnet_arch import RRDBNet
from realesrgan import RealESRGANer
from gfpgan import GFPGANer
MODEL_PATH = "d:/dev/models"
def dummy_safety_checker(images, **kwargs):
return images, False
# Upscaler Model setup
def setup_upscaler(modelname: str, scale: float, half_precision: bool):
if modelname == None or modelname == "RealESRGAN_x4plus":
model = RRDBNet(
num_in_ch=3,
num_out_ch=3,
num_feat=64,
num_block=23,
num_grow_ch=32,
scale=4,
)
netscale = 4
elif modelname in ["RealESRGAN_x4plus_anime_6B"]: # x4 RRDBNet model with 6 blocks
model = RRDBNet(
num_in_ch=3, num_out_ch=3, num_feat=64, num_block=6, num_grow_ch=32, scale=4
)
netscale = 4
else:
return None
model_path = "../Real-ESRGAN/experiments/pretrained_models/{}.pth".format(modelname)
upsampler = RealESRGANer(
scale=netscale,
model_path=model_path,
model=model,
tile=0,
tile_pad=10,
pre_pad=0,
half=half_precision,
gpu_id=0,
)
return upsampler
class PipeManager:
def __init__(self):
self._type = None
self._scheduler = None
self._model = None
self._dirty = True
self._pipe = None
@property
def type(self):
return self._type
@type.setter
def type(self, new_value):
self._dirty = new_value != self._type
self._type = new_value
@property
def scheduler(self):
return self._scheduler
@scheduler.setter
def scheduler(self, new_value):
self._dirty = new_value != self._scheduler
self._scheduler = new_value
@property
def model(self):
return self._model
@model.setter
def model(self, new_value):
self._dirty = new_value != self._model
self._model = new_value
def open_pipe(self):
if self._dirty == False:
return self._pipe
# Scheduler creation
if self._scheduler == "DDIM":
scheduler = DDIMScheduler(
beta_start=0.00085,
beta_end=0.012,
beta_schedule="scaled_linear",
clip_sample=False,
set_alpha_to_one=False,
)
elif self._scheduler == "LMS":
scheduler = LMSDiscreteScheduler(
beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear"
)
elif self._scheduler == "Euler":
scheduler = EulerDiscreteScheduler(
beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear"
)
elif self._scheduler == "EulerA":
scheduler = EulerAncestralDiscreteScheduler(
beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear"
)
# Pipe creation
model_full_path = os.path.join(MODEL_PATH, self.model)
if self._type == "txt2img":
self._pipe = StableDiffusionPipeline.from_pretrained(
model_full_path,
revision="fp16",
torch_dtype=torch.float16,
scheduler=scheduler,
).to("cuda")
elif self._type == "img2img":
self._pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
model_full_path,
scheduler=scheduler,
revision="fp16",
torch_dtype=torch.float16,
).to("cuda")
else:
print("Error, type have to be txt2img or img2img")
return None
self._pipe.enable_xformers_memory_efficient_attention()
# self.pipe.enable_attention_slicing(slice_size=4)
self._pipe.safety_checker = dummy_safety_checker
self._dirty = False
return self._pipe