Release 4.0.0: repository is the replication package (protocol, records, audit, conventions, fixed toolkit)
b890fab verified Download scripts/bench_memory_scaling.py from sgao-academics/causalscale: direct link, hf CLI and curl.
- Browser
- Download file 3.5 kB
-
https://huggingface.co/sgao-academics/causalscale/resolve/main/scripts/bench_memory_scaling.py
- Command line
-
hf download hf://sgao-academics/causalscale/scripts/bench_memory_scaling.py
-
curl -L -o bench_memory_scaling.py https://huggingface.co/sgao-academics/causalscale/resolve/main/scripts/bench_memory_scaling.py
3.5 kB
| """Direct LowRankGNN memory benchmark without causalscale import.""" | |
| import time, json, numpy as np | |
| import torch | |
| import torch.nn as nn | |
| import torch.optim as optim | |
| def make_er_dag(d, seed=42, degree=2): | |
| np.random.seed(seed) | |
| W = np.zeros((d, d)) | |
| p = degree / (d - 1) | |
| for i in range(d): | |
| for j in range(d): | |
| if i != j and np.random.random() < p: | |
| W[j, i] = np.random.uniform(0.5, 1.0) * np.random.choice([-1, 1]) | |
| for j in range(d): | |
| W[j, :j] = 0 | |
| return W | |
| def lowrank_dag_loss(U, V, X, lambda1=0.001): | |
| """Compute NOTEARS-like loss with low-rank W=U@V.T""" | |
| W = U @ V.T | |
| recon = 0.5 * torch.mean((X - X @ W) ** 2) | |
| l1 = lambda1 * (torch.norm(U, 1) + torch.norm(V, 1)) | |
| # DAG constraint via exp(W*W) | |
| M = W * W | |
| h_val = torch.trace(torch.matrix_exp(M)) - U.shape[0] | |
| return recon + l1, h_val | |
| def bench_dimension(d, r, n, epochs=300, lr=3e-4): | |
| X = torch.randn(n, d, dtype=torch.float32).cuda() | |
| U = torch.randn(d, r, dtype=torch.float32).cuda() * 0.01 | |
| U = U.detach().requires_grad_(True) | |
| V = torch.randn(d, r, dtype=torch.float32).cuda() * 0.01 | |
| V = V.detach().requires_grad_(True) | |
| opt = optim.Adam([U, V], lr=lr) | |
| torch.cuda.empty_cache() | |
| torch.cuda.reset_peak_memory_stats() | |
| t0 = time.time() | |
| try: | |
| for _ in range(epochs): | |
| opt.zero_grad() | |
| loss, _ = lowrank_dag_loss(U, V, X) | |
| loss.backward() | |
| opt.step() | |
| t1 = time.time() | |
| mem = torch.cuda.max_memory_allocated() / 1e9 | |
| with torch.no_grad(): | |
| W = (U @ V.T).cpu().numpy() | |
| n_edges = int(np.sum(np.abs(W) > 0.3)) | |
| return {'d': d, 'r': r, 'n': n, 'time_s': round(t1-t0, 1), | |
| 'vram_gb': round(mem, 2), 'edges': n_edges, 'status': 'ok'} | |
| except torch.cuda.OutOfMemoryError: | |
| return {'d': d, 'r': r, 'n': n, 'time_s': 0, 'vram_gb': 'OOM', 'edges': 0, 'status': 'oom'} | |
| except Exception as e: | |
| return {'d': d, 'r': r, 'n': n, 'time_s': 0, 'vram_gb': str(e)[:40], 'edges': 0, 'status': 'error'} | |
| print(f"GPU: {torch.cuda.get_device_name(0)}") | |
| print(f"VRAM: {torch.cuda.get_device_properties(0).total_memory/1e9:.1f} GB\n") | |
| results = [] | |
| for d in [100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000]: | |
| r = min(64, max(2, d // 16)) | |
| n = min(500, d) | |
| print(f"d={d}, r={r}, n={n}... ", end='', flush=True) | |
| res = bench_dimension(d, r, n, epochs=200, lr=3e-4) | |
| results.append(res) | |
| print(f"{res['time_s']}s, {res['vram_gb']} GB, {res['edges']} edges") | |
| # Save | |
| out = r'results/memory_scaling.json' | |
| json.dump(results, open(out, 'w'), indent=2) | |
| # Extrapolation | |
| valid = [r for r in results if isinstance(r['vram_gb'], (int, float)) and r['vram_gb'] > 0] | |
| if len(valid) >= 2: | |
| # Linear fit: VRAM = a * d + b | |
| ds = np.array([r['d'] for r in valid]) | |
| mems = np.array([r['vram_gb'] for r in valid]) | |
| a, b = np.polyfit(ds, mems, 1) | |
| est_100m = a * 1e8 + b | |
| print(f"\nVRAM ~ {a:.2e}*d + {b:.2f}") | |
| print(f"d=1e8 VRAM (FP32): {est_100m:.0f} GB") | |
| print(f"d=1e8 VRAM (FP16): {est_100m/2:.0f} GB") | |
| print(f"d=1e8 VRAM (FP16+checkpoint): {est_100m/4:.0f} GB") | |
| print(f"A100-80GB GPUs needed (FP16+checkpoint): {est_100m/4/80:.1f}") | |
| print(f"\nMemory complexity: O(d) confirmed (R^2 of fit = {1 - np.var(mems - a*ds - b)/np.var(mems):.4f})") | |
| print(f"\nSaved {out}") | |