Spaces:
Runtime error
Runtime error
""" | |
This script provides an example to wrap TencentPretrain for classification with grid search. | |
""" | |
import sys | |
import os | |
import torch | |
import random | |
import argparse | |
from itertools import product | |
tencentpretrain_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) | |
sys.path.append(tencentpretrain_dir) | |
from tencentpretrain.opts import * | |
from finetune.run_classifier import * | |
def main(): | |
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) | |
finetune_opts(parser) | |
tokenizer_opts(parser) | |
parser.add_argument("--soft_targets", action='store_true', | |
help="Train model with logits.") | |
parser.add_argument("--soft_alpha", type=float, default=0.5, | |
help="Weight of the soft targets loss.") | |
parser.add_argument("--batch_size_list", default=[32, 64], nargs='+', type=int, | |
help="A list of batch sizes for grid search.") | |
parser.add_argument("--learning_rate_list", type=float, default=[3e-5, 1e-4, 3e-4], nargs='+', | |
help="A list of learning rate for grid search.") | |
parser.add_argument("--epochs_num_list", type=int, default=[3, 5, 8], nargs='+', | |
help="A list of number of epochs for grid search.") | |
adv_opts(parser) | |
args = parser.parse_args() | |
# Load the hyperparameters from the config file. | |
args = load_hyperparam(args) | |
set_seed(args.seed) | |
# Count the number of labels. | |
args.labels_num = count_labels_num(args.train_path) | |
# Build tokenizer. | |
args.tokenizer = str2tokenizer[args.tokenizer](args) | |
# Get logger. | |
args.logger = init_logger(args) | |
best_acc = 0 | |
config = {} | |
# Build dataset | |
trainset = read_dataset(args, args.train_path) | |
instances_num = len(trainset) | |
for batch_size, learning_rate, epochs_num in product(args.batch_size_list, args.learning_rate_list, args.epochs_num_list): | |
args.learning_rate = learning_rate | |
args.batch_size = batch_size | |
args.epochs_num = epochs_num | |
args.train_steps = int(instances_num * args.epochs_num / batch_size) + 1 | |
# Build classification model. | |
model = Classifier(args) | |
args.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
model = model.to(args.device) | |
load_or_initialize_parameters(args, model) | |
optimizer, scheduler = build_optimizer(args, model) | |
if args.fp16: | |
try: | |
from apex import amp | |
except ImportError: | |
raise ImportError("Please install apex from https://www.github.com/nvidia/apex to use fp16 training.") | |
model, optimizer = amp.initialize(model, optimizer, opt_level=args.fp16_opt_level) | |
args.amp = amp | |
if torch.cuda.device_count() > 1: | |
model = torch.nn.DataParallel(model) | |
args.model = model | |
if args.use_adv: | |
args.adv_method = str2adv[args.adv_type](model) | |
# Training phase. | |
total_loss, _, _ = 0., 0., 0. | |
for _ in range(1, args.epochs_num + 1): | |
random.shuffle(trainset) | |
src = torch.LongTensor([example[0] for example in trainset]) | |
tgt = torch.LongTensor([example[1] for example in trainset]) | |
seg = torch.LongTensor([example[2] for example in trainset]) | |
if args.soft_targets: | |
soft_tgt = torch.FloatTensor([example[3] for example in trainset]) | |
else: | |
soft_tgt = None | |
model.train() | |
for i, (src_batch, tgt_batch, seg_batch, soft_tgt_batch) in enumerate(batch_loader(batch_size, src, tgt, seg, soft_tgt)): | |
_ = train_model(args, model, optimizer, scheduler, src_batch, tgt_batch, seg_batch, soft_tgt_batch) | |
acc, _ = evaluate(args, read_dataset(args, args.dev_path)) | |
if acc > best_acc: | |
best_acc = acc | |
config = {"learning_rate": learning_rate, "batch_size": batch_size, "epochs_num": epochs_num} | |
args.logger.info("On configuration: {}.\n".format(config)) | |
args.logger.info("Best Acc. is: {:.4f}, on configuration {}.".format(best_acc, config)) | |
if __name__ == "__main__": | |
main() | |