Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
fengzch-das
nunchaku
Commits
5939d99f
Commit
5939d99f
authored
Apr 12, 2025
by
muyangli
Browse files
wrap up the tests
parent
c44de496
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
73 additions
and
46 deletions
+73
-46
.github/workflows/pr_test_linux.yaml
.github/workflows/pr_test_linux.yaml
+3
-1
examples/flux.1-dev-controlnet-union-pro.py
examples/flux.1-dev-controlnet-union-pro.py
+10
-3
nunchaku/utils.py
nunchaku/utils.py
+23
-0
tests/flux/test_flux_dev_loras.py
tests/flux/test_flux_dev_loras.py
+18
-19
tests/flux/test_flux_examples.py
tests/flux/test_flux_examples.py
+0
-3
tests/flux/test_shuttle_jaguar.py
tests/flux/test_shuttle_jaguar.py
+1
-1
tests/flux/utils.py
tests/flux/utils.py
+18
-16
tests/sana/test_examples.py
tests/sana/test_examples.py
+0
-3
No files found.
.github/workflows/pr_test_linux.yaml
View file @
5939d99f
...
...
@@ -7,12 +7,14 @@ on:
-
"
nunchaku/**"
-
"
src/**"
-
"
tests/**"
-
"
examples/**"
pull_request
:
types
:
[
opened
,
synchronize
,
reopened
,
edited
]
paths
:
-
"
nunchaku/**"
-
"
src/**"
-
"
tests/**"
-
"
examples/**"
workflow_dispatch
:
issue_comment
:
types
:
[
created
]
...
...
@@ -105,7 +107,7 @@ jobs:
test-flux-other
:
needs
:
build
runs-on
:
self-hosted
timeout-minutes
:
1
2
0
timeout-minutes
:
1
5
0
if
:
${{ github.event_name != 'issue_comment' || needs.check-comment.outputs.should_run == 'true' }}
steps
:
...
...
examples/flux.1-dev-controlnet-union-pro.py
View file @
5939d99f
...
...
@@ -5,7 +5,7 @@ from diffusers.utils import load_image
from
nunchaku
import
NunchakuFluxTransformer2dModel
from
nunchaku.caching.diffusers_adapters.flux
import
apply_cache_on_pipe
from
nunchaku.utils
import
get_precision
from
nunchaku.utils
import
get_gpu_memory
,
get_precision
base_model
=
"black-forest-labs/FLUX.1-dev"
controlnet_model_union
=
"Shakker-Labs/FLUX.1-dev-ControlNet-Union-Pro"
...
...
@@ -14,14 +14,21 @@ controlnet_union = FluxControlNetModel.from_pretrained(controlnet_model_union, t
controlnet
=
FluxMultiControlNetModel
([
controlnet_union
])
# we always recommend loading via FluxMultiControlNetModel
precision
=
get_precision
()
need_offload
=
get_gpu_memory
()
<
36
transformer
=
NunchakuFluxTransformer2dModel
.
from_pretrained
(
f
"mit-han-lab/svdq-
{
precision
}
-flux.1-dev"
,
torch_dtype
=
torch
.
bfloat16
f
"mit-han-lab/svdq-
{
precision
}
-flux.1-dev"
,
torch_dtype
=
torch
.
bfloat16
,
offload
=
need_offload
)
transformer
.
set_attention_impl
(
"nunchaku-fp16"
)
pipeline
=
FluxControlNetPipeline
.
from_pretrained
(
base_model
,
transformer
=
transformer
,
controlnet
=
controlnet
,
torch_dtype
=
torch
.
bfloat16
).
to
(
"cuda"
)
)
if
need_offload
:
pipeline
.
enable_sequential_cpu_offload
()
else
:
pipeline
=
pipeline
.
to
(
"cuda"
)
# apply_cache_on_pipe(
# pipeline, residual_diff_threshold=0.1
# ) # Uncomment this line to enable first-block cache to speedup generation
...
...
nunchaku/utils.py
View file @
5939d99f
...
...
@@ -105,3 +105,26 @@ def is_turing(device: str | torch.device = "cuda") -> bool:
capability
=
torch
.
cuda
.
get_device_capability
(
device_id
)
sm
=
f
"
{
capability
[
0
]
}{
capability
[
1
]
}
"
return
sm
==
"75"
def
get_gpu_memory
(
device
:
str
|
torch
.
device
=
"cuda"
,
unit
:
str
=
"GiB"
)
->
int
:
"""Get the GPU memory of the current device.
Args:
device (`str` | `torch.device`, optional, defaults to `"cuda"`):
device.
Returns:
`int`:
GPU memory in bytes.
"""
if
isinstance
(
device
,
str
):
device
=
torch
.
device
(
device
)
assert
unit
in
(
"GiB"
,
"MiB"
,
"B"
)
memory
=
torch
.
cuda
.
get_device_properties
(
device
).
total_memory
if
unit
==
"GiB"
:
return
memory
//
(
1024
**
3
)
elif
unit
==
"MiB"
:
return
memory
//
(
1024
**
2
)
else
:
return
memory
tests/flux/test_flux_dev_loras.py
View file @
5939d99f
...
...
@@ -75,27 +75,26 @@ def test_flux_dev_turbo8_1024x1920():
)
# lora composition
@
pytest
.
mark
.
skipif
(
is_turing
(),
reason
=
"Skip tests due to using Turing GPUs"
)
def
test_flux_dev_turbo8_yarn_2048x1024
():
run_test
(
precision
=
get_precision
(),
model_name
=
"flux.1-dev"
,
dataset_name
=
"yarn"
,
height
=
2048
,
width
=
1024
,
num_inference_steps
=
8
,
guidance_scale
=
3.5
,
use_qencoder
=
False
,
cpu_offload
=
True
,
lora_names
=
[
"turbo8"
,
"yarn"
],
lora_strengths
=
[
1
,
1
],
cache_threshold
=
0
,
expected_lpips
=
0.255
,
)
# @pytest.mark.skipif(is_turing(), reason="Skip tests due to using Turing GPUs")
# def test_flux_dev_turbo8_yarn_2048x1024():
# run_test(
# precision=get_precision(),
# model_name="flux.1-dev",
# dataset_name="yarn",
# height=2048,
# width=1024,
# num_inference_steps=8,
# guidance_scale=3.5,
# use_qencoder=False,
# cpu_offload=True,
# lora_names=["turbo8", "yarn"],
# lora_strengths=[1, 1],
# cache_threshold=0,
# expected_lpips=0.255,
# )
# large rank loras
#
lora composition &
large rank loras
@
pytest
.
mark
.
skipif
(
is_turing
(),
reason
=
"Skip tests due to using Turing GPUs"
)
def
test_flux_dev_turbo8_yarn_1024x1024
():
run_test
(
...
...
tests/flux/test_flux_examples.py
View file @
5939d99f
...
...
@@ -13,7 +13,4 @@ def test_example_script_runs(script_name):
script_path
=
os
.
path
.
join
(
EXAMPLES_DIR
,
script_name
)
result
=
subprocess
.
run
([
"python"
,
script_path
],
capture_output
=
True
,
text
=
True
)
print
(
f
"Running
{
script_path
}
-> Return code:
{
result
.
returncode
}
"
)
print
(
result
.
stdout
)
print
(
result
.
stderr
)
assert
result
.
returncode
==
0
,
f
"
{
script_path
}
failed with code
{
result
.
returncode
}
"
tests/flux/test_shuttle_jaguar.py
View file @
5939d99f
...
...
@@ -6,7 +6,7 @@ from nunchaku.utils import get_precision, is_turing
@
pytest
.
mark
.
skipif
(
is_turing
(),
reason
=
"Skip tests due to using Turing GPUs"
)
@
pytest
.
mark
.
parametrize
(
"height,width,attention_impl,cpu_offload,expected_lpips"
,
[(
1024
,
1024
,
"nunchaku-fp16"
,
False
,
0.
186
)]
"height,width,attention_impl,cpu_offload,expected_lpips"
,
[(
1024
,
1024
,
"nunchaku-fp16"
,
False
,
0.
209
)]
)
def
test_shuttle_jaguar
(
height
:
int
,
width
:
int
,
attention_impl
:
str
,
cpu_offload
:
bool
,
expected_lpips
:
float
):
run_test
(
...
...
tests/flux/utils.py
View file @
5939d99f
...
...
@@ -4,6 +4,7 @@ import os
import
torch
from
controlnet_aux
import
CannyDetector
from
diffusers
import
FluxControlPipeline
,
FluxFillPipeline
,
FluxPipeline
,
FluxPriorReduxPipeline
from
diffusers.hooks
import
apply_group_offloading
from
diffusers.utils
import
load_image
from
image_gen_aux
import
DepthPreprocessor
from
tqdm
import
tqdm
...
...
@@ -13,7 +14,6 @@ from nunchaku import NunchakuFluxTransformer2dModel, NunchakuT5EncoderModel
from
nunchaku.lora.flux.compose
import
compose_lora
from
..data
import
get_dataset
from
..utils
import
already_generate
,
compute_lpips
,
hash_str_to_int
from
diffusers.hooks
import
apply_group_offloading
ORIGINAL_REPO_MAP
=
{
"flux.1-schnell"
:
"black-forest-labs/FLUX.1-schnell"
,
...
...
@@ -198,6 +198,14 @@ def run_test(
gpu_properties
=
torch
.
cuda
.
get_device_properties
(
0
)
gpu_memory
=
gpu_properties
.
total_memory
/
(
1024
**
2
)
if
len
(
lora_names
)
>
0
:
for
i
,
(
lora_name
,
lora_strength
)
in
enumerate
(
zip
(
lora_names
,
lora_strengths
)):
lora_path
=
LORA_PATH_MAP
[
lora_name
]
pipeline
.
load_lora_weights
(
os
.
path
.
dirname
(
lora_path
),
weight_name
=
os
.
path
.
basename
(
lora_path
),
adapter_name
=
f
"lora_
{
i
}
"
)
pipeline
.
set_adapters
([
f
"lora_
{
i
}
"
for
i
in
range
(
len
(
lora_names
))],
lora_strengths
)
if
gpu_memory
>
36
*
1024
:
pipeline
=
pipeline
.
to
(
"cuda"
)
elif
gpu_memory
<
26
*
1024
:
...
...
@@ -207,25 +215,19 @@ def run_test(
offload_type
=
"leaf_level"
,
use_stream
=
True
,
)
pipeline
.
text_encoder
.
to
(
"cuda"
)
apply_group_offloading
(
pipeline
.
text_encoder_2
,
onload_device
=
torch
.
device
(
"cuda"
),
offload_type
=
"block_level"
,
num_blocks_per_group
=
2
,
)
if
pipeline
.
text_encoder
is
not
None
:
pipeline
.
text_encoder
.
to
(
"cuda"
)
if
pipeline
.
text_encoder_2
is
not
None
:
apply_group_offloading
(
pipeline
.
text_encoder_2
,
onload_device
=
torch
.
device
(
"cuda"
),
offload_type
=
"block_level"
,
num_blocks_per_group
=
2
,
)
pipeline
.
vae
.
to
(
"cuda"
)
else
:
pipeline
.
enable_model_cpu_offload
()
if
len
(
lora_names
)
>
0
:
for
i
,
(
lora_name
,
lora_strength
)
in
enumerate
(
zip
(
lora_names
,
lora_strengths
)):
lora_path
=
LORA_PATH_MAP
[
lora_name
]
pipeline
.
load_lora_weights
(
os
.
path
.
dirname
(
lora_path
),
weight_name
=
os
.
path
.
basename
(
lora_path
),
adapter_name
=
f
"lora_
{
i
}
"
)
pipeline
.
set_adapters
([
f
"lora_
{
i
}
"
for
i
in
range
(
len
(
lora_names
))],
lora_strengths
)
run_pipeline
(
batch_size
=
batch_size
,
dataset
=
dataset
,
...
...
tests/sana/test_examples.py
View file @
5939d99f
...
...
@@ -18,7 +18,4 @@ def test_example_script_runs(script_name):
script_path
=
os
.
path
.
join
(
EXAMPLES_DIR
,
script_name
)
result
=
subprocess
.
run
([
"python"
,
script_path
],
capture_output
=
True
,
text
=
True
)
print
(
f
"Running
{
script_path
}
-> Return code:
{
result
.
returncode
}
"
)
print
(
result
.
stdout
)
print
(
result
.
stderr
)
assert
result
.
returncode
==
0
,
f
"
{
script_path
}
failed with code
{
result
.
returncode
}
"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment