"""Utility helpers.""" import logging import os import random import sys import numpy as np import torch def setup_logging(level=logging.INFO): logging.basicConfig( level=level, format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", handlers=[logging.StreamHandler(sys.stdout)], force=True, ) # Quiet HuggingFace logging.getLogger("transformers").setLevel(logging.WARNING) logging.getLogger("datasets").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("filelock").setLevel(logging.WARNING) def set_seed(seed: int, deterministic: bool = True) -> None: """Seed Python, NumPy, and PyTorch for more reproducible experiments.""" os.environ["PYTHONHASHSEED"] = str(seed) random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) if deterministic: torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False def seeded_generator(seed: int) -> torch.Generator: """Return a CPU generator for deterministic DataLoader shuffling.""" generator = torch.Generator() generator.manual_seed(seed) return generator