Shanmuk4622 commited on
Commit
adcfcfe
·
verified ·
1 Parent(s): 8036017

Upload test3/eden_InceptionV3_CIFAR100.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. test3/eden_InceptionV3_CIFAR100.py +162 -0
test3/eden_InceptionV3_CIFAR100.py ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.optim as optim
4
+ import torchvision
5
+ import torchvision.transforms as transforms
6
+ from torch.utils.data import DataLoader
7
+ from sklearn.metrics import f1_score, precision_score, recall_score
8
+ from codecarbon import EmissionsTracker
9
+ from thop import profile
10
+ from tqdm import tqdm
11
+ import time, pandas as pd, numpy as np, os, warnings, copy, gc, ssl
12
+
13
+ # --- 1. SSL BYPASS (VIT-AP Network Fix) ---
14
+ ssl._create_default_https_context = ssl._create_unverified_context
15
+
16
+ # --- Configuration ---
17
+ MODEL_NAME = "inceptionV3_EDEN"
18
+ DATASET_NAME = "CIFAR100"
19
+ DATA_PATH = r'C:\Users\shanm\Dataset Download\CIFAR100'
20
+ BATCH_SIZE = 32
21
+ ACCUMULATION_STEPS = 16
22
+ EPOCHS = 20
23
+ E_UNFREEZE = 10
24
+ LAMBDA_L1 = 1e-5
25
+ DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
26
+
27
+ SAVE_DIR = "saved_models"
28
+ os.makedirs(SAVE_DIR, exist_ok=True)
29
+ CSV_FILENAME = f"{MODEL_NAME}_{DATASET_NAME}_stats.csv"
30
+
31
+ warnings.filterwarnings("ignore")
32
+ os.environ["CODECARBON_LOG_LEVEL"] = "error"
33
+
34
+ def main():
35
+ # --- Phase 1: Data Loading ---
36
+ transform = transforms.Compose([
37
+ transforms.Resize(299),
38
+ transforms.ToTensor(),
39
+ transforms.Normalize((0.5071, 0.4867, 0.4408), (0.2673, 0.2564, 0.2762)),
40
+ ])
41
+
42
+ print(f"[*] Loading {DATASET_NAME}...")
43
+ try:
44
+ full_dataset = torchvision.datasets.CIFAR100(root=DATA_PATH, train=True, download=False, transform=transform)
45
+ except:
46
+ full_dataset = torchvision.datasets.CIFAR100(root=os.path.dirname(DATA_PATH), train=True, download=False, transform=transform)
47
+
48
+ trainloader = DataLoader(full_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4, pin_memory=True)
49
+
50
+ # --- Model Setup ---
51
+ print("[*] Initializing Pre-trained InceptionV3...")
52
+ model = torchvision.models.inception_v3(weights='IMAGENET1K_V1')
53
+
54
+ # Update both primary and auxiliary heads for 100 classes
55
+ model.AuxLogits.fc = nn.Linear(model.AuxLogits.fc.in_features, 100)
56
+ model.fc = nn.Linear(model.fc.in_features, 100)
57
+
58
+ print("[*] Calculating hardware metrics...")
59
+ model_for_profile = copy.deepcopy(model).to(DEVICE)
60
+ dummy_input = torch.randn(1, 3, 299, 299).to(DEVICE)
61
+ flops, params = profile(model_for_profile, inputs=(dummy_input, ), verbose=False)
62
+ del model_for_profile
63
+
64
+ # Initially freeze backbone
65
+ for name, param in model.named_parameters():
66
+ if "fc" not in name:
67
+ param.requires_grad = False
68
+
69
+ model.to(DEVICE)
70
+
71
+ criterion = nn.CrossEntropyLoss()
72
+ optimizer = optim.AdamW(model.parameters(), lr=1e-3)
73
+ scaler = torch.cuda.amp.GradScaler()
74
+
75
+ # --- 2. Variable Initialization (Scope Fix) ---
76
+ results = []
77
+ cumulative_total_energy = 0
78
+ best_acc = 0.0
79
+
80
+ tracker = EmissionsTracker(measure_power_secs=1, save_to_file=False, log_level='error')
81
+
82
+ print(f"\n[MODEL INFO] FLOPs: {flops/1e9:.2f} G | Parameters: {params/1e6:.2f} M | Batch Size: {BATCH_SIZE}")
83
+ print(f"{'='*140}")
84
+ print(f"{'Epoch':<6} | {'Loss':<7} | {'Acc':<7} | {'Total(J)':<9} | {'VRAM(GB)':<9} | {'EAG':<8} | {'Status'}")
85
+ print(f"{'-'*140}")
86
+
87
+ for epoch in range(1, EPOCHS + 1):
88
+ if epoch == E_UNFREEZE:
89
+ for param in model.parameters(): param.requires_grad = True
90
+ for pg in optimizer.param_groups: pg['lr'] = 1e-5
91
+ status_msg = "UNFROZEN"
92
+ else:
93
+ status_msg = "FROZEN" if epoch < E_UNFREEZE else "FINE-TUNING"
94
+
95
+ model.train()
96
+ tracker.start()
97
+ epoch_start = time.time()
98
+ running_loss, all_preds, all_labels = 0.0, [], []
99
+
100
+ # Real-time progress bar
101
+ pbar = tqdm(enumerate(trainloader), total=len(trainloader), desc=f"Epoch {epoch:02d}", leave=False)
102
+
103
+ optimizer.zero_grad()
104
+ for i, (inputs, labels) in pbar:
105
+ inputs, labels = inputs.to(DEVICE), labels.to(DEVICE)
106
+
107
+ with torch.cuda.amp.autocast():
108
+ outputs, aux_outputs = model(inputs)
109
+ cls_loss = criterion(outputs, labels) + 0.4 * criterion(aux_outputs, labels)
110
+
111
+ l1_penalty = sum(p.abs().sum() for p in model.parameters() if p.requires_grad)
112
+ loss = (cls_loss + LAMBDA_L1 * l1_penalty) / ACCUMULATION_STEPS
113
+
114
+ scaler.scale(loss).backward()
115
+
116
+ if (i + 1) % ACCUMULATION_STEPS == 0:
117
+ scaler.unscale_(optimizer)
118
+ torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
119
+ scaler.step(optimizer); scaler.update(); optimizer.zero_grad()
120
+
121
+ running_loss += cls_loss.item()
122
+ _, predicted = torch.max(outputs.data, 1)
123
+ all_preds.extend(predicted.cpu().numpy()); all_labels.extend(labels.cpu().numpy())
124
+ pbar.set_postfix({'loss': f"{cls_loss.item():.4f}"})
125
+
126
+ emissions_kg = tracker.stop()
127
+ duration = time.time() - epoch_start
128
+
129
+ e_gpu = tracker.final_emissions_data.gpu_energy * 3600000
130
+ e_cpu = tracker.final_emissions_data.cpu_energy * 3600000
131
+ e_ram = tracker.final_emissions_data.ram_energy * 3600000
132
+ total_energy = e_gpu + e_cpu + e_ram
133
+ cumulative_total_energy += total_energy
134
+
135
+ acc = (np.array(all_preds) == np.array(all_labels)).mean()
136
+ vram_peak = torch.cuda.max_memory_allocated(DEVICE) / (1024**3)
137
+ eag = acc / (total_energy / 1000) if total_energy > 0 else 0
138
+
139
+ # Detailed Audit Row
140
+ stats = {
141
+ "epoch": epoch, "status": status_msg, "loss": running_loss / len(trainloader),
142
+ "accuracy": acc, "total_energy_j": total_energy, "cumulative_total_energy_j": cumulative_total_energy,
143
+ "carbon_kg": emissions_kg, "vram_gb": vram_peak, "eag_metric": eag,
144
+ "model_flops": flops, "model_params": params
145
+ }
146
+ results.append(stats)
147
+ pd.DataFrame(results).to_csv(CSV_FILENAME, index=False)
148
+
149
+ best_tag = ""
150
+ if acc > best_acc:
151
+ best_acc = acc
152
+ torch.save(model.state_dict(), os.path.join(SAVE_DIR, f"BEST_{MODEL_NAME}_{DATASET_NAME}.pth"))
153
+ best_tag = "*"
154
+
155
+ print(f"{epoch:02d}/{EPOCHS:02d} | {stats['loss']:.4f} | {acc:.2%} | {total_energy:<9.2f} | {vram_peak:<9.3f} | {eag:<8.4f} | {status_msg}{best_tag}")
156
+
157
+ # Memory Flush
158
+ del model, trainloader
159
+ torch.cuda.empty_cache(); gc.collect()
160
+
161
+ if __name__ == '__main__':
162
+ main()