# Performance Tuning GPU detection and TF32 settings, choosing `per_core_batch_size` for the memory you have, and memory management strategies for large series counts. ## ⚙️ Performance Tuning ### GPU Acceleration ```python import torch # Check GPU availability if torch.cuda.is_available(): print(f"GPU: {torch.cuda.get_device_name(0)}") print(f"VRAM: {torch.cuda.get_device_properties(0).total_mem / 1e9:.1f} GB") elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available(): print("Apple Silicon MPS available") else: print("CPU only — inference will be slower but still works") # Always set this for Ampere+ GPUs (A100, RTX 3090, etc.) torch.set_float32_matmul_precision("high") ``` ### Batch Size Tuning ```python # Start conservative, increase until OOM # GPU with 8 GB VRAM: per_core_batch_size=64 # GPU with 16 GB VRAM: per_core_batch_size=128 # GPU with 24 GB VRAM: per_core_batch_size=256 # CPU with 8 GB RAM: per_core_batch_size=8 # CPU with 16 GB RAM: per_core_batch_size=32 # CPU with 32 GB RAM: per_core_batch_size=64 model.compile(timesfm.ForecastConfig( max_context=1024, max_horizon=256, per_core_batch_size=32, # <-- tune this normalize_inputs=True, use_continuous_quantile_head=True, fix_quantile_crossing=True, )) ``` ### Memory-Constrained Environments ```python import gc, torch # Force garbage collection before loading gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() # Load model model = timesfm.TimesFM_2p5_200M_torch.from_pretrained( "google/timesfm-2.5-200m-pytorch" ) # Use small batch size on low-memory machines model.compile(timesfm.ForecastConfig( max_context=512, # Reduce context if needed max_horizon=128, # Reduce horizon if needed per_core_batch_size=4, # Small batches normalize_inputs=True, use_continuous_quantile_head=True, fix_quantile_crossing=True, )) # Process series in chunks to avoid OOM CHUNK = 50 all_results = [] for i in range(0, len(inputs), CHUNK): chunk = inputs[i:i+CHUNK] p, q = model.forecast(horizon=H, inputs=chunk) all_results.append((p, q)) gc.collect() # Clean up between chunks ```