Skip to content

Commit 25f9ce4

Browse files
committed
More tests for vram memory leaks
1 parent e0fa1d2 commit 25f9ce4

File tree

2 files changed

+149
-43
lines changed

2 files changed

+149
-43
lines changed

tests/test_vram_frees_after_image_generation.py

Lines changed: 0 additions & 43 deletions
This file was deleted.

tests/test_vram_memory_leaks.py

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
from sdkit import Context
2+
from sdkit.generate import generate_images
3+
from sdkit.models import load_model, unload_model
4+
from sdkit.utils import get_vram_usage_slow, log
5+
6+
context = None
7+
8+
usage_timeseries = []
9+
10+
11+
def setup_module():
12+
global context
13+
14+
context = Context()
15+
context.test_diffusers = True
16+
17+
18+
def setup_function():
19+
usage_timeseries.clear()
20+
21+
22+
def teardown_function():
23+
print("----")
24+
print(f"Usage timeseries:")
25+
for v in usage_timeseries:
26+
print(f"{v/1024**3:.1f} GiB")
27+
print("----")
28+
29+
30+
def get_vram_usage():
31+
x = get_vram_usage_slow()
32+
usage_timeseries.append(x)
33+
return x
34+
35+
36+
def test_1__sd_1__model_unload_frees_vram():
37+
usage_start = get_vram_usage()
38+
39+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/sd-v1-4.ckpt"
40+
load_model(context, "stable-diffusion")
41+
42+
usage_model_load = get_vram_usage()
43+
44+
unload_model(context, "stable-diffusion")
45+
46+
usage_model_unload = get_vram_usage()
47+
48+
print("")
49+
log.info(
50+
f"VRAM trend: {usage_start/1024**3:.1f} GiB (start) to {usage_model_load/1024**3:.1f} GiB (after load) to {usage_model_unload/1024**3:.1f} GiB (after unload)"
51+
)
52+
print("")
53+
54+
max_expected_vram = usage_start + 0.3
55+
assert (
56+
usage_model_unload < max_expected_vram
57+
), f"Test failed! VRAM after unload was expected to be below {max_expected_vram/1024**3:.1f} GiB, but was {usage_model_unload/1024**3:.1f} GiB!"
58+
59+
60+
def test_2__sd_1__model_changes():
61+
usage_start = get_vram_usage()
62+
63+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/sd-v1-4.ckpt"
64+
load_model(context, "stable-diffusion")
65+
66+
usage_model_load1 = get_vram_usage()
67+
68+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/sd-v1-5-inpainting.ckpt"
69+
load_model(context, "stable-diffusion")
70+
71+
usage_model_load2 = get_vram_usage()
72+
73+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/realisticVisionV51_v51VAE.safetensors"
74+
load_model(context, "stable-diffusion")
75+
76+
usage_model_load3 = get_vram_usage()
77+
78+
print("")
79+
log.info(
80+
f"VRAM trend: {usage_start/1024**3:.1f} GiB (start) to {usage_model_load1/1024**3:.1f} GiB (after load1) to {usage_model_load2/1024**3:.1f} GiB (after load2) to {usage_model_load3/1024**3:.1f} GiB (after load3)"
81+
)
82+
print("")
83+
84+
max_expected_vram = usage_model_load1 + 0.3
85+
assert (
86+
usage_model_load3 < max_expected_vram
87+
), f"Test failed! VRAM after load3 was expected to be below {max_expected_vram/1024**3:.1f} GiB, but was {usage_model_load3/1024**3:.1f} GiB!"
88+
89+
90+
def test_3__sd_1_x__vram_frees_after_image():
91+
usage_start = get_vram_usage()
92+
93+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/sd-v1-4.ckpt"
94+
load_model(context, "stable-diffusion")
95+
96+
log.info("Loaded the model..")
97+
usage_model_load = get_vram_usage()
98+
99+
try:
100+
images = generate_images(context, prompt="Photograph of an astronaut riding a horse")
101+
except Exception as e:
102+
log.exception(e)
103+
104+
log.info("Generated the image..")
105+
usage_after_render = get_vram_usage()
106+
107+
print("")
108+
log.info(
109+
f"VRAM trend: {usage_start/1024**3:.1f} GiB (start) to {usage_model_load/1024**3:.1f} GiB (before render) to {usage_after_render/1024**3:.1f} GiB (after render)"
110+
)
111+
print("")
112+
113+
max_expected_vram = usage_model_load + 0.3
114+
assert (
115+
usage_after_render < max_expected_vram
116+
), f"Test failed! VRAM after render was expected to be below {max_expected_vram/1024**3:.1f} GiB, but was {usage_after_render/1024**3:.1f} GiB!"
117+
118+
119+
def test_4__sd_1__model_change_and_render__check_for_compounding_leaks():
120+
usage_start = get_vram_usage()
121+
122+
for i in range(6):
123+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/sd-v1-4.ckpt"
124+
load_model(context, "stable-diffusion")
125+
126+
usage_model_load1 = get_vram_usage()
127+
128+
try:
129+
images = generate_images(context, prompt="Photograph of an astronaut riding a horse", num_inference_steps=2)
130+
except Exception as e:
131+
log.exception(e)
132+
133+
log.info("Generated the image..")
134+
usage_after_render1 = get_vram_usage()
135+
136+
context.model_paths["stable-diffusion"] = "models/stable-diffusion/1.x/realisticVisionV51_v51VAE.safetensors"
137+
load_model(context, "stable-diffusion")
138+
139+
usage_model_load2 = get_vram_usage()
140+
141+
try:
142+
images = generate_images(
143+
context, prompt="Photograph of an astronaut riding a horse", height=512, num_inference_steps=2
144+
)
145+
except Exception as e:
146+
log.exception(e)
147+
148+
log.info("Generated the image..")
149+
usage_after_render2 = get_vram_usage()

0 commit comments

Comments
 (0)