From 01ff4f82ba810ea9032e81fdbbfa1a6ff28c3379 Mon Sep 17 00:00:00 2001 From: Matej Svejda Date: Tue, 22 Jan 2019 23:40:06 +0100 Subject: [PATCH 1/4] learning rate problems in run_classifier.py --- examples/run_classifier.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/examples/run_classifier.py b/examples/run_classifier.py index 31877a5414..7adcf1097c 100644 --- a/examples/run_classifier.py +++ b/examples/run_classifier.py @@ -296,11 +296,6 @@ def accuracy(out, labels): outputs = np.argmax(out, axis=1) return np.sum(outputs == labels) -def warmup_linear(x, warmup=0.002): - if x < warmup: - return x/warmup - return 1.0 - x - def main(): parser = argparse.ArgumentParser() @@ -447,7 +442,7 @@ def main(): if args.do_train: train_examples = processor.get_train_examples(args.data_dir) num_train_steps = int( - len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps * args.num_train_epochs) + len(train_examples) / args.train_batch_size * args.num_train_epochs) # Prepare model model = BertForSequenceClassification.from_pretrained(args.bert_model, @@ -541,10 +536,6 @@ def main(): nb_tr_examples += input_ids.size(0) nb_tr_steps += 1 if (step + 1) % args.gradient_accumulation_steps == 0: - # modify learning rate with special warm up BERT uses - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) - for param_group in optimizer.param_groups: - param_group['lr'] = lr_this_step optimizer.step() optimizer.zero_grad() global_step += 1 From 9c6a48c8c3e73ed3272c07f897930c17d5b0286d Mon Sep 17 00:00:00 2001 From: Matej Svejda Date: Sun, 27 Jan 2019 14:07:24 +0100 Subject: [PATCH 2/4] fix learning rate/fp16 and warmup problem for all examples --- examples/run_classifier.py | 8 +++++++- examples/run_lm_finetuning.py | 20 ++++++++------------ examples/run_squad.py | 19 ++++++++----------- examples/run_squad2.py | 19 ++++++++----------- examples/run_swag.py | 19 ++++++++----------- 5 files changed, 39 insertions(+), 46 deletions(-) diff --git a/examples/run_classifier.py b/examples/run_classifier.py index 7adcf1097c..0b60eb66ed 100644 --- a/examples/run_classifier.py +++ b/examples/run_classifier.py @@ -33,7 +33,7 @@ from torch.utils.data.distributed import DistributedSampler from pytorch_pretrained_bert.tokenization import BertTokenizer from pytorch_pretrained_bert.modeling import BertForSequenceClassification -from pytorch_pretrained_bert.optimization import BertAdam +from pytorch_pretrained_bert.optimization import BertAdam, warmup_linear from pytorch_pretrained_bert.file_utils import PYTORCH_PRETRAINED_BERT_CACHE logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', @@ -536,6 +536,12 @@ def main(): nb_tr_examples += input_ids.size(0) nb_tr_steps += 1 if (step + 1) % args.gradient_accumulation_steps == 0: + if args.fp16: + # modify learning rate with special warm up BERT uses + # if args.fp16 is False, BertAdam is used that handles this automatically + lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + for param_group in optimizer.param_groups: + param_group['lr'] = lr_this_step optimizer.step() optimizer.zero_grad() global_step += 1 diff --git a/examples/run_lm_finetuning.py b/examples/run_lm_finetuning.py index 35a2f797c7..2e26842c14 100644 --- a/examples/run_lm_finetuning.py +++ b/examples/run_lm_finetuning.py @@ -31,7 +31,7 @@ from torch.utils.data.distributed import DistributedSampler from pytorch_pretrained_bert.tokenization import BertTokenizer from pytorch_pretrained_bert.modeling import BertForPreTraining -from pytorch_pretrained_bert.optimization import BertAdam +from pytorch_pretrained_bert.optimization import BertAdam, warmup_linear from torch.utils.data import Dataset import random @@ -42,12 +42,6 @@ logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message logger = logging.getLogger(__name__) -def warmup_linear(x, warmup=0.002): - if x < warmup: - return x/warmup - return 1.0 - x - - class BERTDataset(Dataset): def __init__(self, corpus_path, tokenizer, seq_len, encoding="utf-8", corpus_lines=None, on_memory=True): self.vocab = tokenizer.vocab @@ -527,7 +521,7 @@ def main(): train_dataset = BERTDataset(args.train_file, tokenizer, seq_len=args.max_seq_length, corpus_lines=None, on_memory=args.on_memory) num_train_steps = int( - len(train_dataset) / args.train_batch_size / args.gradient_accumulation_steps * args.num_train_epochs) + len(train_dataset) / args.train_batch_size * args.num_train_epochs) # Prepare model model = BertForPreTraining.from_pretrained(args.bert_model) @@ -607,10 +601,12 @@ def main(): nb_tr_examples += input_ids.size(0) nb_tr_steps += 1 if (step + 1) % args.gradient_accumulation_steps == 0: - # modify learning rate with special warm up BERT uses - lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_steps, args.warmup_proportion) - for param_group in optimizer.param_groups: - param_group['lr'] = lr_this_step + if args.fp16: + # modify learning rate with special warm up BERT uses + # if args.fp16 is False, BertAdam is used that handles this automatically + lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_steps, args.warmup_proportion) + for param_group in optimizer.param_groups: + param_group['lr'] = lr_this_step optimizer.step() optimizer.zero_grad() global_step += 1 diff --git a/examples/run_squad.py b/examples/run_squad.py index 39e9c50199..0881e82aba 100644 --- a/examples/run_squad.py +++ b/examples/run_squad.py @@ -36,7 +36,7 @@ from torch.utils.data.distributed import DistributedSampler from pytorch_pretrained_bert.tokenization import whitespace_tokenize, BasicTokenizer, BertTokenizer from pytorch_pretrained_bert.modeling import BertForQuestionAnswering -from pytorch_pretrained_bert.optimization import BertAdam +from pytorch_pretrained_bert.optimization import BertAdam, warmup_linear from pytorch_pretrained_bert.file_utils import PYTORCH_PRETRAINED_BERT_CACHE logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', @@ -670,11 +670,6 @@ def _compute_softmax(scores): probs.append(score / total_sum) return probs -def warmup_linear(x, warmup=0.002): - if x < warmup: - return x/warmup - return 1.0 - x - def main(): parser = argparse.ArgumentParser() @@ -794,7 +789,7 @@ def main(): train_examples = read_squad_examples( input_file=args.train_file, is_training=True) num_train_steps = int( - len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps * args.num_train_epochs) + len(train_examples) / args.train_batch_size * args.num_train_epochs) # Prepare model model = BertForQuestionAnswering.from_pretrained(args.bert_model, @@ -905,10 +900,12 @@ def main(): else: loss.backward() if (step + 1) % args.gradient_accumulation_steps == 0: - # modify learning rate with special warm up BERT uses - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) - for param_group in optimizer.param_groups: - param_group['lr'] = lr_this_step + if args.fp16: + # modify learning rate with special warm up BERT uses + # if args.fp16 is False, BertAdam is used that handles this automatically + lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + for param_group in optimizer.param_groups: + param_group['lr'] = lr_this_step optimizer.step() optimizer.zero_grad() global_step += 1 diff --git a/examples/run_squad2.py b/examples/run_squad2.py index 558b24764e..ad5e820db8 100644 --- a/examples/run_squad2.py +++ b/examples/run_squad2.py @@ -36,7 +36,7 @@ from torch.utils.data.distributed import DistributedSampler from pytorch_pretrained_bert.tokenization import whitespace_tokenize, BasicTokenizer, BertTokenizer from pytorch_pretrained_bert.modeling import BertForQuestionAnswering -from pytorch_pretrained_bert.optimization import BertAdam +from pytorch_pretrained_bert.optimization import BertAdam, warmup_linear from pytorch_pretrained_bert.file_utils import PYTORCH_PRETRAINED_BERT_CACHE logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', @@ -759,11 +759,6 @@ def _compute_softmax(scores): probs.append(score / total_sum) return probs -def warmup_linear(x, warmup=0.002): - if x < warmup: - return x/warmup - return 1.0 - x - def main(): parser = argparse.ArgumentParser() @@ -887,7 +882,7 @@ def main(): train_examples = read_squad_examples( input_file=args.train_file, is_training=True) num_train_steps = int( - len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps * args.num_train_epochs) + len(train_examples) / args.train_batch_size * args.num_train_epochs) # Prepare model model = BertForQuestionAnswering.from_pretrained(args.bert_model, @@ -999,10 +994,12 @@ def main(): else: loss.backward() if (step + 1) % args.gradient_accumulation_steps == 0: - # modify learning rate with special warm up BERT uses - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) - for param_group in optimizer.param_groups: - param_group['lr'] = lr_this_step + if args.fp16: + # modify learning rate with special warm up BERT uses + # if args.fp16 is False, BertAdam is used that handles this automatically + lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + for param_group in optimizer.param_groups: + param_group['lr'] = lr_this_step optimizer.step() optimizer.zero_grad() global_step += 1 diff --git a/examples/run_swag.py b/examples/run_swag.py index 3fb87ae3e7..597b093a26 100644 --- a/examples/run_swag.py +++ b/examples/run_swag.py @@ -29,7 +29,7 @@ from torch.utils.data.distributed import DistributedSampler from pytorch_pretrained_bert.tokenization import BertTokenizer from pytorch_pretrained_bert.modeling import BertForMultipleChoice -from pytorch_pretrained_bert.optimization import BertAdam +from pytorch_pretrained_bert.optimization import BertAdam, warmup_linear from pytorch_pretrained_bert.file_utils import PYTORCH_PRETRAINED_BERT_CACHE logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', @@ -233,11 +233,6 @@ def select_field(features, field): for feature in features ] -def warmup_linear(x, warmup=0.002): - if x < warmup: - return x/warmup - return 1.0 - x - def main(): parser = argparse.ArgumentParser() @@ -358,7 +353,7 @@ def main(): if args.do_train: train_examples = read_swag_examples(os.path.join(args.data_dir, 'train.csv'), is_training = True) num_train_steps = int( - len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps * args.num_train_epochs) + len(train_examples) / args.train_batch_size * args.num_train_epochs) # Prepare model model = BertForMultipleChoice.from_pretrained(args.bert_model, @@ -457,10 +452,12 @@ def main(): else: loss.backward() if (step + 1) % args.gradient_accumulation_steps == 0: - # modify learning rate with special warm up BERT uses - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) - for param_group in optimizer.param_groups: - param_group['lr'] = lr_this_step + if args.fp16: + # modify learning rate with special warm up BERT uses + # if args.fp16 is False, BertAdam is used that handles this automatically + lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + for param_group in optimizer.param_groups: + param_group['lr'] = lr_this_step optimizer.step() optimizer.zero_grad() global_step += 1 From 51690699976ee47bfce0765521272c78261cdbda Mon Sep 17 00:00:00 2001 From: Matej Svejda Date: Wed, 30 Jan 2019 11:47:25 +0100 Subject: [PATCH 3/4] make examples consistent, revert error in num_train_steps calculation --- examples/run_classifier.py | 6 +++--- examples/run_lm_finetuning.py | 14 +++++++++----- examples/run_squad.py | 6 +++--- examples/run_squad2.py | 6 +++--- examples/run_swag.py | 6 +++--- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/examples/run_classifier.py b/examples/run_classifier.py index 0b60eb66ed..52205552ca 100644 --- a/examples/run_classifier.py +++ b/examples/run_classifier.py @@ -411,7 +411,7 @@ def main(): raise ValueError("Invalid gradient_accumulation_steps parameter: {}, should be >= 1".format( args.gradient_accumulation_steps)) - args.train_batch_size = int(args.train_batch_size / args.gradient_accumulation_steps) + args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps random.seed(args.seed) np.random.seed(args.seed) @@ -441,8 +441,8 @@ def main(): num_train_steps = None if args.do_train: train_examples = processor.get_train_examples(args.data_dir) - num_train_steps = int( - len(train_examples) / args.train_batch_size * args.num_train_epochs) + num_train_steps = + len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs # Prepare model model = BertForSequenceClassification.from_pretrained(args.bert_model, diff --git a/examples/run_lm_finetuning.py b/examples/run_lm_finetuning.py index 2e26842c14..c9c71ad5a1 100644 --- a/examples/run_lm_finetuning.py +++ b/examples/run_lm_finetuning.py @@ -497,7 +497,7 @@ def main(): raise ValueError("Invalid gradient_accumulation_steps parameter: {}, should be >= 1".format( args.gradient_accumulation_steps)) - args.train_batch_size = int(args.train_batch_size / args.gradient_accumulation_steps) + args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps random.seed(args.seed) np.random.seed(args.seed) @@ -520,8 +520,8 @@ def main(): print("Loading Train Dataset", args.train_file) train_dataset = BERTDataset(args.train_file, tokenizer, seq_len=args.max_seq_length, corpus_lines=None, on_memory=args.on_memory) - num_train_steps = int( - len(train_dataset) / args.train_batch_size * args.num_train_epochs) + num_train_steps = + len(train_dataset) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs # Prepare model model = BertForPreTraining.from_pretrained(args.bert_model) @@ -544,6 +544,10 @@ def main(): {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01}, {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] + + t_total = num_train_steps + if args.local_rank != -1: + t_total = t_total // torch.distributed.get_world_size() if args.fp16: try: from apex.optimizers import FP16_Optimizer @@ -564,7 +568,7 @@ def main(): optimizer = BertAdam(optimizer_grouped_parameters, lr=args.learning_rate, warmup=args.warmup_proportion, - t_total=num_train_steps) + t_total=t_total) global_step = 0 if args.do_train: @@ -604,7 +608,7 @@ def main(): if args.fp16: # modify learning rate with special warm up BERT uses # if args.fp16 is False, BertAdam is used that handles this automatically - lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_steps, args.warmup_proportion) + lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) for param_group in optimizer.param_groups: param_group['lr'] = lr_this_step optimizer.step() diff --git a/examples/run_squad.py b/examples/run_squad.py index 0881e82aba..421821006e 100644 --- a/examples/run_squad.py +++ b/examples/run_squad.py @@ -757,7 +757,7 @@ def main(): raise ValueError("Invalid gradient_accumulation_steps parameter: {}, should be >= 1".format( args.gradient_accumulation_steps)) - args.train_batch_size = int(args.train_batch_size / args.gradient_accumulation_steps) + args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps random.seed(args.seed) np.random.seed(args.seed) @@ -788,8 +788,8 @@ def main(): if args.do_train: train_examples = read_squad_examples( input_file=args.train_file, is_training=True) - num_train_steps = int( - len(train_examples) / args.train_batch_size * args.num_train_epochs) + num_train_steps = + len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs # Prepare model model = BertForQuestionAnswering.from_pretrained(args.bert_model, diff --git a/examples/run_squad2.py b/examples/run_squad2.py index ad5e820db8..6adad7d8ea 100644 --- a/examples/run_squad2.py +++ b/examples/run_squad2.py @@ -850,7 +850,7 @@ def main(): raise ValueError("Invalid gradient_accumulation_steps parameter: {}, should be >= 1".format( args.gradient_accumulation_steps)) - args.train_batch_size = int(args.train_batch_size / args.gradient_accumulation_steps) + args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps random.seed(args.seed) np.random.seed(args.seed) @@ -881,8 +881,8 @@ def main(): if args.do_train: train_examples = read_squad_examples( input_file=args.train_file, is_training=True) - num_train_steps = int( - len(train_examples) / args.train_batch_size * args.num_train_epochs) + num_train_steps = + len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs # Prepare model model = BertForQuestionAnswering.from_pretrained(args.bert_model, diff --git a/examples/run_swag.py b/examples/run_swag.py index 597b093a26..1856118ac5 100644 --- a/examples/run_swag.py +++ b/examples/run_swag.py @@ -331,7 +331,7 @@ def main(): raise ValueError("Invalid gradient_accumulation_steps parameter: {}, should be >= 1".format( args.gradient_accumulation_steps)) - args.train_batch_size = int(args.train_batch_size / args.gradient_accumulation_steps) + args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps random.seed(args.seed) np.random.seed(args.seed) @@ -352,8 +352,8 @@ def main(): num_train_steps = None if args.do_train: train_examples = read_swag_examples(os.path.join(args.data_dir, 'train.csv'), is_training = True) - num_train_steps = int( - len(train_examples) / args.train_batch_size * args.num_train_epochs) + num_train_steps = + len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs # Prepare model model = BertForMultipleChoice.from_pretrained(args.bert_model, From 1579c5363566a6d39fe901ddcc80a3581aad2461 Mon Sep 17 00:00:00 2001 From: thomwolf Date: Tue, 5 Feb 2019 15:36:33 +0100 Subject: [PATCH 4/4] more explicit notation: num_train_step => num_train_optimization_steps --- .gitignore | 5 ++++- examples/run_classifier.py | 17 ++++++++--------- examples/run_lm_finetuning.py | 17 ++++++++--------- examples/run_squad.py | 17 ++++++++--------- examples/run_squad2.py | 17 ++++++++--------- examples/run_swag.py | 17 ++++++++--------- 6 files changed, 44 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index 56a5f0d38a..aeff829aa0 100644 --- a/.gitignore +++ b/.gitignore @@ -119,4 +119,7 @@ dmypy.json .vscode # TF code -tensorflow_code \ No newline at end of file +tensorflow_code + +# Models +models \ No newline at end of file diff --git a/examples/run_classifier.py b/examples/run_classifier.py index 52205552ca..52550e85fa 100644 --- a/examples/run_classifier.py +++ b/examples/run_classifier.py @@ -438,11 +438,13 @@ def main(): tokenizer = BertTokenizer.from_pretrained(args.bert_model, do_lower_case=args.do_lower_case) train_examples = None - num_train_steps = None + num_train_optimization_steps = None if args.do_train: train_examples = processor.get_train_examples(args.data_dir) - num_train_steps = - len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs + num_train_optimization_steps = int( + len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps) * args.num_train_epochs + if args.local_rank != -1: + num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size() # Prepare model model = BertForSequenceClassification.from_pretrained(args.bert_model, @@ -468,9 +470,6 @@ def main(): {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01}, {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] - t_total = num_train_steps - if args.local_rank != -1: - t_total = t_total // torch.distributed.get_world_size() if args.fp16: try: from apex.optimizers import FP16_Optimizer @@ -491,7 +490,7 @@ def main(): optimizer = BertAdam(optimizer_grouped_parameters, lr=args.learning_rate, warmup=args.warmup_proportion, - t_total=t_total) + t_total=num_train_optimization_steps) global_step = 0 nb_tr_steps = 0 @@ -502,7 +501,7 @@ def main(): logger.info("***** Running training *****") logger.info(" Num examples = %d", len(train_examples)) logger.info(" Batch size = %d", args.train_batch_size) - logger.info(" Num steps = %d", num_train_steps) + logger.info(" Num steps = %d", num_train_optimization_steps) all_input_ids = torch.tensor([f.input_ids for f in train_features], dtype=torch.long) all_input_mask = torch.tensor([f.input_mask for f in train_features], dtype=torch.long) all_segment_ids = torch.tensor([f.segment_ids for f in train_features], dtype=torch.long) @@ -539,7 +538,7 @@ def main(): if args.fp16: # modify learning rate with special warm up BERT uses # if args.fp16 is False, BertAdam is used that handles this automatically - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_optimization_steps, args.warmup_proportion) for param_group in optimizer.param_groups: param_group['lr'] = lr_this_step optimizer.step() diff --git a/examples/run_lm_finetuning.py b/examples/run_lm_finetuning.py index c9c71ad5a1..0ae5bcbb56 100644 --- a/examples/run_lm_finetuning.py +++ b/examples/run_lm_finetuning.py @@ -515,13 +515,15 @@ def main(): tokenizer = BertTokenizer.from_pretrained(args.bert_model, do_lower_case=args.do_lower_case) #train_examples = None - num_train_steps = None + num_train_optimization_steps = None if args.do_train: print("Loading Train Dataset", args.train_file) train_dataset = BERTDataset(args.train_file, tokenizer, seq_len=args.max_seq_length, corpus_lines=None, on_memory=args.on_memory) - num_train_steps = - len(train_dataset) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs + num_train_optimization_steps = int( + len(train_dataset) / args.train_batch_size / args.gradient_accumulation_steps) * args.num_train_epochs + if args.local_rank != -1: + num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size() # Prepare model model = BertForPreTraining.from_pretrained(args.bert_model) @@ -545,9 +547,6 @@ def main(): {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] - t_total = num_train_steps - if args.local_rank != -1: - t_total = t_total // torch.distributed.get_world_size() if args.fp16: try: from apex.optimizers import FP16_Optimizer @@ -568,14 +567,14 @@ def main(): optimizer = BertAdam(optimizer_grouped_parameters, lr=args.learning_rate, warmup=args.warmup_proportion, - t_total=t_total) + t_total=num_train_optimization_steps) global_step = 0 if args.do_train: logger.info("***** Running training *****") logger.info(" Num examples = %d", len(train_dataset)) logger.info(" Batch size = %d", args.train_batch_size) - logger.info(" Num steps = %d", num_train_steps) + logger.info(" Num steps = %d", num_train_optimization_steps) if args.local_rank == -1: train_sampler = RandomSampler(train_dataset) @@ -608,7 +607,7 @@ def main(): if args.fp16: # modify learning rate with special warm up BERT uses # if args.fp16 is False, BertAdam is used that handles this automatically - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_optimization_steps, args.warmup_proportion) for param_group in optimizer.param_groups: param_group['lr'] = lr_this_step optimizer.step() diff --git a/examples/run_squad.py b/examples/run_squad.py index 421821006e..86f49df942 100644 --- a/examples/run_squad.py +++ b/examples/run_squad.py @@ -784,12 +784,14 @@ def main(): tokenizer = BertTokenizer.from_pretrained(args.bert_model, do_lower_case=args.do_lower_case) train_examples = None - num_train_steps = None + num_train_optimization_steps = None if args.do_train: train_examples = read_squad_examples( input_file=args.train_file, is_training=True) - num_train_steps = - len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs + num_train_optimization_steps = int( + len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps) * args.num_train_epochs + if args.local_rank != -1: + num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size() # Prepare model model = BertForQuestionAnswering.from_pretrained(args.bert_model, @@ -821,9 +823,6 @@ def main(): {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] - t_total = num_train_steps - if args.local_rank != -1: - t_total = t_total // torch.distributed.get_world_size() if args.fp16: try: from apex.optimizers import FP16_Optimizer @@ -843,7 +842,7 @@ def main(): optimizer = BertAdam(optimizer_grouped_parameters, lr=args.learning_rate, warmup=args.warmup_proportion, - t_total=t_total) + t_total=num_train_optimization_steps) global_step = 0 if args.do_train: @@ -869,7 +868,7 @@ def main(): logger.info(" Num orig examples = %d", len(train_examples)) logger.info(" Num split examples = %d", len(train_features)) logger.info(" Batch size = %d", args.train_batch_size) - logger.info(" Num steps = %d", num_train_steps) + logger.info(" Num steps = %d", num_train_optimization_steps) all_input_ids = torch.tensor([f.input_ids for f in train_features], dtype=torch.long) all_input_mask = torch.tensor([f.input_mask for f in train_features], dtype=torch.long) all_segment_ids = torch.tensor([f.segment_ids for f in train_features], dtype=torch.long) @@ -903,7 +902,7 @@ def main(): if args.fp16: # modify learning rate with special warm up BERT uses # if args.fp16 is False, BertAdam is used that handles this automatically - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_optimization_steps, args.warmup_proportion) for param_group in optimizer.param_groups: param_group['lr'] = lr_this_step optimizer.step() diff --git a/examples/run_squad2.py b/examples/run_squad2.py index 6adad7d8ea..ba96a81b98 100644 --- a/examples/run_squad2.py +++ b/examples/run_squad2.py @@ -877,12 +877,14 @@ def main(): tokenizer = BertTokenizer.from_pretrained(args.bert_model) train_examples = None - num_train_steps = None + num_train_optimization_steps = None if args.do_train: train_examples = read_squad_examples( input_file=args.train_file, is_training=True) - num_train_steps = - len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs + num_train_optimization_steps = int( + len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps) * args.num_train_epochs + if args.local_rank != -1: + num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size() # Prepare model model = BertForQuestionAnswering.from_pretrained(args.bert_model, @@ -914,9 +916,6 @@ def main(): {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] - t_total = num_train_steps - if args.local_rank != -1: - t_total = t_total // torch.distributed.get_world_size() if args.fp16: try: from apex.optimizers import FP16_Optimizer @@ -936,7 +935,7 @@ def main(): optimizer = BertAdam(optimizer_grouped_parameters, lr=args.learning_rate, warmup=args.warmup_proportion, - t_total=t_total) + t_total=num_train_optimization_steps) global_step = 0 if args.do_train: @@ -962,7 +961,7 @@ def main(): logger.info(" Num orig examples = %d", len(train_examples)) logger.info(" Num split examples = %d", len(train_features)) logger.info(" Batch size = %d", args.train_batch_size) - logger.info(" Num steps = %d", num_train_steps) + logger.info(" Num steps = %d", num_train_optimization_steps) all_input_ids = torch.tensor([f.input_ids for f in train_features], dtype=torch.long) all_input_mask = torch.tensor([f.input_mask for f in train_features], dtype=torch.long) all_segment_ids = torch.tensor([f.segment_ids for f in train_features], dtype=torch.long) @@ -997,7 +996,7 @@ def main(): if args.fp16: # modify learning rate with special warm up BERT uses # if args.fp16 is False, BertAdam is used that handles this automatically - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_optimization_steps, args.warmup_proportion) for param_group in optimizer.param_groups: param_group['lr'] = lr_this_step optimizer.step() diff --git a/examples/run_swag.py b/examples/run_swag.py index 1856118ac5..c3cc69ae6d 100644 --- a/examples/run_swag.py +++ b/examples/run_swag.py @@ -349,11 +349,13 @@ def main(): tokenizer = BertTokenizer.from_pretrained(args.bert_model, do_lower_case=args.do_lower_case) train_examples = None - num_train_steps = None + num_train_optimization_steps = None if args.do_train: train_examples = read_swag_examples(os.path.join(args.data_dir, 'train.csv'), is_training = True) - num_train_steps = - len(train_examples) // args.train_batch_size // args.gradient_accumulation_steps * args.num_train_epochs + num_train_optimization_steps = int( + len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps) * args.num_train_epochs + if args.local_rank != -1: + num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size() # Prepare model model = BertForMultipleChoice.from_pretrained(args.bert_model, @@ -384,9 +386,6 @@ def main(): {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01}, {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} ] - t_total = num_train_steps - if args.local_rank != -1: - t_total = t_total // torch.distributed.get_world_size() if args.fp16: try: from apex.optimizers import FP16_Optimizer @@ -406,7 +405,7 @@ def main(): optimizer = BertAdam(optimizer_grouped_parameters, lr=args.learning_rate, warmup=args.warmup_proportion, - t_total=t_total) + t_total=num_train_optimization_steps) global_step = 0 if args.do_train: @@ -415,7 +414,7 @@ def main(): logger.info("***** Running training *****") logger.info(" Num examples = %d", len(train_examples)) logger.info(" Batch size = %d", args.train_batch_size) - logger.info(" Num steps = %d", num_train_steps) + logger.info(" Num steps = %d", num_train_optimization_steps) all_input_ids = torch.tensor(select_field(train_features, 'input_ids'), dtype=torch.long) all_input_mask = torch.tensor(select_field(train_features, 'input_mask'), dtype=torch.long) all_segment_ids = torch.tensor(select_field(train_features, 'segment_ids'), dtype=torch.long) @@ -455,7 +454,7 @@ def main(): if args.fp16: # modify learning rate with special warm up BERT uses # if args.fp16 is False, BertAdam is used that handles this automatically - lr_this_step = args.learning_rate * warmup_linear(global_step/t_total, args.warmup_proportion) + lr_this_step = args.learning_rate * warmup_linear(global_step/num_train_optimization_steps, args.warmup_proportion) for param_group in optimizer.param_groups: param_group['lr'] = lr_this_step optimizer.step()