summaryrefslogtreecommitdiff
path: root/neurobench_testing/neurobench_testing.py
diff options
context:
space:
mode:
Diffstat (limited to 'neurobench_testing/neurobench_testing.py')
-rw-r--r--neurobench_testing/neurobench_testing.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/neurobench_testing/neurobench_testing.py b/neurobench_testing/neurobench_testing.py
new file mode 100644
index 0000000..338562d
--- /dev/null
+++ b/neurobench_testing/neurobench_testing.py
@@ -0,0 +1,90 @@
+import torch
+from torch.utils.data import DataLoader
+
+from neurobench.datasets import SpeechCommands
+from neurobench.processors.preprocessors import S2SPreProcessor
+from neurobench.processors.postprocessors import ChooseMaxCount
+from neurobench.models import NeuroBenchModel
+
+from neurobench.models import SNNTorchModel
+
+from neurobench.metrics.workload import (
+ ActivationSparsity,
+ SynapticOperations,
+ ClassificationAccuracy,
+)
+
+from neurobench.metrics.static import (
+ Footprint,
+ ConnectionSparsity,
+)
+
+from neurobench.benchmarks import Benchmark
+
+from torch import nn
+import snntorch as snn
+from snntorch import surrogate
+
+beta = 0.5 #this does nothing with the current model
+device = torch.device("cpu")
+spike_grad = surrogate.fast_sigmoid()
+net = nn.Sequential(
+ nn.Flatten(),
+ nn.Linear(20, 256),
+ snn.Leaky(beta=beta, spike_grad=spike_grad, init_hidden=True),
+ nn.Linear(256, 256),
+ snn.Leaky(beta=beta, spike_grad=spike_grad, init_hidden=True),
+ nn.Linear(256, 256),
+ snn.Leaky(beta=beta, spike_grad=spike_grad, init_hidden=True),
+ nn.Linear(256, 35),
+ snn.Leaky(beta=beta, spike_grad=spike_grad, init_hidden=True, output=True),
+)
+
+test_set = SpeechCommands(path="data/SpeechCommands/", subset="testing")
+test_set_loader = DataLoader(test_set, batch_size=500, shuffle=True)
+
+net.load_state_dict(torch.load("examples/gsc/model_data/s2s_gsc_snntorch", map_location=device))
+print("weight before noise: ", net[1].weight[0][0].item())
+
+#adds noise for 'simulating' memristors
+# not perfect ik but just testing it out
+noise = 0.05
+with torch.no_grad():
+ for param in net.parameters():
+ param.add_(torch.randn_like(param) * noise)
+
+print("weight after noise: ", net[1].weight[0][0].item())
+
+model = SNNTorchModel(net)
+
+preprocessors = [S2SPreProcessor(device=device)]
+postprocessors = [ChooseMaxCount()]
+
+static_metrics = [Footprint, ConnectionSparsity]
+workload_metrics = [ClassificationAccuracy, ActivationSparsity, SynapticOperations]
+
+print("Layer 1 Beta:", net[2].beta)
+print("Layer 2 Beta:", net[4].beta)
+
+benchmark = Benchmark(
+ model,
+ test_set_loader,
+ preprocessors,
+ postprocessors,
+ [static_metrics, workload_metrics]
+)
+results = benchmark.run()
+print(results)
+
+# Energy calulations
+ENERGY_PER_MAC = 0.9e-12
+ENERGY_PER_AC = 0.1e-12
+
+macs = results['SynapticOperations']['Effective_MACs']
+acs = results['SynapticOperations']['Effective_ACs']
+
+total_energy = (macs * ENERGY_PER_MAC) + (acs * ENERGY_PER_AC)
+
+print("Energy Report:")
+print(f"Total Operations: {macs} MACS, {acs} acs ")
+print(f"Calculated Energy cost: {total_energy} joules per batch")