mirror of
https://github.com/storytold/FineTrainers-Conditioning.git
synced 2026-10-18 07:33:20 +00:00
update
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
from pathlib import Path
|
||||
from typing import Union
|
||||
|
||||
from accelerate.logging import get_logger
|
||||
|
||||
from ..constants import PRECOMPUTED_DIR_NAME, PRECOMPUTED_CONDITIONS_DIR_NAME, PRECOMPUTED_LATENTS_DIR_NAME
|
||||
|
||||
|
||||
logger = get_logger("finetrainers")
|
||||
|
||||
|
||||
def should_perform_precomputation(data_root: Union[str, Path]) -> bool:
|
||||
if isinstance(data_root, str):
|
||||
data_root = Path(data_root)
|
||||
conditions_dir = data_root / PRECOMPUTED_DIR_NAME / PRECOMPUTED_CONDITIONS_DIR_NAME
|
||||
latents_dir = data_root / PRECOMPUTED_DIR_NAME / PRECOMPUTED_LATENTS_DIR_NAME
|
||||
if conditions_dir.exists() and latents_dir.exists():
|
||||
num_files_conditions = len(list(conditions_dir.glob("*.pt")))
|
||||
num_files_latents = len(list(latents_dir.glob("*.pt")))
|
||||
if num_files_conditions != num_files_latents:
|
||||
logger.warning(
|
||||
f"Number of precomputed conditions ({num_files_conditions}) does not match number of precomputed latents ({num_files_latents})."
|
||||
f"Cleaning up precomputed directories and re-running precomputation."
|
||||
)
|
||||
# clean up precomputed directories
|
||||
for file in conditions_dir.glob("*.pt"):
|
||||
file.unlink()
|
||||
for file in latents_dir.glob("*.pt"):
|
||||
file.unlink()
|
||||
return True
|
||||
if num_files_conditions > 0:
|
||||
logger.info(f"Found {num_files_conditions} precomputed conditions and latents.")
|
||||
return False
|
||||
logger.info("Precomputed data not found. Running precomputation.")
|
||||
return True
|
||||
@@ -1,3 +1,6 @@
|
||||
from typing import Dict, Optional, Union
|
||||
|
||||
import torch
|
||||
from accelerate import Accelerator
|
||||
from diffusers.utils.torch_utils import is_compiled_module
|
||||
|
||||
@@ -6,3 +9,21 @@ def unwrap_model(accelerator: Accelerator, model):
|
||||
model = accelerator.unwrap_model(model)
|
||||
model = model._orig_mod if is_compiled_module(model) else model
|
||||
return model
|
||||
|
||||
|
||||
def align_device_and_dtype(
|
||||
x: Union[torch.Tensor, Dict[str, torch.Tensor]],
|
||||
device: Optional[torch.device] = None,
|
||||
dtype: Optional[torch.dtype] = None,
|
||||
):
|
||||
if isinstance(x, torch.Tensor):
|
||||
if device is not None:
|
||||
x = x.to(device)
|
||||
if dtype is not None:
|
||||
x = x.to(dtype)
|
||||
elif isinstance(x, dict):
|
||||
if device is not None:
|
||||
x = {k: align_device_and_dtype(v, device, dtype) for k, v in x.items()}
|
||||
if dtype is not None:
|
||||
x = {k: align_device_and_dtype(v, device, dtype) for k, v in x.items()}
|
||||
return x
|
||||
|
||||
Reference in New Issue
Block a user