[diffusion] chore: key the VAE decode-dtype store by module layout (#38496)
Co-authored-by: Mick Qian <mickqian@radixark.ai> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Mick Qian
Claude Opus 5
parent
a6b542813f
commit
15ff470472
@@ -159,10 +159,17 @@ def _should_use_channels_last_3d(
|
|||||||
|
|
||||||
|
|
||||||
def _decode_dtype_store_path(
|
def _decode_dtype_store_path(
|
||||||
component_model_path: str, component_name: str, dtype: torch.dtype
|
component_model_path: str, component_name: str, dtype: torch.dtype, vae=None
|
||||||
) -> str:
|
) -> str:
|
||||||
|
# The module layout is part of the key: two runtime versions that expose a
|
||||||
|
# different parameter set for the same checkpoint must not share a store.
|
||||||
|
layout = ""
|
||||||
|
if vae is not None:
|
||||||
|
layout = "|" + ",".join(
|
||||||
|
f"{name}:{tuple(tensor.shape)}" for name, tensor in vae.state_dict().items()
|
||||||
|
)
|
||||||
key = hashlib.sha1(
|
key = hashlib.sha1(
|
||||||
f"{os.path.realpath(component_model_path)}|{component_name}|{dtype}".encode()
|
f"{os.path.realpath(component_model_path)}|{component_name}|{dtype}{layout}".encode()
|
||||||
).hexdigest()[:16]
|
).hexdigest()[:16]
|
||||||
return os.path.join(
|
return os.path.join(
|
||||||
envs.SGLANG_DIFFUSION_CACHE_ROOT, "decode_dtype_store", f"{key}.safetensors"
|
envs.SGLANG_DIFFUSION_CACHE_ROOT, "decode_dtype_store", f"{key}.safetensors"
|
||||||
@@ -211,7 +218,7 @@ def _rehome_cast_weights_to_file(
|
|||||||
|
|
||||||
Returns (weights held, file-backed?).
|
Returns (weights held, file-backed?).
|
||||||
"""
|
"""
|
||||||
path = _decode_dtype_store_path(component_model_path, component_name, dtype)
|
path = _decode_dtype_store_path(component_model_path, component_name, dtype, vae)
|
||||||
try:
|
try:
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
mapped = _load_store(path)
|
mapped = _load_store(path)
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ def test_the_cast_weights_end_up_file_backed(tmp_path):
|
|||||||
vae, _server_args(), "video_vae", str(model_path)
|
vae, _server_args(), "video_vae", str(model_path)
|
||||||
)
|
)
|
||||||
|
|
||||||
path = _decode_dtype_store_path(str(model_path), "video_vae", torch.float16)
|
path = _decode_dtype_store_path(str(model_path), "video_vae", torch.float16, vae)
|
||||||
import os
|
import os
|
||||||
|
|
||||||
assert os.path.exists(path)
|
assert os.path.exists(path)
|
||||||
@@ -101,7 +101,8 @@ def test_a_second_start_adopts_the_store_without_casting(tmp_path):
|
|||||||
def test_a_mismatched_store_is_discarded_and_the_cast_kept(tmp_path):
|
def test_a_mismatched_store_is_discarded_and_the_cast_kept(tmp_path):
|
||||||
model_path = tmp_path / "ckpt"
|
model_path = tmp_path / "ckpt"
|
||||||
model_path.mkdir()
|
model_path.mkdir()
|
||||||
path = _decode_dtype_store_path(str(model_path), "video_vae", torch.float16)
|
vae = _TinyVAE()
|
||||||
|
path = _decode_dtype_store_path(str(model_path), "video_vae", torch.float16, vae)
|
||||||
import os
|
import os
|
||||||
|
|
||||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||||
@@ -109,7 +110,6 @@ def test_a_mismatched_store_is_discarded_and_the_cast_kept(tmp_path):
|
|||||||
|
|
||||||
save_file({"blocks.0.weight": torch.zeros(4, 4, dtype=torch.float16)}, path)
|
save_file({"blocks.0.weight": torch.zeros(4, 4, dtype=torch.float16)}, path)
|
||||||
|
|
||||||
vae = _TinyVAE()
|
|
||||||
_hold_decoder_weights_in_decode_dtype(
|
_hold_decoder_weights_in_decode_dtype(
|
||||||
vae, _server_args(), "video_vae", str(model_path)
|
vae, _server_args(), "video_vae", str(model_path)
|
||||||
)
|
)
|
||||||
@@ -127,8 +127,33 @@ def test_the_store_kill_switch_keeps_the_copies_in_memory(monkeypatch, tmp_path)
|
|||||||
vae, _server_args(), "video_vae", str(model_path)
|
vae, _server_args(), "video_vae", str(model_path)
|
||||||
)
|
)
|
||||||
|
|
||||||
path = _decode_dtype_store_path(str(model_path), "video_vae", torch.float16)
|
path = _decode_dtype_store_path(str(model_path), "video_vae", torch.float16, vae)
|
||||||
import os
|
import os
|
||||||
|
|
||||||
assert not os.path.exists(path)
|
assert not os.path.exists(path)
|
||||||
assert all(b.weight.dtype == torch.float16 for b in vae.blocks)
|
assert all(b.weight.dtype == torch.float16 for b in vae.blocks)
|
||||||
|
|
||||||
|
|
||||||
|
def test_module_layouts_do_not_share_a_store(tmp_path):
|
||||||
|
"""A runtime exposing a different parameter set must not evict another's store."""
|
||||||
|
model_path = tmp_path / "ckpt"
|
||||||
|
model_path.mkdir()
|
||||||
|
first = _TinyVAE()
|
||||||
|
_hold_decoder_weights_in_decode_dtype(
|
||||||
|
first, _server_args(), "video_vae", str(model_path)
|
||||||
|
)
|
||||||
|
first_path = _decode_dtype_store_path(
|
||||||
|
str(model_path), "video_vae", torch.float16, first
|
||||||
|
)
|
||||||
|
other = _TinyVAE()
|
||||||
|
other.blocks.append(nn.Linear(8, 8))
|
||||||
|
_hold_decoder_weights_in_decode_dtype(
|
||||||
|
other, _server_args(), "video_vae", str(model_path)
|
||||||
|
)
|
||||||
|
other_path = _decode_dtype_store_path(
|
||||||
|
str(model_path), "video_vae", torch.float16, other
|
||||||
|
)
|
||||||
|
import os
|
||||||
|
|
||||||
|
assert first_path != other_path
|
||||||
|
assert os.path.exists(first_path) and os.path.exists(other_path)
|
||||||
|
|||||||
Reference in New Issue
Block a user