예제 #1
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--out-dir',
                        type=str,
                        required=True,
                        help='Out directory to save results to')
    parser.add_argument('--df-path',
                        type=str,
                        required=True,
                        help='Input dataframe to draw annotations from')
    parser.add_argument('--debug', action='store_true')
    args = parser.parse_args()

    out_dir = Path(args.out_dir)
    out_dir.mkdir(exist_ok=True)

    s = Store(str(args.out_dir))

    # held_outs
    s.add_table('out', {'dists': s.OBJECT})

    df = load_dfs(path=args.df_path)
    dists = model_fit(args.debug, NUM_BETAS, df)

    s['out'].append_row({'dists': dists})

    print('store located in:', s.path)
    print(
        'In Beta-Binomial Model Analysis.ipynb: set INPUT_DATA = \'f{s.path}\''
    )
예제 #2
0
def test_L1Ball(algorithm, lr):
    # Setup
    constraint = chop.constraints.L1Ball(alpha)
    prox = constraint.prox
    lmo = constraint.lmo
    assert (constraint.prox(w) == w).all()
    w_t = Variable(torch.zeros_like(w), requires_grad=True)

    constraint_oracles = {
        stochastic.PGD.name: {
            'prox': [prox]
        },
        stochastic.PGDMadry.name: {
            'prox': [prox],
            'lmo': [lmo]
        },
        stochastic.FrankWolfe.name: {
            'lmo': [lmo]
        },
        stochastic.S3CM.name: {
            'prox1': [prox],
            'prox2': [prox]
        }
    }

    optimizer = algorithm([w_t], **(constraint_oracles[algorithm.name]), lr=lr)
    criterion = torch.nn.MSELoss(reduction='mean')

    # Logging
    store = Store(OUT_DIR)
    store.add_table('metadata', {'algorithm': str, 'lr': float})

    store['metadata'].append_row({'algorithm': optimizer.name, 'lr': lr})
    store.add_table(optimizer.name, {
        'func_val': float,
        'certificate': float,
        'norm(w_t)': float
    })
    cert = torch.tensor(np.inf)
    for ii in range(MAX_ITER):
        optimizer.zero_grad()
        loss = criterion(X.mv(w_t), y)
        loss.backward()

        optimizer.step()

        try:
            cert = next(optimizer.certificate)  # only one parameter here
        except AttributeError:
            cert = torch.tensor(np.nan)

        store.log_table_and_tb(
            optimizer.name, {
                'func_val': loss.item(),
                'certificate': cert.item(),
                'norm(w_t)': sum(abs(w_t)).item()
            })
        store[optimizer.name].flush_row()

    store.close()
예제 #3
0
def train_configs(configs: List[Config],
                  n_seeds: List[int],
                  targets: List[int],
                  n_epochs: int,
                  save_dir_artifacts: str,
                  save_dir_models: str,
                  data_aug: bool = False,
                  save_models: bool = True,
                  adv_acc: bool = False,
                  run_time_str: str = None):

    loaders_BIN, normalization_function_BIN, label_map_BIN = utils.get_binary_dataset(
        batch_size=256, transfer=True, data_aug=data_aug, targets=targets, per_target=128, random=False
    )
    train_loader_BIN, test_loader_BIN = loaders_BIN

    run_time_str = run_time_str if run_time_str is not None else datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
    for seed in n_seeds:
        for config in configs:
            dir_name = f"{config.name}_{run_time_str}_{seed}"
            store = Store(save_dir_artifacts, dir_name)
            writer = store.tensorboard

            if adv_acc:
                metrics = {
                    'test_accuracy_True': float,
                    'test_accuracy_False': float,
                    'epoch': int}
            else:
                metrics = {
                    'test_accuracy_False': float,
                    'epoch': int}

            store.add_table('result', metrics)

            # std_linear_net = utils.Linear(Nfeatures=3*32*32, Nclasses=2).cuda()
            model = get_new_model(config.robust_model)
            if not config.fine_tune:
                for param in model.parameters():
                    param.requires_grad = False
            model.fc = nn.Linear(512, len(targets)).cuda()
            model.train()

            train_model(model,
                        train_loader_BIN,
                        test_loader_BIN,
                        train_loop,
                        eval_loop,
                        step_size=config.step_size,
                        epochs=n_epochs,
                        normalization=normalization_function_BIN,
                        store=store,
                        adv_train=config.adv_train,
                        log_iterations=10,
                        adv_acc=adv_acc
                        )
            if save_models:
                path = f"{save_dir_models}/{dir_name}.pt"
                torch.save(model.state_dict(), path)
예제 #4
0
def train_model(args,
                model,
                optim,
                train_dl: DataLoader,
                valid_dl: DataLoader,
                store: Store,
                device,
                attack=None,
                ratio: int = 0):
    """
    Generic training routine, which is flexible to allow both standard and adversarial training.
    """
    start_time = time.time()

    # Initial setup
    store.add_table(consts.LOGS_TABLE, consts.LOGS_SCHEMA)
    store.add_table(consts.ARGS_TABLE, consts.ARGS_SCHEMA)
    args_info = {
        'epochs': args['--epochs'],
        'batch_size': args['--batch-size'],
        'model': 'mnist'
    }

    # store[consts.ARGS_TABLE].append_row(args_info)

    model.to(device)

    for epoch in range(args['--epochs']):
        # Train for one epoch
        train_acc, train_loss = _internal_loop(args, True, model, optim,
                                               train_dl, epoch, store, device)

        # Evaluate on validation
        with torch.no_grad():
            valid_acc, valid_loss = _internal_loop(args, False, model, None,
                                                   valid_dl, epoch, store,
                                                   device)

        # Log
        log_info = {
            'epoch': epoch,
            'train_loss': train_loss,
            'valid_loss': valid_loss,
            'train_error_rate': 1 - train_acc,
            'valid_error_rate': 1 - valid_acc,
            'valid_adv_error_rate': -1,
            'time': time.time() - start_time
        }

        # store[consts.LOGS_TABLE].append_row(log_info)

    return model
def initialize_cox_store(cox_dir='cox') -> Store:
    store = Store(cox_dir)
    store.add_table(
        'experiments',
        {
            'k': int,
            'random_state': int,
            'Train AUC': float,
            'Validation AUC': float,
            'Test AUC': float,
            'Test MCC': float,
            'start_time': str,
            # 'runtime(sec)': float,
            'classifier': str,
            'classifier_full': str
        })
    return store
예제 #6
0
def test_L1Ball(algorithm, step_size):
    # Setup
    constraint = constopt.constraints.L1Ball(alpha)
    assert (constraint.prox(w) == w).all()
    w_t = Variable(torch.zeros_like(w), requires_grad=True)

    optimizer = algorithm([w_t], constraint)
    criterion = torch.nn.MSELoss(reduction='mean')

    # Logging
    store = Store(OUT_DIR)
    store.add_table('metadata', {'algorithm': str, 'step-size': float})

    store['metadata'].append_row({
        'algorithm': optimizer.name,
        'step-size': step_size
    })
    store.add_table(optimizer.name, {
        'func_val': float,
        'FW gap': float,
        'norm(w_t)': float
    })
    gap = torch.tensor(np.inf)
    for ii in range(MAX_ITER):
        optimizer.zero_grad()
        loss = criterion(X.mv(w_t), y)
        loss.backward()

        # Compute gap
        with torch.no_grad():
            gap = constraint.fw_gap(w_t.grad, w_t)

        optimizer.step(step_size)
        store.log_table_and_tb(
            optimizer.name, {
                'func_val': loss.item(),
                'FW gap': gap.item(),
                'norm(w_t)': sum(abs(w_t)).item()
            })
        store[optimizer.name].flush_row()

    store.close()
예제 #7
0
def test_L1Ball(algorithm, lr):
    # Setup
    constraint = chop.constraints.L1Ball(alpha)
    assert (constraint.prox(w) == w).all()
    w_t = Variable(torch.zeros_like(w), requires_grad=True)

    optimizer = algorithm([w_t], constraint, lr=lr)
    criterion = torch.nn.MSELoss(reduction='mean')

    # Logging
    store = Store(OUT_DIR)
    store.add_table('metadata', {'algorithm': str, 'lr': float})

    store['metadata'].append_row({'algorithm': optimizer.name, 'lr': lr})
    store.add_table(optimizer.name, {
        'func_val': float,
        'certificate': float,
        'norm(w_t)': float
    })
    cert = torch.tensor(np.inf)
    for ii in range(MAX_ITER):
        optimizer.zero_grad()
        loss = criterion(X.mv(w_t), y)
        loss.backward()

        optimizer.step()

        cert = next(optimizer.certificate)  # only one parameter here

        store.log_table_and_tb(
            optimizer.name, {
                'func_val': loss.item(),
                'certificate': cert.item(),
                'norm(w_t)': sum(abs(w_t)).item()
            })
        store[optimizer.name].flush_row()

    store.close()
예제 #8
0
def main(params):
    for k, v in zip(params.keys(), params.values()):
        assert v is not None, f"Value for {k} is None"

    # #
    # Setup logging
    # #
    metadata_schema = schema_from_dict(params)
    base_directory = params['out_dir']
    store = Store(base_directory)

    # redirect stderr, stdout to file
    """
    def make_err_redirector(stream_name):
        tee = Tee(os.path.join(store.path, stream_name + '.txt'), stream_name)
        return tee

    stderr_tee = make_err_redirector('stderr')
    stdout_tee = make_err_redirector('stdout')
    """

    # Store the experiment path and the git commit for this experiment
    metadata_schema.update({
        'store_path':str,
        'git_commit':str
    })

    repo = git.Repo(path=os.path.dirname(os.path.realpath(__file__)),
                    search_parent_directories=True)

    metadata_table = store.add_table('metadata', metadata_schema)
    metadata_table.update_row(params)
    metadata_table.update_row({
        'store_path':store.path,
        'git_commit':repo.head.object.hexsha
    })

    metadata_table.flush_row()

    # Table for checkpointing models and envs

    if params['save_iters'] > 0:
        store.add_table('checkpoints', {
            'val_model':store.PYTORCH_STATE,
            'policy_model':store.PYTORCH_STATE,
            'envs':store.PICKLE,
            'policy_opt': store.PYTORCH_STATE,
            'val_opt': store.PYTORCH_STATE,
            'iteration':int
        })

    # The trainer object is in charge of sampling trajectories and
    # taking PPO/TRPO optimization steps

    p = Trainer.agent_from_params(params, store=store)
    if 'load_model' in params and params['load_model']:
        print('Loading pretrained model', params['load_model'])
        pretrained_models = torch.load(params['load_model'])
        p.policy_model.load_state_dict(pretrained_models['policy_model'])
        p.val_model.load_state_dict(pretrained_models['val_model'])
        # Load optimizer states. Note that 
        # p.POLICY_ADAM.load_state_dict(pretrained_models['policy_opt'])
        # p.val_opt.load_state_dict(pretrained_models['val_opt'])
        # Restore environment parameters, like mean and std.
        p.envs = pretrained_models['envs']
    rewards = []

    # Table for final results
    final_table = store.add_table('final_results', {
        'iteration':int,
        '5_rewards':float,
        'terminated_early':bool,
        'val_model':store.PYTORCH_STATE,
        'policy_model':store.PYTORCH_STATE,
        'envs':store.PICKLE,
        'policy_opt': store.PYTORCH_STATE,
        'val_opt': store.PYTORCH_STATE,
        'iteration':int
    })


    def finalize_table(iteration, terminated_early, rewards):
        final_5_rewards = np.array(rewards)[-5:].mean()
        final_table.append_row({
            'iteration':iteration,
            '5_rewards':final_5_rewards,
            'terminated_early':terminated_early,
            'iteration':iteration,
            'val_model': p.val_model.state_dict(),
            'policy_model': p.policy_model.state_dict(),
            'policy_opt': p.POLICY_ADAM.state_dict(),
            'val_opt': p.val_opt.state_dict(),
            'envs':p.envs
        })

    # Try-except so that we save if the user interrupts the process
    try:
        for i in range(params['train_steps']):
            print('Step %d' % (i,))
            if params['save_iters'] > 0 and i % params['save_iters'] == 0:
                store['checkpoints'].append_row({
                    'iteration':i,
                    'val_model': p.val_model.state_dict(),
                    'policy_model': p.policy_model.state_dict(),
                    'policy_opt': p.POLICY_ADAM.state_dict(),
                    'val_opt': p.val_opt.state_dict(),
                    'envs':p.envs
                })
            
            mean_reward = p.train_step()
            rewards.append(mean_reward)

        finalize_table(i, False, rewards)
    except KeyboardInterrupt:
        torch.save(p.val_model, 'saved_experts/%s-expert-vf' % (params['game'],))
        torch.save(p.policy_model, 'saved_experts/%s-expert-pol' % (params['game'],))

        finalize_table(i, True, rewards)
    store.close()
예제 #9
0
## Code sample to go alongside Walkthrough #2 in README.md

OUT_DIR = '/tmp/cox_example/'

try:
    shutil.rmtree(OUT_DIR)
except:
    pass

os.mkdir(OUT_DIR)

if __name__ == "__main__":
    for slope in range(5):
        store = Store(OUT_DIR)
        store.add_table('metadata', {'slope': int})
        store.add_table('line_graphs', {'mx': int, 'mx^2': int})
        store['metadata'].append_row({'slope': slope})

        for x in range(100):
            store.log_table_and_tb('line_graphs', {
                'mx': slope * x,
                'mx^2': slope * (x**2)
            })
            store['line_graphs'].flush_row()

        store.close()

    ### Collection reading
    print("Done experiments, printing results...")
    reader = CollectionReader(OUT_DIR)
예제 #10
0
def f(x):
    return (x - 2.03)**2 + 3


if __name__ == "__main__":
    # Three parameters: initial guess for x, step size, tolerance
    combos = itertools.product(np.linspace(-15, 15, 3),
                               np.linspace(1, 1e-5, 3), [1e-5])

    for x, step, tol in combos:
        store = Store(OUT_DIR)
        store.add_table(
            'metadata', {
                'step_size': float,
                'tolerance': float,
                'initial_x': float,
                'out_dir': str
            })

        store.add_table('result', {'final_x': float, 'final_opt': float})

        store.add_table('running_log', {
            'current_x': float,
            'current_f': float
        })

        store['metadata'].append_row({
            'step_size': step,
            'tolerance': tol,
            'initial_x': x,
예제 #11
0
def main(params):
    for k, v in zip(params.keys(), params.values()):
        assert v is not None, f"Value for {k} is None"

    # #
    # Setup logging
    # #
    metadata_schema = schema_from_dict(params)
    base_directory = params['out_dir']
    store = Store(base_directory)

    # redirect stderr, stdout to file
    """
    def make_err_redirector(stream_name):
        tee = Tee(os.path.join(store.path, stream_name + '.txt'), stream_name)
        return tee

    stderr_tee = make_err_redirector('stderr')
    stdout_tee = make_err_redirector('stdout')
    """

    # Store the experiment path and the git commit for this experiment
    metadata_schema.update({
        'store_path': str,
        'git_commit': str
    })

    repo = git.Repo(path=os.path.dirname(os.path.realpath(__file__)),
                    search_parent_directories=True)

    metadata_table = store.add_table('metadata', metadata_schema)
    metadata_table.update_row(params)
    metadata_table.update_row({
        'store_path': store.path,
        'git_commit': repo.head.object.hexsha
    })

    metadata_table.flush_row()

    # Extra items in table when minimax training is enabled.
    if params['mode'] == "adv_ppo" or params['mode'] == 'adv_trpo' or params['mode'] == 'adv_sa_ppo':
        adversary_table_dict = {
            'adversary_policy_model': store.PYTORCH_STATE,
            'adversary_policy_opt': store.PYTORCH_STATE,
            'adversary_val_model': store.PYTORCH_STATE,
            'adversary_val_opt': store.PYTORCH_STATE,
        }
    else:
        adversary_table_dict = {}

    # Table for checkpointing models and envs
    if params['save_iters'] > 0:
        checkpoint_dict = {
            'val_model': store.PYTORCH_STATE,
            'policy_model': store.PYTORCH_STATE,
            'envs': store.PICKLE,
            'policy_opt': store.PYTORCH_STATE,
            'val_opt': store.PYTORCH_STATE,
            'iteration': int,
            '5_rewards': float,
        }
        checkpoint_dict.update(adversary_table_dict)
        store.add_table('checkpoints', checkpoint_dict)

    # The trainer object is in charge of sampling trajectories and
    # taking PPO/TRPO optimization steps

    p = Trainer.agent_from_params(params, store=store)
    if params['initial_std'] != 1.0:
        p.policy_model.log_stdev.data[:] = np.log(params['initial_std'])
    if 'load_model' in params and params['load_model']:
        print('Loading pretrained model', params['load_model'])
        pretrained_model = torch.load(params['load_model'])
        if 'policy_model' in pretrained_model:
            p.policy_model.load_state_dict(pretrained_model['policy_model'])
        if params['deterministic']:
            print('Policy runs in deterministic mode. Ignoring Gaussian noise.')
            p.policy_model.log_stdev.data[:] = -100
        else:
            print('Policy runs in non deterministic mode with Gaussian noise.')
        if 'val_model' in pretrained_model:
            p.val_model.load_state_dict(pretrained_model['val_model'])
        if 'policy_opt' in pretrained_model:
            p.POLICY_ADAM.load_state_dict(pretrained_model['policy_opt'])
        if 'val_opt' in pretrained_model:
            p.val_opt.load_state_dict(pretrained_model['val_opt'])
        # Load adversary models.
        if 'no_load_adv_policy' in params and params['no_load_adv_policy']:
            print('Skipping loading adversary models.')
        else:
            if 'adversary_policy_model' in pretrained_model and hasattr(p, 'adversary_policy_model'):
                p.adversary_policy_model.load_state_dict(pretrained_model['adversary_policy_model'])
            if 'adversary_val_model' in pretrained_model and hasattr(p, 'adversary_val_model'):
                p.adversary_val_model.load_state_dict(pretrained_model['adversary_val_model'])
            if 'adversary_policy_opt' in pretrained_model and hasattr(p, 'adversary_policy_opt'):
                p.adversary_policy_opt.load_state_dict(pretrained_model['adversary_policy_opt'])
            if 'adversary_val_opt' in pretrained_model and hasattr(p, 'adversary_val_opt'):
                p.adversary_val_opt.load_state_dict(pretrained_model['adversary_val_opt'])
        # Load optimizer states.
        # p.POLICY_ADAM.load_state_dict(pretrained_models['policy_opt'])
        # p.val_opt.load_state_dict(pretrained_models['val_opt'])
        # Restore environment parameters, like mean and std.
        if 'envs' in pretrained_model:
            p.envs = pretrained_model['envs']
        for e in p.envs:
            e.setup_visualization(params['show_env'], params['save_frames'], params['save_frames_path'])
    rewards = []

    # Table for final results
    final_dict = {
        'iteration': int,
        '5_rewards': float,
        'terminated_early': bool,
        'val_model': store.PYTORCH_STATE,
        'policy_model': store.PYTORCH_STATE,
        'envs': store.PICKLE,
        'policy_opt': store.PYTORCH_STATE,
        'val_opt': store.PYTORCH_STATE,
    }
    final_dict.update(adversary_table_dict)
    final_table = store.add_table('final_results', final_dict)

    def add_adversary_to_table(p, table_dict):
        if params['mode'] == "adv_ppo" or params['mode'] == 'adv_trpo' or params['mode'] == 'adv_sa_ppo':
            table_dict["adversary_policy_model"] = p.adversary_policy_model.state_dict()
            table_dict["adversary_policy_opt"] = p.ADV_POLICY_ADAM.state_dict()
            table_dict["adversary_val_model"] = p.adversary_val_model.state_dict()
            table_dict["adversary_val_opt"] = p.adversary_val_opt.state_dict()
        return table_dict

    def finalize_table(iteration, terminated_early, rewards):
        final_5_rewards = np.array(rewards)[-5:].mean()
        final_dict = {
            'iteration': iteration,
            '5_rewards': final_5_rewards,
            'terminated_early': terminated_early,
            'val_model': p.val_model.state_dict(),
            'policy_model': p.policy_model.state_dict(),
            'policy_opt': p.POLICY_ADAM.state_dict(),
            'val_opt': p.val_opt.state_dict(),
            'envs': p.envs
        }
        final_dict = add_adversary_to_table(p, final_dict)
        final_table.append_row(final_dict)

    ret = 0
    # Try-except so that we save if the user interrupts the process
    try:
        for i in range(params['train_steps']):
            print('Step %d' % (i,))
            if params['save_iters'] > 0 and i % params['save_iters'] == 0 and i != 0:
                final_5_rewards = np.array(rewards)[-5:].mean()
                print(f'Saving checkpoints to {store.path} with reward {final_5_rewards:.5g}')
                checkpoint_dict = {
                    'iteration': i,
                    'val_model': p.val_model.state_dict(),
                    'policy_model': p.policy_model.state_dict(),
                    'policy_opt': p.POLICY_ADAM.state_dict(),
                    'val_opt': p.val_opt.state_dict(),
                    'envs': p.envs,
                    '5_rewards': final_5_rewards,
                }
                checkpoint_dict = add_adversary_to_table(p, checkpoint_dict)
                store['checkpoints'].append_row(checkpoint_dict)

            mean_reward = p.train_step()
            rewards.append(mean_reward)

            # For debugging and tuning, we can break in the middle.
            if i == params['force_stop_step']:
                print('Terminating early because --force-stop-step is set.')
                raise KeyboardInterrupt

        finalize_table(i, False, rewards)
    except KeyboardInterrupt:
        finalize_table(i, True, rewards)
        ret = 1
    except:
        print("An error occurred during training:")
        traceback.print_exc()
        # Other errors, make sure to finalize the cox store before exiting.
        finalize_table(i, True, rewards)
        ret = -1
    print(f'Models saved to {store.path}')
    store.close()
    return ret