예제 #1
0
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)
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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 = {}
예제 #6
0
# 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'))