alisrbdni commited on
Commit
6282b8b
·
verified ·
1 Parent(s): 6a90ec6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -1215
app.py CHANGED
@@ -1,220 +1,3 @@
1
- # %%writefile app.py
2
-
3
- import streamlit as st
4
- import matplotlib.pyplot as plt
5
- import torch
6
- from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification, AdamW
7
- from datasets import load_dataset, Dataset
8
- from evaluate import load as load_metric
9
- from torch.utils.data import DataLoader
10
- import pandas as pd
11
- import random
12
- from collections import OrderedDict
13
- import flwr as fl
14
-
15
- DEVICE = torch.device("cpu")
16
-
17
- def load_data(dataset_name, train_size=20, test_size=20, num_clients=2):
18
- raw_datasets = load_dataset(dataset_name)
19
- raw_datasets = raw_datasets.shuffle(seed=42)
20
- del raw_datasets["unsupervised"]
21
-
22
- tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
23
-
24
- def tokenize_function(examples):
25
- return tokenizer(examples["text"], truncation=True)
26
-
27
- tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
28
- tokenized_datasets = tokenized_datasets.remove_columns("text")
29
- tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
30
-
31
- train_datasets = []
32
- test_datasets = []
33
-
34
- for _ in range(num_clients):
35
- train_dataset = tokenized_datasets["train"].select(random.sample(range(len(tokenized_datasets["train"])), train_size))
36
- test_dataset = tokenized_datasets["test"].select(random.sample(range(len(tokenized_datasets["test"])), test_size))
37
- train_datasets.append(train_dataset)
38
- test_datasets.append(test_dataset)
39
-
40
- data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
41
-
42
- return train_datasets, test_datasets, data_collator
43
- def read_log_file():
44
- with open("./log.txt", "r") as file:
45
- return file.read()
46
- def train(net, trainloader, epochs):
47
- optimizer = AdamW(net.parameters(), lr=5e-5)
48
- net.train()
49
- for _ in range(epochs):
50
- for batch in trainloader:
51
- batch = {k: v.to(DEVICE) for k, v in batch.items()}
52
- outputs = net(**batch)
53
- loss = outputs.loss
54
- loss.backward()
55
- optimizer.step()
56
- optimizer.zero_grad()
57
-
58
- def test(net, testloader):
59
- metric = load_metric("accuracy")
60
- net.eval()
61
- loss = 0
62
- for batch in testloader:
63
- batch = {k: v.to(DEVICE) for k, v in batch.items()}
64
- with torch.no_grad():
65
- outputs = net(**batch)
66
- logits = outputs.logits
67
- loss += outputs.loss.item()
68
- predictions = torch.argmax(logits, dim=-1)
69
- metric.add_batch(predictions=predictions, references=batch["labels"])
70
- loss /= len(testloader)
71
- accuracy = metric.compute()["accuracy"]
72
- return loss, accuracy
73
-
74
- class CustomClient(fl.client.NumPyClient):
75
- def __init__(self, net, trainloader, testloader, client_id):
76
- self.net = net
77
- self.trainloader = trainloader
78
- self.testloader = testloader
79
- self.client_id = client_id
80
- self.losses = []
81
- self.accuracies = []
82
-
83
- def get_parameters(self, config):
84
- return [val.cpu().numpy() for _, val in self.net.state_dict().items()]
85
-
86
- def set_parameters(self, parameters):
87
- params_dict = zip(self.net.state_dict().keys(), parameters)
88
- state_dict = OrderedDict({k: torch.Tensor(v) for k, v in params_dict})
89
- self.net.load_state_dict(state_dict, strict=True)
90
-
91
- def fit(self, parameters, config):
92
- self.set_parameters(parameters)
93
- train(self.net, self.trainloader, epochs=1)
94
- loss, accuracy = test(self.net, self.testloader)
95
- self.losses.append(loss)
96
- self.accuracies.append(accuracy)
97
- return self.get_parameters(config={}), len(self.trainloader.dataset), {}
98
-
99
- def evaluate(self, parameters, config):
100
- self.set_parameters(parameters)
101
- loss, accuracy = test(self.net, self.testloader)
102
- return float(loss), len(self.testloader.dataset), {"accuracy": float(accuracy)}
103
-
104
- def plot_metrics(self, round_num, plot_placeholder):
105
- if self.losses and self.accuracies:
106
- plot_placeholder.write(f"#### Client {self.client_id} Metrics for Round {round_num}")
107
- plot_placeholder.write(f"Loss: {self.losses[-1]:.4f}")
108
- plot_placeholder.write(f"Accuracy: {self.accuracies[-1]:.4f}")
109
-
110
- fig, ax1 = plt.subplots()
111
-
112
- color = 'tab:red'
113
- ax1.set_xlabel('Round')
114
- ax1.set_ylabel('Loss', color=color)
115
- ax1.plot(range(1, len(self.losses) + 1), self.losses, color=color)
116
- ax1.tick_params(axis='y', labelcolor=color)
117
-
118
- ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
119
- color = 'tab:blue'
120
- ax2.set_ylabel('Accuracy', color=color)
121
- ax2.plot(range(1, len(self.accuracies) + 1), self.accuracies, color=color)
122
- ax2.tick_params(axis='y', labelcolor=color)
123
-
124
- fig.tight_layout()
125
- plot_placeholder.pyplot(fig)
126
-
127
- def main():
128
- st.write("## Federated Learning with Dynamic Models and Datasets for Mobile Devices")
129
- dataset_name = st.selectbox("Dataset", ["imdb", "amazon_polarity", "ag_news"])
130
- model_name = st.selectbox("Model", ["bert-base-uncased","facebook/hubert-base-ls960", "distilbert-base-uncased"])
131
-
132
- NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
133
- NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
134
-
135
- train_datasets, test_datasets, data_collator = load_data(dataset_name, num_clients=NUM_CLIENTS)
136
-
137
- trainloaders = []
138
- testloaders = []
139
- clients = []
140
-
141
- for i in range(NUM_CLIENTS):
142
- st.write(f"### Client {i+1} Datasets")
143
-
144
- train_df = pd.DataFrame(train_datasets[i])
145
- test_df = pd.DataFrame(test_datasets[i])
146
-
147
- st.write("#### Train Dataset")
148
- edited_train_df = st.data_editor(train_df, key=f"train_{i}")
149
- st.write("#### Test Dataset")
150
- edited_test_df = st.data_editor(test_df, key=f"test_{i}")
151
-
152
- edited_train_dataset = Dataset.from_pandas(edited_train_df)
153
- edited_test_dataset = Dataset.from_pandas(edited_test_df)
154
-
155
- trainloader = DataLoader(edited_train_dataset, shuffle=True, batch_size=32, collate_fn=data_collator)
156
- testloader = DataLoader(edited_test_dataset, batch_size=32, collate_fn=data_collator)
157
-
158
- trainloaders.append(trainloader)
159
- testloaders.append(testloader)
160
-
161
- net = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
162
- client = CustomClient(net, trainloader, testloader, client_id=i+1)
163
- clients.append(client)
164
-
165
- if st.button("Start Training"):
166
- def client_fn(cid):
167
- return clients[int(cid)]
168
-
169
- def weighted_average(metrics):
170
- accuracies = [num_examples * m["accuracy"] for num_examples, m in metrics]
171
- losses = [num_examples * m["loss"] for num_examples, m in metrics]
172
- examples = [num_examples for num_examples, _ in metrics]
173
- return {"accuracy": sum(accuracies) / sum(examples), "loss": sum(losses) / sum(examples)}
174
-
175
- strategy = fl.server.strategy.FedAvg(
176
- fraction_fit=1.0,
177
- fraction_evaluate=1.0,
178
- evaluate_metrics_aggregation_fn=weighted_average,
179
- )
180
-
181
- for round_num in range(NUM_ROUNDS):
182
- st.write(f"### Round {round_num + 1}")
183
- plot_placeholders = [st.empty() for _ in range(NUM_CLIENTS)]
184
- fl.common.logger.configure(identifier="myFlowerExperiment", filename="./log.txt")
185
-
186
- fl.simulation.start_simulation(
187
- client_fn=client_fn,
188
- num_clients=NUM_CLIENTS,
189
- config=fl.server.ServerConfig(num_rounds=1),
190
- strategy=strategy,
191
- client_resources={"num_cpus": 1, "num_gpus": 0},
192
- ray_init_args={"log_to_driver": False, "num_cpus": 1, "num_gpus": 0}
193
- )
194
-
195
- for i, client in enumerate(clients):
196
- st.markdown("LOGS : "+ read_log_file())
197
- client.plot_metrics(round_num + 1, plot_placeholders[i])
198
- st.write(" ")
199
-
200
- st.success("Training completed successfully!")
201
-
202
- # Display final metrics
203
- st.write("## Final Client Metrics")
204
- for client in clients:
205
- st.write(f"### Client {client.client_id}")
206
- st.write(f"Final Loss: {client.losses[-1]:.4f}")
207
- st.write(f"Final Accuracy: {client.accuracies[-1]:.4f}")
208
- client.plot_metrics(NUM_ROUNDS, st.empty())
209
- st.write(" ")
210
-
211
- else:
212
- st.write("Click the 'Start Training' button to start the training process.")
213
-
214
- if __name__ == "__main__":
215
- main()
216
-
217
- # #############
218
  # # %%writefile app.py
219
 
220
  # import streamlit as st
@@ -228,8 +11,6 @@ if __name__ == "__main__":
228
  # import random
229
  # from collections import OrderedDict
230
  # import flwr as fl
231
- # from logging import INFO, DEBUG
232
- # from flwr.common.logger import log
233
 
234
  # DEVICE = torch.device("cpu")
235
 
@@ -259,7 +40,9 @@ if __name__ == "__main__":
259
  # data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
260
 
261
  # return train_datasets, test_datasets, data_collator
262
-
 
 
263
  # def train(net, trainloader, epochs):
264
  # optimizer = AdamW(net.parameters(), lr=5e-5)
265
  # net.train()
@@ -306,20 +89,16 @@ if __name__ == "__main__":
306
  # self.net.load_state_dict(state_dict, strict=True)
307
 
308
  # def fit(self, parameters, config):
309
- # log(INFO, f"Client {self.client_id} is starting fit()")
310
  # self.set_parameters(parameters)
311
  # train(self.net, self.trainloader, epochs=1)
312
  # loss, accuracy = test(self.net, self.testloader)
313
  # self.losses.append(loss)
314
  # self.accuracies.append(accuracy)
315
- # log(INFO, f"Client {self.client_id} finished fit() with loss: {loss:.4f} and accuracy: {accuracy:.4f}")
316
  # return self.get_parameters(config={}), len(self.trainloader.dataset), {}
317
 
318
  # def evaluate(self, parameters, config):
319
- # log(INFO, f"Client {self.client_id} is starting evaluate()")
320
  # self.set_parameters(parameters)
321
  # loss, accuracy = test(self.net, self.testloader)
322
- # log(INFO, f"Client {self.client_id} finished evaluate() with loss: {loss:.4f} and accuracy: {accuracy:.4f}")
323
  # return float(loss), len(self.testloader.dataset), {"accuracy": float(accuracy)}
324
 
325
  # def plot_metrics(self, round_num, plot_placeholder):
@@ -345,14 +124,10 @@ if __name__ == "__main__":
345
  # fig.tight_layout()
346
  # plot_placeholder.pyplot(fig)
347
 
348
- # def read_log_file():
349
- # with open("log.txt", "r") as file:
350
- # return file.read()
351
-
352
  # def main():
353
  # st.write("## Federated Learning with Dynamic Models and Datasets for Mobile Devices")
354
  # dataset_name = st.selectbox("Dataset", ["imdb", "amazon_polarity", "ag_news"])
355
- # model_name = st.selectbox("Model", ["bert-base-uncased", "facebook/hubert-base-ls960", "distilbert-base-uncased"])
356
 
357
  # NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
358
  # NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
@@ -406,7 +181,8 @@ if __name__ == "__main__":
406
  # for round_num in range(NUM_ROUNDS):
407
  # st.write(f"### Round {round_num + 1}")
408
  # plot_placeholders = [st.empty() for _ in range(NUM_CLIENTS)]
409
-
 
410
  # fl.simulation.start_simulation(
411
  # client_fn=client_fn,
412
  # num_clients=NUM_CLIENTS,
@@ -417,6 +193,7 @@ if __name__ == "__main__":
417
  # )
418
 
419
  # for i, client in enumerate(clients):
 
420
  # client.plot_metrics(round_num + 1, plot_placeholders[i])
421
  # st.write(" ")
422
 
@@ -431,1009 +208,70 @@ if __name__ == "__main__":
431
  # client.plot_metrics(NUM_ROUNDS, st.empty())
432
  # st.write(" ")
433
 
434
- # # Display log.txt content
435
- # st.write("## Training Log")
436
- # st.text(read_log_file())
437
-
438
  # else:
439
  # st.write("Click the 'Start Training' button to start the training process.")
440
 
441
  # if __name__ == "__main__":
442
  # main()
443
 
444
- #############
445
-
446
- # # %%writefile app.py
447
-
448
- # import streamlit as st
449
- # import matplotlib.pyplot as plt
450
- # import torch
451
- # from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification, AdamW
452
- # from datasets import load_dataset, Dataset
453
- # from evaluate import load as load_metric
454
- # from torch.utils.data import DataLoader
455
- # import pandas as pd
456
- # import random
457
- # import warnings
458
- # from collections import OrderedDict
459
- # import flwr as fl
460
-
461
- # DEVICE = torch.device("cpu")
462
-
463
- # def load_data(dataset_name, train_size=20, test_size=20, num_clients=2):
464
- # raw_datasets = load_dataset(dataset_name)
465
- # raw_datasets = raw_datasets.shuffle(seed=42)
466
- # del raw_datasets["unsupervised"]
467
-
468
- # tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
469
-
470
- # def tokenize_function(examples):
471
- # return tokenizer(examples["text"], truncation=True)
472
-
473
- # tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
474
- # tokenized_datasets = tokenized_datasets.remove_columns("text")
475
- # tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
476
-
477
- # train_datasets = []
478
- # test_datasets = []
479
-
480
- # for _ in range(num_clients):
481
- # train_dataset = tokenized_datasets["train"].select(random.sample(range(len(tokenized_datasets["train"])), train_size))
482
- # test_dataset = tokenized_datasets["test"].select(random.sample(range(len(tokenized_datasets["test"])), test_size))
483
- # train_datasets.append(train_dataset)
484
- # test_datasets.append(test_dataset)
485
-
486
- # data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
487
-
488
- # return train_datasets, test_datasets, data_collator
489
-
490
- # def train(net, trainloader, epochs):
491
- # optimizer = AdamW(net.parameters(), lr=5e-5)
492
- # net.train()
493
- # for _ in range(epochs):
494
- # for batch in trainloader:
495
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
496
- # outputs = net(**batch)
497
- # loss = outputs.loss
498
- # loss.backward()
499
- # optimizer.step()
500
- # optimizer.zero_grad()
501
-
502
- # def test(net, testloader):
503
- # metric = load_metric("accuracy")
504
- # net.eval()
505
- # loss = 0
506
- # for batch in testloader:
507
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
508
- # with torch.no_grad():
509
- # outputs = net(**batch)
510
- # logits = outputs.logits
511
- # loss += outputs.loss.item()
512
- # predictions = torch.argmax(logits, dim=-1)
513
- # metric.add_batch(predictions=predictions, references=batch["labels"])
514
- # loss /= len(testloader)
515
- # accuracy = metric.compute()["accuracy"]
516
- # return loss, accuracy
517
-
518
- # class CustomClient(fl.client.NumPyClient):
519
- # def __init__(self, net, trainloader, testloader, client_id):
520
- # self.net = net
521
- # self.trainloader = trainloader
522
- # self.testloader = testloader
523
- # self.client_id = client_id
524
- # self.losses = []
525
- # self.accuracies = []
526
-
527
- # def get_parameters(self, config):
528
- # return [val.cpu().numpy() for _, val in self.net.state_dict().items()]
529
-
530
- # def set_parameters(self, parameters):
531
- # params_dict = zip(self.net.state_dict().keys(), parameters)
532
- # state_dict = OrderedDict({k: torch.Tensor(v) for k, v in params_dict})
533
- # self.net.load_state_dict(state_dict, strict=True)
534
-
535
- # def fit(self, parameters, config):
536
- # self.set_parameters(parameters)
537
- # train(self.net, self.trainloader, epochs=1)
538
- # loss, accuracy = test(self.net, self.testloader)
539
- # self.losses.append(loss)
540
- # self.accuracies.append(accuracy)
541
- # return self.get_parameters(config={}), len(self.trainloader.dataset), {}
542
-
543
- # def evaluate(self, parameters, config):
544
- # self.set_parameters(parameters)
545
- # loss, accuracy = test(self.net, self.testloader)
546
- # return float(loss), len(self.testloader.dataset), {"accuracy": float(accuracy)}
547
-
548
- # def plot_metrics(self, round_num):
549
- # if self.losses and self.accuracies:
550
- # st.write(f"#### Client {self.client_id} Metrics for Round {round_num}")
551
- # st.write(f"Loss: {self.losses[-1]:.4f}")
552
- # st.write(f"Accuracy: {self.accuracies[-1]:.4f}")
553
-
554
- # fig, ax1 = plt.subplots()
555
-
556
- # ax2 = ax1.twinx()
557
- # ax1.plot(range(1, len(self.losses) + 1), self.losses, 'g-')
558
- # ax2.plot(range(1, len(self.accuracies) + 1), self.accuracies, 'b-')
559
 
560
- # ax1.set_xlabel('Round')
561
- # ax1.set_ylabel('Loss', color='g')
562
- # ax2.set_ylabel('Accuracy', color='b')
563
 
564
- # plt.title(f'Client {self.client_id} Metrics')
565
- # st.pyplot(fig)
566
 
567
- # def main():
568
- # st.write("## Federated Learning with Dynamic Models and Datasets for Mobile Devices")
569
- # dataset_name = st.selectbox("Dataset", ["imdb", "amazon_polarity", "ag_news"])
570
- # model_name = st.selectbox("Model", ["bert-base-uncased", "distilbert-base-uncased"])
 
 
 
 
 
 
 
 
 
571
 
572
- # NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
573
- # NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
574
 
575
- # train_datasets, test_datasets, data_collator = load_data(dataset_name, num_clients=NUM_CLIENTS)
 
 
 
576
 
577
- # trainloaders = []
578
- # testloaders = []
579
- # clients = []
580
 
581
- # for i in range(NUM_CLIENTS):
582
- # st.write(f"### Client {i+1} Datasets")
583
 
584
- # train_df = pd.DataFrame(train_datasets[i])
585
- # test_df = pd.DataFrame(test_datasets[i])
 
586
 
587
- # st.write("#### Train Dataset")
588
- # edited_train_df = st.experimental_data_editor(train_df, key=f"train_{i}")
589
- # st.write("#### Test Dataset")
590
- # edited_test_df = st.experimental_data_editor(test_df, key=f"test_{i}")
591
 
592
- # edited_train_dataset = Dataset.from_pandas(edited_train_df)
593
- # edited_test_dataset = Dataset.from_pandas(edited_test_df)
 
 
 
594
 
595
- # trainloader = DataLoader(edited_train_dataset, shuffle=True, batch_size=32, collate_fn=data_collator)
596
- # testloader = DataLoader(edited_test_dataset, batch_size=32, collate_fn=data_collator)
597
 
598
- # trainloaders.append(trainloader)
599
- # testloaders.append(testloader)
600
 
601
- # net = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
602
- # client = CustomClient(net, trainloader, testloader, client_id=i+1)
603
- # clients.append(client)
604
-
605
- # if st.button("Start Training"):
606
- # def client_fn(cid):
607
- # return clients[int(cid)]
608
-
609
- # def weighted_average(metrics):
610
- # accuracies = [num_examples * m["accuracy"] for num_examples, m in metrics]
611
- # losses = [num_examples * m["loss"] for num_examples, m in metrics]
612
- # examples = [num_examples for num_examples, _ in metrics]
613
- # return {"accuracy": sum(accuracies) / sum(examples), "loss": sum(losses) / sum(examples)}
614
-
615
- # strategy = fl.server.strategy.FedAvg(
616
- # fraction_fit=1.0,
617
- # fraction_evaluate=1.0,
618
- # evaluate_metrics_aggregation_fn=weighted_average,
619
- # )
620
-
621
- # for round_num in range(NUM_ROUNDS):
622
- # st.write(f"### Round {round_num + 1}")
623
-
624
- # fl.simulation.start_simulation(
625
- # client_fn=client_fn,
626
- # num_clients=NUM_CLIENTS,
627
- # config=fl.server.ServerConfig(num_rounds=1),
628
- # strategy=strategy,
629
- # client_resources={"num_cpus": 1, "num_gpus": 0},
630
- # ray_init_args={"log_to_driver": False, "num_cpus": 1, "num_gpus": 0}
631
- # )
632
-
633
- # for client in clients:
634
- # client.plot_metrics(round_num + 1)
635
- # st.write(" ")
636
-
637
- # st.success(f"Training completed successfully!")
638
-
639
- # # Display final metrics
640
- # st.write("## Final Client Metrics")
641
- # for client in clients:
642
- # st.write(f"### Client {client.client_id}")
643
- # st.write(f"Final Loss: {client.losses[-1]:.4f}")
644
- # st.write(f"Final Accuracy: {client.accuracies[-1]:.4f}")
645
- # client.plot_metrics(NUM_ROUNDS)
646
- # st.write(" ")
647
-
648
- # else:
649
- # st.write("Click the 'Start Training' button to start the training process.")
650
-
651
- # if __name__ == "__main__":
652
- # main()
653
-
654
-
655
-
656
-
657
-
658
-
659
- # # %%writefile app.py
660
-
661
- # import streamlit as st
662
- # import matplotlib.pyplot as plt
663
- # import torch
664
- # from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification, AdamW
665
- # from datasets import load_dataset, Dataset
666
- # from evaluate import load as load_metric
667
- # from torch.utils.data import DataLoader
668
- # import pandas as pd
669
- # import random
670
- # import warnings
671
- # from collections import OrderedDict
672
- # import flwr as fl
673
-
674
- # DEVICE = torch.device("cpu")
675
-
676
- # def load_data(dataset_name, train_size=20, test_size=20, num_clients=2):
677
- # raw_datasets = load_dataset(dataset_name)
678
- # raw_datasets = raw_datasets.shuffle(seed=42)
679
- # del raw_datasets["unsupervised"]
680
-
681
- # tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
682
-
683
- # def tokenize_function(examples):
684
- # return tokenizer(examples["text"], truncation=True)
685
-
686
- # tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
687
- # tokenized_datasets = tokenized_datasets.remove_columns("text")
688
- # tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
689
-
690
- # train_datasets = []
691
- # test_datasets = []
692
-
693
- # for _ in range(num_clients):
694
- # train_dataset = tokenized_datasets["train"].select(random.sample(range(len(tokenized_datasets["train"])), train_size))
695
- # test_dataset = tokenized_datasets["test"].select(random.sample(range(len(tokenized_datasets["test"])), test_size))
696
- # train_datasets.append(train_dataset)
697
- # test_datasets.append(test_dataset)
698
-
699
- # data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
700
-
701
- # return train_datasets, test_datasets, data_collator
702
-
703
- # def train(net, trainloader, epochs):
704
- # optimizer = AdamW(net.parameters(), lr=5e-5)
705
- # net.train()
706
- # for _ in range(epochs):
707
- # for batch in trainloader:
708
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
709
- # outputs = net(**batch)
710
- # loss = outputs.loss
711
- # loss.backward()
712
- # optimizer.step()
713
- # optimizer.zero_grad()
714
-
715
- # def test(net, testloader):
716
- # metric = load_metric("accuracy")
717
- # net.eval()
718
- # loss = 0
719
- # for batch in testloader:
720
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
721
- # with torch.no_grad():
722
- # outputs = net(**batch)
723
- # logits = outputs.logits
724
- # loss += outputs.loss.item()
725
- # predictions = torch.argmax(logits, dim=-1)
726
- # metric.add_batch(predictions=predictions, references=batch["labels"])
727
- # loss /= len(testloader)
728
- # accuracy = metric.compute()["accuracy"]
729
- # return loss, accuracy
730
-
731
- # class CustomClient(fl.client.NumPyClient):
732
- # def __init__(self, net, trainloader, testloader, client_id):
733
- # self.net = net
734
- # self.trainloader = trainloader
735
- # self.testloader = testloader
736
- # self.client_id = client_id
737
- # self.losses = []
738
- # self.accuracies = []
739
-
740
- # def get_parameters(self, config):
741
- # return [val.cpu().numpy() for _, val in self.net.state_dict().items()]
742
-
743
- # def set_parameters(self, parameters):
744
- # params_dict = zip(self.net.state_dict().keys(), parameters)
745
- # state_dict = OrderedDict({k: torch.Tensor(v) for k, v in params_dict})
746
- # self.net.load_state_dict(state_dict, strict=True)
747
-
748
- # def fit(self, parameters, config):
749
- # self.set_parameters(parameters)
750
- # train(self.net, self.trainloader, epochs=1)
751
- # loss, accuracy = test(self.net, self.testloader)
752
- # self.losses.append(loss)
753
- # self.accuracies.append(accuracy)
754
- # return self.get_parameters(config={}), len(self.trainloader.dataset), {}
755
-
756
- # def evaluate(self, parameters, config):
757
- # self.set_parameters(parameters)
758
- # loss, accuracy = test(self.net, self.testloader)
759
- # return float(loss), len(self.testloader.dataset), {"accuracy": float(accuracy)}
760
-
761
- # def plot_metrics(self):
762
- # fig, ax1 = plt.subplots()
763
-
764
- # ax2 = ax1.twinx()
765
- # ax1.plot(range(1, len(self.losses) + 1), self.losses, 'g-')
766
- # ax2.plot(range(1, len(self.accuracies) + 1), self.accuracies, 'b-')
767
-
768
- # ax1.set_xlabel('Round')
769
- # ax1.set_ylabel('Loss', color='g')
770
- # ax2.set_ylabel('Accuracy', color='b')
771
-
772
- # plt.title(f'Client {self.client_id} Metrics')
773
- # st.pyplot(fig)
774
-
775
- # def main():
776
- # st.write("## Federated Learning with Dynamic Models and Datasets for Mobile Devices")
777
- # dataset_name = st.selectbox("Dataset", ["imdb", "amazon_polarity", "ag_news"])
778
- # model_name = st.selectbox("Model", ["bert-base-uncased", "distilbert-base-uncased"])
779
-
780
- # NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
781
- # NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
782
-
783
- # train_datasets, test_datasets, data_collator = load_data(dataset_name, num_clients=NUM_CLIENTS)
784
-
785
- # trainloaders = []
786
- # testloaders = []
787
- # clients = []
788
-
789
- # for i in range(NUM_CLIENTS):
790
- # st.write(f"### Client {i+1} Datasets")
791
-
792
- # train_df = pd.DataFrame(train_datasets[i])
793
- # test_df = pd.DataFrame(test_datasets[i])
794
-
795
- # st.write("#### Train Dataset")
796
- # edited_train_df = st.experimental_data_editor(train_df, key=f"train_{i}")
797
- # st.write("#### Test Dataset")
798
- # edited_test_df = st.experimental_data_editor(test_df, key=f"test_{i}")
799
-
800
- # edited_train_dataset = Dataset.from_pandas(edited_train_df)
801
- # edited_test_dataset = Dataset.from_pandas(edited_test_df)
802
-
803
- # trainloader = DataLoader(edited_train_dataset, shuffle=True, batch_size=32, collate_fn=data_collator)
804
- # testloader = DataLoader(edited_test_dataset, batch_size=32, collate_fn=data_collator)
805
-
806
- # trainloaders.append(trainloader)
807
- # testloaders.append(testloader)
808
-
809
- # net = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
810
- # client = CustomClient(net, trainloader, testloader, client_id=i+1)
811
- # clients.append(client)
812
-
813
- # if st.button("Start Training"):
814
- # def client_fn(cid):
815
- # return clients[int(cid)]
816
-
817
- # def weighted_average(metrics):
818
- # accuracies = [num_examples * m["accuracy"] for num_examples, m in metrics]
819
- # losses = [num_examples * m["loss"] for num_examples, m in metrics]
820
- # examples = [num_examples for num_examples, _ in metrics]
821
- # return {"accuracy": sum(accuracies) / sum(examples), "loss": sum(losses) / sum(examples)}
822
-
823
- # strategy = fl.server.strategy.FedAvg(
824
- # fraction_fit=1.0,
825
- # fraction_evaluate=1.0,
826
- # evaluate_metrics_aggregation_fn=weighted_average,
827
- # )
828
-
829
- # fl.simulation.start_simulation(
830
- # client_fn=client_fn,
831
- # num_clients=NUM_CLIENTS,
832
- # config=fl.server.ServerConfig(num_rounds=NUM_ROUNDS),
833
- # strategy=strategy,
834
- # client_resources={"num_cpus": 1, "num_gpus": 0},
835
- # ray_init_args={"log_to_driver": False, "num_cpus": 1, "num_gpus": 0}
836
- # )
837
-
838
- # st.success(f"Training completed successfully!")
839
-
840
- # for client in clients:
841
- # st.write(f"### Client {client.client_id} Model Metrics")
842
- # client.plot_metrics()
843
-
844
- # else:
845
- # st.write("Click the 'Start Training' button to start the training process.")
846
-
847
- # if __name__ == "__main__":
848
- # main()
849
-
850
-
851
-
852
- # 05/2024 # %%writefile app.py
853
-
854
- # import streamlit as st
855
- # import matplotlib.pyplot as plt
856
- # import torch
857
- # from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification, AdamW
858
- # from datasets import load_dataset, Dataset
859
- # from evaluate import load as load_metric
860
- # from torch.utils.data import DataLoader
861
- # import pandas as pd
862
- # import random
863
- # import warnings
864
- # from collections import OrderedDict
865
- # import flwr as fl
866
-
867
- # DEVICE = torch.device("cpu")
868
-
869
- # def load_data(dataset_name, train_size=20, test_size=20, num_clients=2):
870
- # raw_datasets = load_dataset(dataset_name)
871
- # raw_datasets = raw_datasets.shuffle(seed=42)
872
- # del raw_datasets["unsupervised"]
873
-
874
- # tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
875
-
876
- # def tokenize_function(examples):
877
- # return tokenizer(examples["text"], truncation=True)
878
-
879
- # tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
880
- # tokenized_datasets = tokenized_datasets.remove_columns("text")
881
- # tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
882
-
883
- # train_datasets = []
884
- # test_datasets = []
885
-
886
- # for _ in range(num_clients):
887
- # train_dataset = tokenized_datasets["train"].select(random.sample(range(len(tokenized_datasets["train"])), train_size))
888
- # test_dataset = tokenized_datasets["test"].select(random.sample(range(len(tokenized_datasets["test"])), test_size))
889
- # train_datasets.append(train_dataset)
890
- # test_datasets.append(test_dataset)
891
-
892
- # data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
893
-
894
- # return train_datasets, test_datasets, data_collator
895
-
896
- # def train(net, trainloader, epochs):
897
- # optimizer = AdamW(net.parameters(), lr=5e-5)
898
- # net.train()
899
- # for _ in range(epochs):
900
- # for batch in trainloader:
901
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
902
- # outputs = net(**batch)
903
- # loss = outputs.loss
904
- # loss.backward()
905
- # optimizer.step()
906
- # optimizer.zero_grad()
907
-
908
- # def test(net, testloader):
909
- # metric = load_metric("accuracy")
910
- # net.eval()
911
- # loss = 0
912
- # for batch in testloader:
913
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
914
- # with torch.no_grad():
915
- # outputs = net(**batch)
916
- # logits = outputs.logits
917
- # loss += outputs.loss.item()
918
- # predictions = torch.argmax(logits, dim=-1)
919
- # metric.add_batch(predictions=predictions, references=batch["labels"])
920
- # loss /= len(testloader)
921
- # accuracy = metric.compute()["accuracy"]
922
- # return loss, accuracy
923
-
924
- # class CustomClient(fl.client.NumPyClient):
925
- # def __init__(self, net, trainloader, testloader):
926
- # self.net = net
927
- # self.trainloader = trainloader
928
- # self.testloader = testloader
929
-
930
- # def get_parameters(self, config):
931
- # return [val.cpu().numpy() for _, val in self.net.state_dict().items()]
932
-
933
- # def set_parameters(self, parameters):
934
- # params_dict = zip(self.net.state_dict().keys(), parameters)
935
- # state_dict = OrderedDict({k: torch.Tensor(v) for k, v in params_dict})
936
- # self.net.load_state_dict(state_dict, strict=True)
937
-
938
- # def fit(self, parameters, config):
939
- # self.set_parameters(parameters)
940
- # train(self.net, self.trainloader, epochs=1)
941
- # return self.get_parameters(config={}), len(self.trainloader.dataset), {}
942
-
943
- # def evaluate(self, parameters, config):
944
- # self.set_parameters(parameters)
945
- # loss, accuracy = test(self.net, self.testloader)
946
- # return float(loss), len(self.testloader.dataset), {"accuracy": float(accuracy)}
947
-
948
- # def main():
949
- # st.write("## Federated Learning with Flower and Dynamic Models and Datasets for Mobile Devices")
950
- # dataset_name = st.selectbox("Dataset", ["imdb", "amazon_polarity", "ag_news"])
951
- # model_name = st.selectbox("Model", ["bert-base-uncased", "distilbert-base-uncased"])
952
-
953
- # net = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
954
-
955
- # NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
956
- # NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
957
-
958
- # train_datasets, test_datasets, data_collator = load_data(dataset_name, num_clients=NUM_CLIENTS)
959
-
960
- # trainloaders = []
961
- # testloaders = []
962
-
963
- # for i in range(NUM_CLIENTS):
964
- # st.write(f"### Client {i+1} Datasets")
965
-
966
- # train_df = pd.DataFrame(train_datasets[i])
967
- # test_df = pd.DataFrame(test_datasets[i])
968
-
969
- # st.write("#### Train Dataset")
970
- # edited_train_df = st.experimental_data_editor(train_df, key=f"train_{i}")
971
- # st.write("#### Test Dataset")
972
- # edited_test_df = st.experimental_data_editor(test_df, key=f"test_{i}")
973
-
974
- # edited_train_dataset = Dataset.from_pandas(edited_train_df)
975
- # edited_test_dataset = Dataset.from_pandas(edited_test_df)
976
-
977
- # trainloader = DataLoader(edited_train_dataset, shuffle=True, batch_size=32, collate_fn=data_collator)
978
- # testloader = DataLoader(edited_test_dataset, batch_size=32, collate_fn=data_collator)
979
-
980
- # trainloaders.append(trainloader)
981
- # testloaders.append(testloader)
982
-
983
- # if st.button("Start Training"):
984
- # round_losses = []
985
- # round_accuracies = []
986
-
987
- # clients = [CustomClient(net, trainloaders[i], testloaders[i]) for i in range(NUM_CLIENTS)]
988
-
989
- # def client_fn(cid):
990
- # return clients[int(cid)]
991
-
992
- # def weighted_average(metrics):
993
- # accuracies = [num_examples * m["accuracy"] for num_examples, m in metrics]
994
- # losses = [num_examples * m["loss"] for num_examples, m in metrics]
995
- # examples = [num_examples for num_examples, _ in metrics]
996
- # return {"accuracy": sum(accuracies) / sum(examples), "loss": sum(losses) / sum(examples)}
997
-
998
- # strategy = fl.server.strategy.FedAvg(
999
- # fraction_fit=1.0,
1000
- # fraction_evaluate=1.0,
1001
- # evaluate_metrics_aggregation_fn=weighted_average,
1002
- # )
1003
-
1004
- # fl.simulation.start_simulation(
1005
- # client_fn=client_fn,
1006
- # num_clients=NUM_CLIENTS,
1007
- # config=fl.server.ServerConfig(num_rounds=NUM_ROUNDS),
1008
- # strategy=strategy,
1009
- # client_resources={"num_cpus": 1, "num_gpus": 0},
1010
- # ray_init_args={"log_to_driver": False, "num_cpus": 1, "num_gpus": 0}
1011
- # )
1012
-
1013
- # st.success(f"Training completed successfully!")
1014
-
1015
- # else:
1016
- # st.write("Click the 'Start Training' button to start the training process.")
1017
-
1018
- # if __name__ == "__main__":
1019
- # main()
1020
-
1021
-
1022
-
1023
- ##ORIGINAL###
1024
-
1025
-
1026
- # # %%writefile app.py
1027
-
1028
- # import streamlit as st
1029
- # import matplotlib.pyplot as plt
1030
- # import torch
1031
- # from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification, AdamW
1032
- # from datasets import load_dataset
1033
- # from evaluate import load as load_metric
1034
- # from torch.utils.data import DataLoader
1035
- # import random
1036
-
1037
- # DEVICE = torch.device("cpu")
1038
- # NUM_ROUNDS = 3
1039
-
1040
-
1041
-
1042
- # def load_data(dataset_name):
1043
- # raw_datasets = load_dataset(dataset_name)
1044
- # raw_datasets = raw_datasets.shuffle(seed=42)
1045
- # del raw_datasets["unsupervised"]
1046
-
1047
- # tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
1048
-
1049
- # def tokenize_function(examples):
1050
- # return tokenizer(examples["text"], truncation=True)
1051
-
1052
- # train_population = random.sample(range(len(raw_datasets["train"])), 20)
1053
- # test_population = random.sample(range(len(raw_datasets["test"])), 20)
1054
-
1055
- # tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
1056
- # tokenized_datasets["train"] = tokenized_datasets["train"].select(train_population)
1057
- # tokenized_datasets["test"] = tokenized_datasets["test"].select(test_population)
1058
-
1059
- # tokenized_datasets = tokenized_datasets.remove_columns("text")
1060
- # tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
1061
-
1062
- # data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
1063
- # trainloader = DataLoader(tokenized_datasets["train"], shuffle=True, batch_size=32, collate_fn=data_collator)
1064
- # testloader = DataLoader(tokenized_datasets["test"], batch_size=32, collate_fn=data_collator)
1065
-
1066
- # return trainloader, testloader
1067
-
1068
- # def train(net, trainloader, epochs):
1069
- # optimizer = AdamW(net.parameters(), lr=5e-5)
1070
- # net.train()
1071
- # for _ in range(epochs):
1072
- # for batch in trainloader:
1073
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
1074
- # outputs = net(**batch)
1075
- # loss = outputs.loss
1076
- # loss.backward()
1077
- # optimizer.step()
1078
- # optimizer.zero_grad()
1079
-
1080
- # def test(net, testloader):
1081
- # metric = load_metric("accuracy")
1082
- # loss = 0
1083
- # net.eval()
1084
- # for batch in testloader:
1085
- # batch = {k: v.to(DEVICE) for k, v in batch.items()}
1086
- # with torch.no_grad():
1087
- # outputs = net(**batch)
1088
- # logits = outputs.logits
1089
- # loss += outputs.loss.item()
1090
- # predictions = torch.argmax(logits, dim=-1)
1091
- # metric.add_batch(predictions=predictions, references=batch["labels"])
1092
- # loss /= len(testloader.dataset)
1093
- # accuracy = metric.compute()["accuracy"]
1094
- # return loss, accuracy
1095
-
1096
-
1097
-
1098
-
1099
-
1100
- # from transformers import Wav2Vec2Processor, HubertForSequenceClassification
1101
- # import torch
1102
-
1103
-
1104
- # def main():
1105
- # st.write("## Federated Learning with dynamic models and datasets for mobile devices")
1106
- # dataset_name = st.selectbox("Dataset", ["imdb","audio_instruction_task", "amazon_polarity", "ag_news"])
1107
- # model_name = st.selectbox("Model", ["bert-base-uncased","facebook/hubert-base-ls960", "distilbert-base-uncased"])
1108
-
1109
- # net = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
1110
- # # processor = Wav2Vec2Processor.from_pretrained(model_name)
1111
- # # net = HubertForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
1112
-
1113
- # # feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(model_name)
1114
- # # net = HubertForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
1115
-
1116
- # NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
1117
- # NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
1118
-
1119
- # trainloader, testloader = load_data(dataset_name)
1120
-
1121
- # if st.button("Start Training"):
1122
- # round_losses = []
1123
- # round_accuracies = [] # Store accuracy values for each round
1124
- # for round_num in range(1, NUM_ROUNDS + 1):
1125
- # st.write(f"## Round {round_num}")
1126
-
1127
- # st.write("### Training Metrics for Each Client")
1128
- # for client in range(1, NUM_CLIENTS + 1):
1129
- # client_loss, client_accuracy = test(net, testloader) # Placeholder for actual client metrics
1130
- # st.write(f"Client {client}: Loss: {client_loss}, Accuracy: {client_accuracy}")
1131
-
1132
- # st.write("### Accuracy Over Rounds")
1133
- # round_accuracies.append(client_accuracy) # Append the accuracy for this round
1134
- # plt.plot(range(1, round_num + 1), round_accuracies, marker='o') # Plot accuracy over rounds
1135
- # plt.xlabel("Round")
1136
- # plt.ylabel("Accuracy")
1137
- # plt.title("Accuracy Over Rounds")
1138
- # st.pyplot()
1139
-
1140
- # st.write("### Loss Over Rounds")
1141
- # loss_value = random.random() # Placeholder for loss values
1142
- # round_losses.append(loss_value)
1143
- # rounds = list(range(1, round_num + 1))
1144
- # plt.plot(rounds, round_losses)
1145
- # plt.xlabel("Round")
1146
- # plt.ylabel("Loss")
1147
- # plt.title("Loss Over Rounds")
1148
- # st.pyplot()
1149
-
1150
- # st.success(f"Round {round_num} completed successfully!")
1151
-
1152
- # else:
1153
- # st.write("Click the 'Start Training' button to start the training process.")
1154
-
1155
- # if __name__ == "__main__":
1156
- # main()
1157
- ###ORIGINAL##
1158
-
1159
-
1160
-
1161
-
1162
- # ########################TinyLLM####################################
1163
-
1164
- # import torch
1165
- # import torch.nn as nn
1166
- # from torch.nn import functional as F
1167
-
1168
- # # hyperparameters
1169
- # batch_size = 64 # how many independent sequences will we process in parallel?
1170
- # block_size = 256 # what is the maximum context length for predictions?
1171
- # max_iters = 5000
1172
- # eval_interval = 500
1173
- # learning_rate = 3e-4
1174
- # device = 'cuda' if torch.cuda.is_available() else 'cpu'
1175
- # eval_iters = 200
1176
- # n_embd = 384
1177
- # n_head = 6
1178
- # n_layer = 6
1179
- # dropout = 0.2
1180
- # # ------------
1181
-
1182
- # torch.manual_seed(1337)
1183
-
1184
- # # wget https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt
1185
- # with open('input.txt', 'r', encoding='utf-8') as f:
1186
- # text = f.read()
1187
-
1188
- # # here are all the unique characters that occur in this text
1189
- # chars = sorted(list(set(text)))
1190
- # vocab_size = len(chars)
1191
- # # create a mapping from characters to integers
1192
- # stoi = { ch:i for i,ch in enumerate(chars) }
1193
- # itos = { i:ch for i,ch in enumerate(chars) }
1194
- # encode = lambda s: [stoi[c] for c in s] # encoder: take a string, output a list of integers
1195
- # decode = lambda l: ''.join([itos[i] for i in l]) # decoder: take a list of integers, output a string
1196
-
1197
- # # Train and test splits
1198
- # data = torch.tensor(encode(text), dtype=torch.long)
1199
- # n = int(0.9*len(data)) # first 90% will be train, rest val
1200
- # train_data = data[:n]
1201
- # val_data = data[n:]
1202
-
1203
- # # data loading
1204
- # def get_batch(split):
1205
- # # generate a small batch of data of inputs x and targets y
1206
- # data = train_data if split == 'train' else val_data
1207
- # ix = torch.randint(len(data) - block_size, (batch_size,))
1208
- # x = torch.stack([data[i:i+block_size] for i in ix])
1209
- # y = torch.stack([data[i+1:i+block_size+1] for i in ix])
1210
- # x, y = x.to(device), y.to(device)
1211
- # return x, y
1212
-
1213
- # @torch.no_grad()
1214
- # def estimate_loss():
1215
- # out = {}
1216
- # model.eval()
1217
- # for split in ['train', 'val']:
1218
- # losses = torch.zeros(eval_iters)
1219
- # for k in range(eval_iters):
1220
- # X, Y = get_batch(split)
1221
- # logits, loss = model(X, Y)
1222
- # losses[k] = loss.item()
1223
- # out[split] = losses.mean()
1224
- # model.train()
1225
- # return out
1226
-
1227
- # class Head(nn.Module):
1228
- # """ one head of self-attention """
1229
-
1230
- # def __init__(self, head_size):
1231
- # super().__init__()
1232
- # self.key = nn.Linear(n_embd, head_size, bias=False)
1233
- # self.query = nn.Linear(n_embd, head_size, bias=False)
1234
- # self.value = nn.Linear(n_embd, head_size, bias=False)
1235
- # self.register_buffer('tril', torch.tril(torch.ones(block_size, block_size)))
1236
-
1237
- # self.dropout = nn.Dropout(dropout)
1238
-
1239
- # def forward(self, x):
1240
- # # input of size (batch, time-step, channels)
1241
- # # output of size (batch, time-step, head size)
1242
- # B,T,C = x.shape
1243
- # k = self.key(x) # (B,T,hs)
1244
- # q = self.query(x) # (B,T,hs)
1245
- # # compute attention scores ("affinities")
1246
- # wei = q @ k.transpose(-2,-1) * k.shape[-1]**-0.5 # (B, T, hs) @ (B, hs, T) -> (B, T, T)
1247
- # wei = wei.masked_fill(self.tril[:T, :T] == 0, float('-inf')) # (B, T, T)
1248
- # wei = F.softmax(wei, dim=-1) # (B, T, T)
1249
- # wei = self.dropout(wei)
1250
- # # perform the weighted aggregation of the values
1251
- # v = self.value(x) # (B,T,hs)
1252
- # out = wei @ v # (B, T, T) @ (B, T, hs) -> (B, T, hs)
1253
- # return out
1254
-
1255
- # class MultiHeadAttention(nn.Module):
1256
- # """ multiple heads of self-attention in parallel """
1257
-
1258
- # def __init__(self, num_heads, head_size):
1259
- # super().__init__()
1260
- # self.heads = nn.ModuleList([Head(head_size) for _ in range(num_heads)])
1261
- # self.proj = nn.Linear(head_size * num_heads, n_embd)
1262
- # self.dropout = nn.Dropout(dropout)
1263
-
1264
- # def forward(self, x):
1265
- # out = torch.cat([h(x) for h in self.heads], dim=-1)
1266
- # out = self.dropout(self.proj(out))
1267
- # return out
1268
-
1269
- # class FeedFoward(nn.Module):
1270
- # """ a simple linear layer followed by a non-linearity """
1271
-
1272
- # def __init__(self, n_embd):
1273
- # super().__init__()
1274
- # self.net = nn.Sequential(
1275
- # nn.Linear(n_embd, 4 * n_embd),
1276
- # nn.ReLU(),
1277
- # nn.Linear(4 * n_embd, n_embd),
1278
- # nn.Dropout(dropout),
1279
- # )
1280
-
1281
- # def forward(self, x):
1282
- # return self.net(x)
1283
-
1284
- # class Block(nn.Module):
1285
- # """ Transformer block: communication followed by computation """
1286
-
1287
- # def __init__(self, n_embd, n_head):
1288
- # # n_embd: embedding dimension, n_head: the number of heads we'd like
1289
- # super().__init__()
1290
- # head_size = n_embd // n_head
1291
- # self.sa = MultiHeadAttention(n_head, head_size)
1292
- # self.ffwd = FeedFoward(n_embd)
1293
- # self.ln1 = nn.LayerNorm(n_embd)
1294
- # self.ln2 = nn.LayerNorm(n_embd)
1295
-
1296
- # def forward(self, x):
1297
- # x = x + self.sa(self.ln1(x))
1298
- # x = x + self.ffwd(self.ln2(x))
1299
- # return x
1300
-
1301
- # class GPTLanguageModel(nn.Module):
1302
-
1303
- # def __init__(self):
1304
- # super().__init__()
1305
- # # each token directly reads off the logits for the next token from a lookup table
1306
- # self.token_embedding_table = nn.Embedding(vocab_size, n_embd)
1307
- # self.position_embedding_table = nn.Embedding(block_size, n_embd)
1308
- # self.blocks = nn.Sequential(*[Block(n_embd, n_head=n_head) for _ in range(n_layer)])
1309
- # self.ln_f = nn.LayerNorm(n_embd) # final layer norm
1310
- # self.lm_head = nn.Linear(n_embd, vocab_size)
1311
-
1312
- # # better init, not covered in the original GPT video, but important, will cover in followup video
1313
- # self.apply(self._init_weights)
1314
-
1315
- # def _init_weights(self, module):
1316
- # if isinstance(module, nn.Linear):
1317
- # torch.nn.init.normal_(module.weight, mean=0.0, std=0.02)
1318
- # if module.bias is not None:
1319
- # torch.nn.init.zeros_(module.bias)
1320
- # elif isinstance(module, nn.Embedding):
1321
- # torch.nn.init.normal_(module.weight, mean=0.0, std=0.02)
1322
-
1323
- # def forward(self, idx, targets=None):
1324
- # B, T = idx.shape
1325
-
1326
- # # idx and targets are both (B,T) tensor of integers
1327
- # tok_emb = self.token_embedding_table(idx) # (B,T,C)
1328
- # pos_emb = self.position_embedding_table(torch.arange(T, device=device)) # (T,C)
1329
- # x = tok_emb + pos_emb # (B,T,C)
1330
- # x = self.blocks(x) # (B,T,C)
1331
- # x = self.ln_f(x) # (B,T,C)
1332
- # logits = self.lm_head(x) # (B,T,vocab_size)
1333
-
1334
- # if targets is None:
1335
- # loss = None
1336
- # else:
1337
- # B, T, C = logits.shape
1338
- # logits = logits.view(B*T, C)
1339
- # targets = targets.view(B*T)
1340
- # loss = F.cross_entropy(logits, targets)
1341
-
1342
- # return logits, loss
1343
-
1344
- # def generate(self, idx, max_new_tokens):
1345
- # # idx is (B, T) array of indices in the current context
1346
- # for _ in range(max_new_tokens):
1347
- # # crop idx to the last block_size tokens
1348
- # idx_cond = idx[:, -block_size:]
1349
- # # get the predictions
1350
- # logits, loss = self(idx_cond)
1351
- # # focus only on the last time step
1352
- # logits = logits[:, -1, :] # becomes (B, C)
1353
- # # apply softmax to get probabilities
1354
- # probs = F.softmax(logits, dim=-1) # (B, C)
1355
- # # sample from the distribution
1356
- # idx_next = torch.multinomial(probs, num_samples=1) # (B, 1)
1357
- # # append sampled index to the running sequence
1358
- # idx = torch.cat((idx, idx_next), dim=1) # (B, T+1)
1359
- # return idx
1360
-
1361
- # model = GPTLanguageModel()
1362
- # m = model.to(device)
1363
- # # print the number of parameters in the model
1364
- # print(sum(p.numel() for p in m.parameters())/1e6, 'M parameters')
1365
-
1366
- # # create a PyTorch optimizer
1367
- # optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate)
1368
-
1369
- # for iter in range(max_iters):
1370
-
1371
- # # every once in a while evaluate the loss on train and val sets
1372
- # if iter % eval_interval == 0 or iter == max_iters - 1:
1373
- # losses = estimate_loss()
1374
- # print(f"step {iter}: train loss {losses['train']:.4f}, val loss {losses['val']:.4f}")
1375
-
1376
- # # sample a batch of data
1377
- # xb, yb = get_batch('train')
1378
-
1379
- # # evaluate the loss
1380
- # logits, loss = model(xb, yb)
1381
- # optimizer.zero_grad(set_to_none=True)
1382
- # loss.backward()
1383
- # optimizer.step()
1384
-
1385
- # # generate from the model
1386
- # context = torch.zeros((1, 1), dtype=torch.long, device=device)
1387
- # print(decode(m.generate(context, max_new_tokens=500)[0].tolist()))
1388
- # #open('more.txt', 'w').write(decode(m.generate(context, max_new_tokens=10000)[0].tolist()))
1389
-
1390
-
1391
-
1392
-
1393
-
1394
-
1395
-
1396
-
1397
-
1398
-
1399
-
1400
- # ########################TinyLLM##################################
1401
-
1402
-
1403
-
1404
- # def main():
1405
- # st.write("## Audio Classification with HuBERT")
1406
- # dataset_name = st.selectbox("Dataset", ["librispeech", "your_audio_dataset"])
1407
- # model_name = "facebook/hubert-base-ls960"
1408
-
1409
- # processor = Wav2Vec2Processor.from_pretrained(model_name)
1410
- # net = HubertForSequenceClassification.from_pretrained(model_name, num_labels=2).to(DEVICE)
1411
-
1412
- # train_dataset, test_dataset = load_data(dataset_name)
1413
- # # Further implementation needed for actual data preparation and training loops
1414
-
1415
- # st.write("Details of further steps would be filled in based on specific requirements and dataset structure.")
1416
-
1417
- # if __name__ == "__main__":
1418
- # main()
1419
-
1420
- # from transformers import Wav2Vec2FeatureExtractor, HubertForSequenceClassification
1421
- # import torch
1422
- # import soundfile as sf
1423
 
1424
- # def load_audio(file_path):
1425
- # # Load an audio file, return waveform and sampling rate
1426
- # waveform, sample_rate = sf.read(file_path)
1427
- # return waveform, sample_rate
1428
 
1429
- # def prepare_dataset(data_paths):
1430
- # # Dummy function to simulate loading and processing a dataset
1431
- # # Replace this with actual data loading and processing logic
1432
- # features = []
1433
- # labels = []
1434
- # for path, label in data_paths:
1435
- # waveform, sr = load_audio(path)
1436
- # input_values = feature_extractor(waveform, sampling_rate=sr, return_tensors="pt").input_values
1437
- # features.append(input_values)
1438
- # labels.append(label)
1439
- # return torch.cat(features, dim=0), torch.tensor(labels)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  # # %%writefile app.py
2
 
3
  # import streamlit as st
 
11
  # import random
12
  # from collections import OrderedDict
13
  # import flwr as fl
 
 
14
 
15
  # DEVICE = torch.device("cpu")
16
 
 
40
  # data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
41
 
42
  # return train_datasets, test_datasets, data_collator
43
+ # def read_log_file():
44
+ # with open("./log.txt", "r") as file:
45
+ # return file.read()
46
  # def train(net, trainloader, epochs):
47
  # optimizer = AdamW(net.parameters(), lr=5e-5)
48
  # net.train()
 
89
  # self.net.load_state_dict(state_dict, strict=True)
90
 
91
  # def fit(self, parameters, config):
 
92
  # self.set_parameters(parameters)
93
  # train(self.net, self.trainloader, epochs=1)
94
  # loss, accuracy = test(self.net, self.testloader)
95
  # self.losses.append(loss)
96
  # self.accuracies.append(accuracy)
 
97
  # return self.get_parameters(config={}), len(self.trainloader.dataset), {}
98
 
99
  # def evaluate(self, parameters, config):
 
100
  # self.set_parameters(parameters)
101
  # loss, accuracy = test(self.net, self.testloader)
 
102
  # return float(loss), len(self.testloader.dataset), {"accuracy": float(accuracy)}
103
 
104
  # def plot_metrics(self, round_num, plot_placeholder):
 
124
  # fig.tight_layout()
125
  # plot_placeholder.pyplot(fig)
126
 
 
 
 
 
127
  # def main():
128
  # st.write("## Federated Learning with Dynamic Models and Datasets for Mobile Devices")
129
  # dataset_name = st.selectbox("Dataset", ["imdb", "amazon_polarity", "ag_news"])
130
+ # model_name = st.selectbox("Model", ["bert-base-uncased","facebook/hubert-base-ls960", "distilbert-base-uncased"])
131
 
132
  # NUM_CLIENTS = st.slider("Number of Clients", min_value=1, max_value=10, value=2)
133
  # NUM_ROUNDS = st.slider("Number of Rounds", min_value=1, max_value=10, value=3)
 
181
  # for round_num in range(NUM_ROUNDS):
182
  # st.write(f"### Round {round_num + 1}")
183
  # plot_placeholders = [st.empty() for _ in range(NUM_CLIENTS)]
184
+ # fl.common.logger.configure(identifier="myFlowerExperiment", filename="./log.txt")
185
+
186
  # fl.simulation.start_simulation(
187
  # client_fn=client_fn,
188
  # num_clients=NUM_CLIENTS,
 
193
  # )
194
 
195
  # for i, client in enumerate(clients):
196
+ # st.markdown("LOGS : "+ read_log_file())
197
  # client.plot_metrics(round_num + 1, plot_placeholders[i])
198
  # st.write(" ")
199
 
 
208
  # client.plot_metrics(NUM_ROUNDS, st.empty())
209
  # st.write(" ")
210
 
 
 
 
 
211
  # else:
212
  # st.write("Click the 'Start Training' button to start the training process.")
213
 
214
  # if __name__ == "__main__":
215
  # main()
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
 
 
 
 
218
 
219
+ # %%writefile app.py
 
220
 
221
+ import streamlit as st
222
+ import matplotlib.pyplot as plt
223
+ import torch
224
+ from transformers import AutoTokenizer, DataCollatorWithPadding, AutoModelForSequenceClassification, AdamW
225
+ from datasets import load_dataset, Dataset
226
+ from evaluate import load as load_metric
227
+ from torch.utils.data import DataLoader
228
+ import pandas as pd
229
+ import random
230
+ from collections import OrderedDict
231
+ import flwr as fl
232
+ from logging import INFO, DEBUG
233
+ from flwr.common.logger import log
234
 
235
+ DEVICE = torch.device("cpu")
 
236
 
237
+ def load_data(dataset_name, train_size=20, test_size=20, num_clients=2):
238
+ raw_datasets = load_dataset(dataset_name)
239
+ raw_datasets = raw_datasets.shuffle(seed=42)
240
+ del raw_datasets["unsupervised"]
241
 
242
+ tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
 
 
243
 
244
+ def tokenize_function(examples):
245
+ return tokenizer(examples["text"], truncation=True)
246
 
247
+ tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
248
+ tokenized_datasets = tokenized_datasets.remove_columns("text")
249
+ tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
250
 
251
+ train_datasets = []
252
+ test_datasets = []
 
 
253
 
254
+ for _ in range(num_clients):
255
+ train_dataset = tokenized_datasets["train"].select(random.sample(range(len(tokenized_datasets["train"])), train_size))
256
+ test_dataset = tokenized_datasets["test"].select(random.sample(range(len(tokenized_datasets["test"])), test_size))
257
+ train_datasets.append(train_dataset)
258
+ test_datasets.append(test_dataset)
259
 
260
+ data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
 
261
 
262
+ return train_datasets, test_datasets, data_collator, raw_datasets
 
263
 
264
+ def train(net, trainloader, epochs):
265
+ optimizer = AdamW(net.parameters(), lr=5e-5)
266
+ net.train()
267
+ for _ in range(epochs):
268
+ for batch in trainloader:
269
+ batch = {k: v.to(DEVICE) for k, v in batch.items()}
270
+ outputs = net(**batch)
271
+ loss = outputs.loss
272
+ loss.backward()
273
+ optimizer.step()
274
+ optimizer.zero_grad()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
 
276
+ def test(net, testloader
 
 
 
277