CLIENT_SCRIPT += r”’ def main(): p = argparse.ArgumentParser() p.add_argument(“–num_sites”, tipo=int, predeterminado=3) p.add_argument(“–alpha”, tipo=float, predeterminado=0.3) p.add_argument(“–local_epochs”, tipo=int, predeterminado=1) p.add_argument(“–mu”, tipo=float, predeterminado=0.0) p.add_argument(“–max_samples”, tipo=int, predeterminado=4000) p.add_argument(“–batch_size”, tipo=int, predeterminado=64) p.add_argument(“–lr”, tipo=float, predeterminado=0.01) p.add_argument(“–data_root”, type=str, default=”/tmp/nvflare/data”) p.add_argument(“–results_dir”, type=str, default=”/tmp/nvflare/results”) p.add_argument(“–tag”, type=str, default=”fedavg”) args = p.parse_args() dispositivo = “cuda” if torch.cuda.is_available() más “cpu” tf = T.Compose([T.ToTensor(),
T.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) train_set = torchvision.datasets.CIFAR10(args.data_root, train=True, download=False, transform=tf) test_set = torchvision.datasets.CIFAR10(args.data_root, train=False, download=False, transform=tf) flare.init() site_name = flare.get_site_name() site_id = int(nombre_sitio.split(“-“)[-1]) – 1 etiquetas = np.array(train_set.targets) my_idx = dirichlet_partition(labels, args.num_sites, args.alpha)[site_id]
si len(mi_idx) > args.max_samples: mi_idx = mi_idx[:args.max_samples]
train_loader = DataLoader(Subconjunto(train_set, my_idx), lote_size=args.batch_size, shuffle=True) test_loader = DataLoader(test_set, lote_size=512, shuffle=False) print(f”[{site_name}] mu={args.mu} muestras locales={len(my_idx)}”, Flush=True) model = Net().to(device) optimizador = torch.optim.SGD(model.parameters(), lr=args.lr, momentum=0.9) criterio = nn.CrossEntropyLoss() while flare.is_running(): input_model = flare.receive() rnd = input_model.current_round global_state = {k: torch.as_tensor(v) para k, v en input_model.params.items()} model.load_state_dict(global_state) acc = evaluar(modelo, test_loader, dispositivo) si site_id == 0: con open(os.path.join(args.results_dir, args.tag + “.csv”), “a”, newline=””) como f: csv.writer(f).writerow([rnd, acc]) imprimir(f”[{site_name}] ronda {rnd}: prueba global acc = {acc:.4f}”, descarga=True) global_w = [w.detach().clone() for w in model.parameters()]
pasos de model.train() = 0 para _ en rango(args.local_epochs): para x, y en train_loader: x, y = x.to(dispositivo), y.to(dispositivo) optimizador.zero_grad() pérdida = criterio(model(x), y) si args.mu > 0: prox = suma(((w – g) ** 2).sum() para w, g en zip(model.parameters(), global_w)) pérdida = pérdida + (args.mu / 2.0) * pérdida próxima.backward() optimizador.step() pasos += 1 salida = flare.FLModel( params={k: v.cpu().numpy() for k, v in model.state_dict().items()}, metrics={“test_accuracy”: acc}, meta={“NUM_STEPS_CURRENT_ROUND”: pasos},) flare.send(out) if __name__ == “__main__”: main() ”’ con open(“client_train.py”, “w”) como f: f.write(CLIENT_SCRIPT) sys.path.insert(0, os.getcwd()) from client_train import Net
T.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) train_set = torchvision.datasets.CIFAR10(args.data_root, train=True, download=False, transform=tf) test_set = torchvision.datasets.CIFAR10(args.data_root, train=False, download=False, transform=tf) flare.init() site_name = flare.get_site_name() site_id = int(nombre_sitio.split(“-“)[-1]) – 1 etiquetas = np.array(train_set.targets) my_idx = dirichlet_partition(labels, args.num_sites, args.alpha)[site_id]
si len(mi_idx) > args.max_samples: mi_idx = mi_idx[:args.max_samples]
train_loader = DataLoader(Subconjunto(train_set, my_idx), lote_size=args.batch_size, shuffle=True) test_loader = DataLoader(test_set, lote_size=512, shuffle=False) print(f”[{site_name}] mu={args.mu} muestras locales={len(my_idx)}”, Flush=True) model = Net().to(device) optimizador = torch.optim.SGD(model.parameters(), lr=args.lr, momentum=0.9) criterio = nn.CrossEntropyLoss() while flare.is_running(): input_model = flare.receive() rnd = input_model.current_round global_state = {k: torch.as_tensor(v) para k, v en input_model.params.items()} model.load_state_dict(global_state) acc = evaluar(modelo, test_loader, dispositivo) si site_id == 0: con open(os.path.join(args.results_dir, args.tag + “.csv”), “a”, newline=””) como f: csv.writer(f).writerow([rnd, acc]) imprimir(f”[{site_name}] ronda {rnd}: prueba global acc = {acc:.4f}”, descarga=True) global_w = [w.detach().clone() for w in model.parameters()]
pasos de model.train() = 0 para _ en rango(args.local_epochs): para x, y en train_loader: x, y = x.to(dispositivo), y.to(dispositivo) optimizador.zero_grad() pérdida = criterio(model(x), y) si args.mu > 0: prox = suma(((w – g) ** 2).sum() para w, g en zip(model.parameters(), global_w)) pérdida = pérdida + (args.mu / 2.0) * pérdida próxima.backward() optimizador.step() pasos += 1 salida = flare.FLModel( params={k: v.cpu().numpy() for k, v in model.state_dict().items()}, metrics={“test_accuracy”: acc}, meta={“NUM_STEPS_CURRENT_ROUND”: pasos},) flare.send(out) if __name__ == “__main__”: main() ”’ con open(“client_train.py”, “w”) como f: f.write(CLIENT_SCRIPT) sys.path.insert(0, os.getcwd()) from client_train import Net