This commit is contained in:
Aryan
2024-12-20 10:03:39 +01:00
parent 223add1a59
commit 66189c804b
9 changed files with 550 additions and 94 deletions
+35
View File
@@ -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
+21
View File
@@ -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