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
renzhc
diffusers_dcu
Commits
79bd7ecc
Unverified
Commit
79bd7ecc
authored
Jun 17, 2025
by
Aryan
Committed by
GitHub
Jun 17, 2025
Browse files
Support more Wan loras (VACE) (#11726)
update
parent
9b834f87
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
51 additions
and
36 deletions
+51
-36
src/diffusers/loaders/lora_conversion_utils.py
src/diffusers/loaders/lora_conversion_utils.py
+51
-36
No files found.
src/diffusers/loaders/lora_conversion_utils.py
View file @
79bd7ecc
...
...
@@ -1596,7 +1596,10 @@ def _convert_non_diffusers_wan_lora_to_diffusers(state_dict):
converted_state_dict
=
{}
original_state_dict
=
{
k
[
len
(
"diffusion_model."
)
:]:
v
for
k
,
v
in
state_dict
.
items
()}
num_blocks
=
len
({
k
.
split
(
"blocks."
)[
1
].
split
(
"."
)[
0
]
for
k
in
original_state_dict
if
"blocks."
in
k
})
block_numbers
=
{
int
(
k
.
split
(
"."
)[
1
])
for
k
in
original_state_dict
if
k
.
startswith
(
"blocks."
)}
min_block
=
min
(
block_numbers
)
max_block
=
max
(
block_numbers
)
is_i2v_lora
=
any
(
"k_img"
in
k
for
k
in
original_state_dict
)
and
any
(
"v_img"
in
k
for
k
in
original_state_dict
)
lora_down_key
=
"lora_A"
if
any
(
"lora_A"
in
k
for
k
in
original_state_dict
)
else
"lora_down"
lora_up_key
=
"lora_B"
if
any
(
"lora_B"
in
k
for
k
in
original_state_dict
)
else
"lora_up"
...
...
@@ -1622,45 +1625,57 @@ def _convert_non_diffusers_wan_lora_to_diffusers(state_dict):
# For the `diff_b` keys, we treat them as lora_bias.
# https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraConfig.lora_bias
for
i
in
range
(
num
_block
s
):
for
i
in
range
(
min_block
,
max
_block
+
1
):
# Self-attention
for
o
,
c
in
zip
([
"q"
,
"k"
,
"v"
,
"o"
],
[
"to_q"
,
"to_k"
,
"to_v"
,
"to_out.0"
]):
converted_state_dict
[
f
"blocks.
{
i
}
.attn1.
{
c
}
.lora_A.weight"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.self_attn.
{
o
}
.
{
lora_down_key
}
.weight"
)
converted_state_dict
[
f
"blocks.
{
i
}
.attn1.
{
c
}
.lora_B.weight"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.self_attn.
{
o
}
.
{
lora_up_key
}
.weight"
)
if
f
"blocks.
{
i
}
.self_attn.
{
o
}
.diff_b"
in
original_state_dict
:
converted_state_dict
[
f
"blocks.
{
i
}
.attn1.
{
c
}
.lora_B.bias"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.self_attn.
{
o
}
.diff_b"
)
original_key
=
f
"blocks.
{
i
}
.self_attn.
{
o
}
.
{
lora_down_key
}
.weight"
converted_key
=
f
"blocks.
{
i
}
.attn1.
{
c
}
.lora_A.weight"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
original_key
=
f
"blocks.
{
i
}
.self_attn.
{
o
}
.
{
lora_up_key
}
.weight"
converted_key
=
f
"blocks.
{
i
}
.attn1.
{
c
}
.lora_B.weight"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
original_key
=
f
"blocks.
{
i
}
.self_attn.
{
o
}
.diff_b"
converted_key
=
f
"blocks.
{
i
}
.attn1.
{
c
}
.lora_B.bias"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
# Cross-attention
for
o
,
c
in
zip
([
"q"
,
"k"
,
"v"
,
"o"
],
[
"to_q"
,
"to_k"
,
"to_v"
,
"to_out.0"
]):
converted_state_dict
[
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_A.weight"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_down_key
}
.weight"
)
converted_state_dict
[
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.weight"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_up_key
}
.weight"
)
if
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.diff_b"
in
original_state_dict
:
converted_state_dict
[
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.bias"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.diff_b"
)
original_key
=
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_down_key
}
.weight"
converted_key
=
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_A.weight"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
original_key
=
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_up_key
}
.weight"
converted_key
=
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.weight"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
original_key
=
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.diff_b"
converted_key
=
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.bias"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
if
is_i2v_lora
:
for
o
,
c
in
zip
([
"k_img"
,
"v_img"
],
[
"add_k_proj"
,
"add_v_proj"
]):
converted_state_dict
[
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_A.weight"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_down_key
}
.weight"
)
converted_state_dict
[
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.weight"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_up_key
}
.weight"
)
if
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.diff_b"
in
original_state_dict
:
converted_state_dict
[
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.bias"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.diff_b"
)
original_key
=
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_down_key
}
.weight"
converted_key
=
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_A.weight"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
original_key
=
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.
{
lora_up_key
}
.weight"
converted_key
=
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.weight"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
original_key
=
f
"blocks.
{
i
}
.cross_attn.
{
o
}
.diff_b"
converted_key
=
f
"blocks.
{
i
}
.attn2.
{
c
}
.lora_B.bias"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
# FFN
for
o
,
c
in
zip
([
"ffn.0"
,
"ffn.2"
],
[
"net.0.proj"
,
"net.2"
]):
...
...
@@ -1674,10 +1689,10 @@ def _convert_non_diffusers_wan_lora_to_diffusers(state_dict):
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
if
f
"blocks.
{
i
}
.
{
o
}
.diff_b"
in
original_state_dict
:
converted_
state_dict
[
f
"blocks.
{
i
}
.ffn.
{
c
}
.lora_B.bias"
]
=
original_state_dict
.
pop
(
f
"blocks.
{
i
}
.
{
o
}
.diff_b"
)
original_key
=
f
"blocks.
{
i
}
.
{
o
}
.diff_b"
converted_
key
=
f
"blocks.
{
i
}
.ffn.
{
c
}
.lora_B.bias"
if
original_key
in
original_state_dict
:
converted_state_dict
[
converted_key
]
=
original_state_dict
.
pop
(
original_key
)
# Remaining.
if
original_state_dict
:
...
...
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