import numpy as np import pickle as pkl import torch ap = argparse.ArgumentParser() ap.add_argument("--dataset", required=True, type=str) ap.add_argument("--num-nodes", required=True, type=int) ap.add_argument("--non-iid", required=True, type=int) ap.add_argument("--repeat", required=False, type=float, default=True) ap.add_argument("--shuffle", required=False, type=booltype, default=True) ap.add_argument("--stratify", required=False, type=booltype, default=True) ap.add_argument("--uniform", required=False, type=booltype, default=False) ap.add_argument("--dry-run", required=False, type=booltype, default=False) args = vars(ap.parse_args()) args = Struct(**args) num_train = cfg.num_trains[args.dataset] num_test = cfg.num_tests[args.dataset] num_classes = cfg.output_sizes[args.dataset] kwargs = {} train_loader = get_loader(args.dataset, num_train, train=True, subset=args.repeat) test_loader = get_loader(args.dataset, num_test, train=False, subset=args.repeat)
ap = argparse.ArgumentParser() ap.add_argument('--dataset', type=str, required=False, default='mnist') ap.add_argument('--num-nodes', type=int, required=False, default=125) ap.add_argument('--epochs', type=int, required=False) ap.add_argument('--histories', type=str, nargs='+', required=True) ap.add_argument('--baselines', type=str, nargs='+', required=True) ap.add_argument('--labels', type=str, nargs='+', required=True) ap.add_argument('--name', type=str, required=True) ap.add_argument('--ncols', type=int, required=True) ap.add_argument('--dpi', type=int, required=True) ap.add_argument('--colors', type=str, nargs='+', required=False, default=[]) ap.add_argument('--fracs', type=float, nargs='+', required=False, default=[]) ap.add_argument('--accuracy', type=float, required=False) args = vars(ap.parse_args()) args = Struct(**args) fig = plt.figure(figsize=(15, 4)) ax1 = fig.add_subplot(131) ax2 = fig.add_subplot(132) ax3 = fig.add_subplot(133) colors = ['k.-', 'r.:', 'm.:', 'b.:', 'g.:', 'c.:', 'y.:', 'k.:', 'r', 'b'] if len(args.colors): colors = args.colors def get_milestone_epoch(mile_list, milestone): for idx, mile in enumerate(mile_list, 1): if mile > milestone: return idx
def argparser(): parser = argparse.ArgumentParser() # expt config parser.add_argument('--dataset', type=str, required=True) parser.add_argument('--clf', type=str, required=True) parser.add_argument('--paradigm', type=str, required=True) # stop criterion parser.add_argument('--accuracy', type=float, required=True) parser.add_argument('--patience', type=int, required=True) # clustering config parser.add_argument('--num-workers', type=int, required=True) parser.add_argument('--num-clusters', type=int, nargs='+', required=True) parser.add_argument('--uniform-clusters', type=booltype, required=False, default=True) parser.add_argument('--shuffle-workers', type=booltype, required=False, default=False) # worker training config parser.add_argument('--batch-size', type=int, required=False, default=0) parser.add_argument('--test-batch-size', type=int, required=False, default=0) parser.add_argument('--epochs', type=int, required=True) parser.add_argument('--lr', type=float, required=True) parser.add_argument('--decay', type=float, required=False, default=1e-5) parser.add_argument('--no-cuda', type=booltype, required=False, default=False) parser.add_argument('--seed', type=int, required=False, default=1) parser.add_argument('--stratify', type=booltype, required=False, default=True) parser.add_argument('--uniform-data', type=booltype, required=False, default=True) parser.add_argument('--shuffle-data', type=booltype, required=False, default=True) parser.add_argument('--non-iid', type=int, required=True) parser.add_argument('--repeat', type=int, required=True) # consensus config parser.add_argument('--factor', type=int, required=False, default=2) parser.add_argument('--eut-range', type=int, nargs='+', required=False) parser.add_argument('--eut-seed', type=int, required=False) parser.add_argument('--lut-intv', type=int, required=False) parser.add_argument('--rounds', type=int, required=False) # channel # 0: default graphs # 1: csi graphs # 2: no csi graphs parser.add_argument('--channel', type=int, required=False, default=0) # constants parser.add_argument('--beta', type=float, required=False) parser.add_argument('--mu', type=float, required=False) parser.add_argument('--delta', type=float, required=False) parser.add_argument('--zeta', type=float, required=False) parser.add_argument('--phi', type=float, required=False) parser.add_argument('--sigma', type=float, required=False) parser.add_argument('--xi', type=float, required=False) parser.add_argument('--tau-max', type=int, required=False) parser.add_argument('--e-frac', type=float, required=False) parser.add_argument('--d-frac', type=float, required=False) parser.add_argument('--cs', type=float, nargs='+', required=False) # logging and debug parser.add_argument('--log-intv', type=int, required=False, default=1) parser.add_argument('--save-model', type=booltype, required=False, default=True) parser.add_argument('--dry-run', type=booltype, required=False, default=True) args = vars(parser.parse_args()) args = Struct(**args) return args
def argparser(): parser = argparse.ArgumentParser() parser.add_argument('--dataset', type=str, required=False) parser.add_argument('--clf', type=str, required=False) parser.add_argument('--optim', type=str, required=False, default='sgd') parser.add_argument('--scheduler', type=booltype, required=False, default=False) # Type of algorithm used: Stochastic, PCA, K-Grad, TopK, etc. parser.add_argument('--paradigm', type=str, nargs='+', required=False, default=[]) parser.add_argument('--p-args', type=str, nargs='+', required=False) parser.add_argument('--ncomponent', type=int, required=False) parser.add_argument('--rp-eps', type=float, required=False) parser.add_argument('--pca-var', type=float, required=False) parser.add_argument('--sdir-full', type=booltype, required=False) parser.add_argument('--kgrads', type=int, required=False) parser.add_argument('--topk', type=float, required=False) parser.add_argument('--atomo-r', type=int, required=False) parser.add_argument('--dga-bs', type=int, required=False) parser.add_argument('--num-dga', type=int, required=False) # number of grads to be accumulated before gradient decomposition starts parser.add_argument('--residual', type=booltype, required=False) parser.add_argument('--error-tol', type=float, required=False) parser.add_argument('--num-workers', type=int, required=False) parser.add_argument('--batch-size', type=int, required=False, default=0) parser.add_argument('--test-batch-size', type=int, required=False, default=0) # Std Dev of Gaussian noise added to test datasets parser.add_argument('--noise', type=float, required=False) parser.add_argument('--start-epoch', type=int, required=False, default=1) parser.add_argument('--epochs', type=int, required=False) parser.add_argument('--tau', type=int, required=False, default=2) parser.add_argument('--loss-type', type=str, required=False, default='ce') parser.add_argument('--lr', type=float, required=False) parser.add_argument('--nesterov', type=booltype, required=False, default=False) parser.add_argument('--momentum', type=float, required=False, default=0) parser.add_argument('--decay', type=float, required=False, default=1e-5) parser.add_argument('--no-cuda', type=booltype, required=False, default=False) parser.add_argument('--device-id', type=int, nargs='+', required=False) parser.add_argument('--seed', type=int, required=False, default=1) parser.add_argument('--stratify', type=booltype, required=False, default=True) # If data should be distributed uniformly among nodes parser.add_argument('--uniform-data', type=booltype, required=False, default=True) # Shuffle data between epochs among nodes # to shuffle would be an easier case as the batch would be dynamic # closer to the centralized sgd case parser.add_argument('--shuffle-data', type=booltype, required=False, default=True) # number of class labels per node parser.add_argument('--non-iid', type=int, required=False) # if the samples should be repeated among nodes or be a partition parser.add_argument('--repeat', type=float, required=False) parser.add_argument('--dry-run', type=booltype, required=False, default=True) parser.add_argument('--early-stopping', type=booltype, required=False, default=False) parser.add_argument('--patience', type=int, required=False, default=2) parser.add_argument('--log-intv', type=int, required=False, default=1) parser.add_argument('--save-model', type=booltype, required=False, default=False) parser.add_argument('--load-model', type=str, required=False, default=False) args = vars(parser.parse_args()) args = Struct(**args) return args
lut_schedule = get_lut_schedule(args) print('EUT: ', eut_schedule) print('LUT: ', lut_schedule) print('Rounds: ', args.rounds) print('+' * 80) print('Training') print('epoch \t tr loss (acc) (mean+-std) \t test loss (acc) \t EUT') worker_models = {} worker_memory = {} # not calculated if lut given manually (used for proof of concept) kwargs = {} if args.paradigm == 'hl' and not args.lut_intv: kwargs['gamma'] = 2 / args.mu kwargs['alpha'] = estimate_alpha(args, Struct(**kwargs)) kwargs['omega_max'] = estimate_omega_max(args, Struct(**kwargs)) kwargs['omega'] = args.omega kwargs['nu'] = estimate_nu(args, Struct(**kwargs)) kwargs['phi'] = args.phi if args.phi \ else estimate_phi(kwargs['alpha'], args, Struct(**kwargs)) kwargs['M'] = get_num_params(model) kwargs = Struct(**kwargs) print('+' * 80) print(kwargs.__dict__) print('+' * 80) aggregate_eps = defaultdict(list) aggregate_rounds = {} aggregate_sc = {} aggregate_lamda = {}
# matplotlib.rcParams['lines.linewidth'] = 2.0 # matplotlib.rcParams['lines.markersize'] = 8 ap = argparse.ArgumentParser() ap.add_argument('--dataset', type=str, required=False) ap.add_argument('--num-nodes', type=int, required=False) ap.add_argument('--histories', type=str, nargs='+', required=True) ap.add_argument('--labels', type=str, nargs='+', required=True) ap.add_argument('--name', type=str, required=True) ap.add_argument('--ncols', type=int, required=True) ap.add_argument('--dpi', type=int, required=True) ap.add_argument('--colors', type=str, nargs='+', required=False, default=[]) ap.add_argument('--epochs', type=int, required=False) ap.add_argument('--infer-folder', type=int, required=True) args = vars(ap.parse_args()) args = Struct(**args) fig = plt.figure(figsize=(10, 4)) ax1 = fig.add_subplot(121) ax2 = fig.add_subplot(122) colors = ['k.-', 'r.:', 'm.:', 'b.:', 'g.:', 'c.:', 'y.:', 'k.:'] if len(args.colors) > 0: colors = args.colors for idx, history in enumerate(args.histories): if args.infer_folder == 1: history = '../ckpts/{}_{}/history/{}'.format(args.dataset, args.num_nodes, history) h_epoch, h_acc, _, _, h_loss, _, _, h_uplink, _, _ = pkl.load( open(history, 'rb'))