prithivMLmods commited on
Commit
50a06a9
·
verified ·
1 Parent(s): 70dbd46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -37
app.py CHANGED
@@ -8,37 +8,15 @@ from PIL import Image
8
  import spaces
9
  import torch
10
  from diffusers import StableDiffusionXLPipeline, EulerAncestralDiscreteScheduler
11
- from typing import Tuple # Added this import
12
 
13
  DESCRIPTIONx = """## STABLE HAMSTER
 
14
  """
15
 
16
- # Use environment variables for flexibility
17
- MODEL_ID = os.getenv("MODEL_REPO")
18
- MAX_IMAGE_SIZE = int(os.getenv("MAX_IMAGE_SIZE", "4096"))
19
- USE_TORCH_COMPILE = os.getenv("USE_TORCH_COMPILE", "0") == "1"
20
- ENABLE_CPU_OFFLOAD = os.getenv("ENABLE_CPU_OFFLOAD", "0") == "1"
21
- BATCH_SIZE = int(os.getenv("BATCH_SIZE", "1")) # Allow generating multiple images at once
22
 
23
- # Determine device and load model outside of function for efficiency
24
- device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
25
- pipe = StableDiffusionXLPipeline.from_pretrained(
26
- MODEL_ID,
27
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
28
- use_safetensors=True,
29
- add_watermarker=False,
30
- ).to(device)
31
- pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
32
 
33
- # Torch compile for potential speedup (experimental)
34
- if USE_TORCH_COMPILE:
35
- pipe.compile()
36
 
37
- # CPU offloading for larger RAM capacity (experimental)
38
- if ENABLE_CPU_OFFLOAD:
39
- pipe.enable_model_cpu_offload()
40
-
41
- MAX_SEED = np.iinfo(np.int32).max
42
 
43
  style_list = [
44
  {
@@ -51,11 +29,34 @@ style_list = [
51
  "prompt": "hyper-realistic 4K image of {prompt}. ultra-detailed, lifelike, high-resolution, sharp, vibrant colors, photorealistic",
52
  "negative_prompt": "cartoonish, low resolution, blurry, simplistic, abstract, deformed, ugly",
53
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  {
55
  "name": "3D Model",
56
  "prompt": "professional 3d model {prompt}. octane render, highly detailed, volumetric, dramatic lighting",
57
  "negative_prompt": "ugly, deformed, noisy, low poly, blurry, painting",
58
  },
 
 
 
 
 
59
  ]
60
 
61
  styles = {k["name"]: (k["prompt"], k["negative_prompt"]) for k in style_list}
@@ -68,6 +69,37 @@ def apply_style(style_name: str, positive: str, negative: str = "") -> Tuple[str
68
  negative = ""
69
  return p.replace("{prompt}", positive), n + negative
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  def save_image(img):
72
  unique_name = str(uuid.uuid4()) + ".png"
73
  img.save(unique_name)
@@ -91,21 +123,19 @@ def generate(
91
  randomize_seed: bool = False,
92
  use_resolution_binning: bool = True,
93
  num_images: int = 1, # Number of images to generate
94
- style: str = DEFAULT_STYLE_NAME,
95
  progress=gr.Progress(track_tqdm=True),
96
  ):
97
- prompt, negative_prompt = apply_style(style, prompt, negative_prompt)
98
  seed = int(randomize_seed_fn(seed, randomize_seed))
99
  generator = torch.Generator(device=device).manual_seed(seed)
100
 
101
  # Improved options handling
102
  options = {
103
- "prompt": [prompt] * int(num_images),
104
- "negative_prompt": [negative_prompt] * int(num_images) if use_negative_prompt else None,
105
- "width": int(width),
106
- "height": int(height),
107
- "guidance_scale": float(guidance_scale),
108
- "num_inference_steps": int(num_inference_steps),
109
  "generator": generator,
110
  "output_type": "pil",
111
  }
@@ -116,7 +146,7 @@ def generate(
116
 
117
  # Generate images potentially in batches
118
  images = []
119
- for i in range(0, int(num_images), BATCH_SIZE):
120
  batch_options = options.copy()
121
  batch_options["prompt"] = options["prompt"][i:i+BATCH_SIZE]
122
  if "negative_prompt" in batch_options:
@@ -212,6 +242,8 @@ with gr.Blocks(css=css, theme="bethecloud/storj_theme") as demo:
212
  step=1,
213
  value=8,
214
  )
 
 
215
  style_selection = gr.Radio(
216
  show_label=True,
217
  container=True,
@@ -220,11 +252,13 @@ with gr.Blocks(css=css, theme="bethecloud/storj_theme") as demo:
220
  value=DEFAULT_STYLE_NAME,
221
  label="Image Style",
222
  )
223
-
224
  gr.Examples(
225
  examples=examples,
226
  inputs=prompt,
227
- cache_examples=False
 
 
228
  )
229
 
230
  use_negative_prompt.change(
@@ -245,14 +279,14 @@ with gr.Blocks(css=css, theme="bethecloud/storj_theme") as demo:
245
  prompt,
246
  negative_prompt,
247
  use_negative_prompt,
 
248
  seed,
249
  width,
250
  height,
251
  guidance_scale,
252
  num_inference_steps,
253
  randomize_seed,
254
- num_images,
255
- style_selection # Added style_selection to inputs
256
  ],
257
  outputs=[result, seed],
258
  api_name="run",
 
8
  import spaces
9
  import torch
10
  from diffusers import StableDiffusionXLPipeline, EulerAncestralDiscreteScheduler
11
+
12
 
13
  DESCRIPTIONx = """## STABLE HAMSTER
14
+
15
  """
16
 
 
 
 
 
 
 
17
 
 
 
 
 
 
 
 
 
 
18
 
 
 
 
19
 
 
 
 
 
 
20
 
21
  style_list = [
22
  {
 
29
  "prompt": "hyper-realistic 4K image of {prompt}. ultra-detailed, lifelike, high-resolution, sharp, vibrant colors, photorealistic",
30
  "negative_prompt": "cartoonish, low resolution, blurry, simplistic, abstract, deformed, ugly",
31
  },
32
+
33
+ {
34
+ "name": "Photo",
35
+ "prompt": "cinematic photo {prompt}. 35mm photograph, film, bokeh, professional, 4k, highly detailed",
36
+ "negative_prompt": "drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly",
37
+ },
38
+
39
+ {
40
+ "name": "Cinematic",
41
+ "prompt": "cinematic still {prompt}. emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy",
42
+ "negative_prompt": "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured",
43
+ },
44
+
45
+ {
46
+ "name": "Anime",
47
+ "prompt": "anime artwork {prompt}. anime style, key visual, vibrant, studio anime, highly detailed",
48
+ "negative_prompt": "photo, deformed, black and white, realism, disfigured, low contrast",
49
+ },
50
  {
51
  "name": "3D Model",
52
  "prompt": "professional 3d model {prompt}. octane render, highly detailed, volumetric, dramatic lighting",
53
  "negative_prompt": "ugly, deformed, noisy, low poly, blurry, painting",
54
  },
55
+ {
56
+ "name": "(No style)",
57
+ "prompt": "{prompt}",
58
+ "negative_prompt": "",
59
+ },
60
  ]
61
 
62
  styles = {k["name"]: (k["prompt"], k["negative_prompt"]) for k in style_list}
 
69
  negative = ""
70
  return p.replace("{prompt}", positive), n + negative
71
 
72
+
73
+
74
+
75
+
76
+ # Use environment variables for flexibility
77
+ MODEL_ID = os.getenv("MODEL_REPO")
78
+ MAX_IMAGE_SIZE = int(os.getenv("MAX_IMAGE_SIZE", "4096"))
79
+ USE_TORCH_COMPILE = os.getenv("USE_TORCH_COMPILE", "0") == "1"
80
+ ENABLE_CPU_OFFLOAD = os.getenv("ENABLE_CPU_OFFLOAD", "0") == "1"
81
+ BATCH_SIZE = int(os.getenv("BATCH_SIZE", "1")) # Allow generating multiple images at once
82
+
83
+ # Determine device and load model outside of function for efficiency
84
+ device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
85
+ pipe = StableDiffusionXLPipeline.from_pretrained(
86
+ MODEL_ID,
87
+ torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
88
+ use_safetensors=True,
89
+ add_watermarker=False,
90
+ ).to(device)
91
+ pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
92
+
93
+ # Torch compile for potential speedup (experimental)
94
+ if USE_TORCH_COMPILE:
95
+ pipe.compile()
96
+
97
+ # CPU offloading for larger RAM capacity (experimental)
98
+ if ENABLE_CPU_OFFLOAD:
99
+ pipe.enable_model_cpu_offload()
100
+
101
+ MAX_SEED = np.iinfo(np.int32).max
102
+
103
  def save_image(img):
104
  unique_name = str(uuid.uuid4()) + ".png"
105
  img.save(unique_name)
 
123
  randomize_seed: bool = False,
124
  use_resolution_binning: bool = True,
125
  num_images: int = 1, # Number of images to generate
 
126
  progress=gr.Progress(track_tqdm=True),
127
  ):
 
128
  seed = int(randomize_seed_fn(seed, randomize_seed))
129
  generator = torch.Generator(device=device).manual_seed(seed)
130
 
131
  # Improved options handling
132
  options = {
133
+ "prompt": [prompt] * num_images,
134
+ "negative_prompt": [negative_prompt] * num_images if use_negative_prompt else None,
135
+ "width": width,
136
+ "height": height,
137
+ "guidance_scale": guidance_scale,
138
+ "num_inference_steps": num_inference_steps,
139
  "generator": generator,
140
  "output_type": "pil",
141
  }
 
146
 
147
  # Generate images potentially in batches
148
  images = []
149
+ for i in range(0, num_images, BATCH_SIZE):
150
  batch_options = options.copy()
151
  batch_options["prompt"] = options["prompt"][i:i+BATCH_SIZE]
152
  if "negative_prompt" in batch_options:
 
242
  step=1,
243
  value=8,
244
  )
245
+
246
+ with gr.Row(visible=True):
247
  style_selection = gr.Radio(
248
  show_label=True,
249
  container=True,
 
252
  value=DEFAULT_STYLE_NAME,
253
  label="Image Style",
254
  )
255
+
256
  gr.Examples(
257
  examples=examples,
258
  inputs=prompt,
259
+ outputs=[result, seed],
260
+ fn=generate,
261
+ cache_examples=CACHE_EXAMPLES,
262
  )
263
 
264
  use_negative_prompt.change(
 
279
  prompt,
280
  negative_prompt,
281
  use_negative_prompt,
282
+ style_selection,
283
  seed,
284
  width,
285
  height,
286
  guidance_scale,
287
  num_inference_steps,
288
  randomize_seed,
289
+ num_images
 
290
  ],
291
  outputs=[result, seed],
292
  api_name="run",