ScanDL2 / scandl_module /scripts /sp_train.py
Di0nigi's picture
First commit
95456ed verified
Raw
History Blame Contribute Delete
5.13 kB
"""
Train ScanDL 2.0 on all data of the current dataset.
"""
import argparse
import json
import os
import numpy as np
# import wandb
import torch
import torch.distributed as dist
from sklearn.model_selection import train_test_split
from transformers import set_seed, BertTokenizerFast
from datasets import load_from_disk, DatasetDict
from ScanDL2.scandl_module.original_scandl.utils import dist_util, logger
from ScanDL2.scandl_module.original_scandl.step_sample import create_named_schedule_sampler
from ScanDL2.scandl_module.scripts.sp_basic_utils import (
load_defaults_config,
create_model_and_diffusion,
args_to_dict,
add_dict_to_argparser,
)
from ScanDL2.scandl_module.scripts.sp_train_util import TrainLoop
from ScanDL2.scandl_module.scripts.sp_load_celer_zuco import (
load_celer,
load_celer_speakers,
process_celer,
celer_zuco_dataset_and_loader,
)
from ScanDL2.scandl_module.scripts.sp_load_celer_zuco import get_kfold, get_kfold_indices_combined
from ScanDL2.scandl_module.scripts.sp_load_celer_zuco import flatten_data, unflatten_data
def create_argparser():
"""Loads the config from the file scandl/config.json and adds all keys and values in the config dict
to the argument parser where config values are the argparse arguments' default values."""
defaults = dict(
checkpoint_path="",
vocab="bert",
use_plm_init="no",
lr=1e-4,
batch_size=64,
microbatch=64,
diffusion_steps=2000,
noise_schedule="sqrt",
schedule_sampler="lossaware",
seq_len=128,
resume_checkpoint="none",
hidden_t_dim=128,
seed=101,
hidden_dim=256,
learning_steps=80000,
save_interval=5000,
# config_name='bert-base-cased',
notes="-",
data_split_criterion="",
num_transformer_layers=12,
num_transformer_heads=8,
corpus="",
inference="",
load_train_data="-",
)
defaults.update(load_defaults_config())
parser = argparse.ArgumentParser()
add_dict_to_argparser(parser, defaults) # update latest args according to argparse
return parser
def main():
args = create_argparser().parse_args()
set_seed(args.seed)
assert args.seq_len == args.hidden_t_dim
# set up distributed processing group
dist_util.setup_dist()
logger.configure()
logger.log("### Creating data loader...")
rank = dist.get_rank() or 0
tokenizer = BertTokenizerFast.from_pretrained(args.config_name)
args.vocab_size = tokenizer.vocab_size
if rank == 0:
if not os.path.exists(args.checkpoint_path):
os.makedirs(args.checkpoint_path)
# load train data
train = load_from_disk(os.path.join("..", args.load_train_data, "train"))
train_data = DatasetDict()
train_data["train"] = train
print("\t\t--- loaded train data ---")
train_loader = celer_zuco_dataset_and_loader(
data=train_data,
data_args=args,
split="train",
)
logger.log("### Creating model and diffusion...")
if torch.cuda.is_available():
print("#" * 30, "CUDA_VISIBLE_DEVICES", os.environ["CUDA_VISIBLE_DEVICES"])
model, diffusion = create_model_and_diffusion(
**args_to_dict(args, load_defaults_config().keys())
)
model.to(dist_util.dev())
pytorch_total_params = sum(p.numel() for p in model.parameters())
logger.log(f"### The parameter count is {pytorch_total_params}")
# args.schedule_sampler = lossaware
schedule_sampler = create_named_schedule_sampler(args.schedule_sampler, diffusion)
logger.log(f"### Saving the hyperparameters to {args.checkpoint_path}/training_args.json")
with open(f"{args.checkpoint_path}/training_args.json", "w") as f:
json.dump(args.__dict__, f, indent=2)
# if ('LOCAL_RANK' not in os.environ) or (int(os.environ['LOCAL_RANK']) == 0):
# wandb.init(
# project=os.getenv("WANDB_PROJECT", "ScanDL"),
# name=args.checkpoint_path,
# )
# wandb.config.update(args.__dict__, allow_val_change=True)
logger.log("### Training...")
TrainLoop(
model=model,
diffusion=diffusion,
data=train_loader,
batch_size=args.batch_size,
microbatch=args.microbatch,
lr=args.lr,
ema_rate=args.ema_rate,
log_interval=args.log_interval,
save_interval=args.save_interval,
resume_checkpoint=args.resume_checkpoint,
use_fp16=args.use_fp16,
fp16_scale_growth=args.fp16_scale_growth,
schedule_sampler=schedule_sampler,
weight_decay=args.weight_decay,
learning_steps=args.learning_steps,
checkpoint_path=args.checkpoint_path,
gradient_clipping=args.gradient_clipping,
# eval_data=val_loader,
eval_interval=args.eval_interval,
).run_loop()
if __name__ == "__main__":
raise SystemExit(main())