Respair commited on
Commit
86fa47e
·
verified ·
1 Parent(s): 0b9dafe

Update train.py

Browse files
Files changed (1) hide show
  1. train.py +25 -32
train.py CHANGED
@@ -1,5 +1,4 @@
1
  import argparse
2
- import json
3
  import logging
4
  import math
5
  import os
@@ -17,7 +16,11 @@ from accelerate.utils import set_seed
17
  from transformers import get_cosine_schedule_with_warmup
18
  from torchao.float8 import Float8LinearConfig, convert_to_float8_training
19
 
20
- from dataset import build_multi_tts_dataloader, build_tts_dataloader, extract_speaker_embs_from_batch, load_titanet
 
 
 
 
21
  from discriminator import ConformerDiscirminator
22
  from model_transformer import load_config, model_from_config
23
 
@@ -54,6 +57,8 @@ def module_filter_fn(mod, fqn):
54
  return False
55
  if fqn in FP8_SKIP_EXACT or fqn.startswith(FP8_SKIP_PREFIXES):
56
  return False
 
 
57
  return True
58
 
59
 
@@ -137,7 +142,12 @@ def extract_disc_features(
137
  disc_t=None,
138
  disc_noise=None,
139
  ):
 
140
 
 
 
 
 
141
  max_len = int(latent_lengths.max().item())
142
  latents = latents[:, :max_len, :]
143
  valid_mask = torch.arange(max_len, device=latents.device)[None, :] < latent_lengths[:, None]
@@ -243,10 +253,12 @@ def compute_loss(
243
  cond = cond * valid_audio_mask.unsqueeze(-1).to(cond.dtype)
244
  model_input = x_t * valid_audio_mask.unsqueeze(-1).to(x_t.dtype)
245
 
246
-
 
 
247
  p_drop_both = 0.1
248
  p_drop_text = 0.1
249
- p_drop_speaker = 0.0 # legacy, don't mind it
250
 
251
  r = torch.rand(B, device=device)
252
  b0 = p_drop_both
@@ -296,7 +308,7 @@ def compute_loss(
296
  stats = {"fm_loss": fm_loss.detach(), "gen_adv_loss": zero, "speaker_aux_loss": zero}
297
  return fm_loss, stats, None
298
 
299
-
300
  raw = unwrap_model(model)
301
  speaker_aux_loss = zero
302
  if need_hidden and hasattr(raw, "predict_speaker"):
@@ -441,9 +453,7 @@ def cleanup_checkpoints(exp_dir, keep_last_k):
441
  def parse_args():
442
  parser = argparse.ArgumentParser()
443
  parser.add_argument("--config", type=str, required=True)
444
- dataset_group = parser.add_mutually_exclusive_group(required=True)
445
- dataset_group.add_argument("--dataset", type=str)
446
- dataset_group.add_argument("--datasets", type=str)
447
  parser.add_argument("--streaming", action="store_true")
448
  parser.add_argument("--dataset_split", type=str, default="train")
449
  parser.add_argument("--tokenizer", type=str, default=None)
@@ -511,44 +521,27 @@ def build_optimizer(args, model, train_cfg):
511
 
512
  def build_data(args, cfg, need_audio):
513
  data_cfg = cfg["data"]
514
- train_cfg = cfg["training"]
515
-
516
  raw_max = data_cfg["max_audio_seconds"] * data_cfg["codec_rate_hz"]
517
- common = dict(
 
 
 
518
  latent_dim=data_cfg["latent_dim"],
519
  need_audio=need_audio,
520
  max_text_len=data_cfg["max_text_length"],
521
  max_latent_len=int(data_cfg.get("max_latent_length", int(raw_max))),
522
  text_pad_id=data_cfg["text_pad_id"],
523
- train_cfg=train_cfg,
524
  tokenizer=(
525
  args.tokenizer
526
  or data_cfg.get("tokenizer")
527
  or data_cfg.get("tokenizer_name")
528
  or data_cfg.get("text_tokenizer")
529
  ),
 
 
530
  )
531
 
532
- if args.datasets is None:
533
- logger.info(f"Loading dataset from {args.dataset}")
534
- return build_tts_dataloader(
535
- dataset_path=args.dataset,
536
- streaming=args.streaming,
537
- dataset_split=args.dataset_split,
538
- **common,
539
- )
540
-
541
- if args.streaming:
542
- raise ValueError("--streaming is not supported with --datasets")
543
-
544
- with open(args.datasets, "r", encoding="utf-8") as f:
545
- dataset_configs = json.load(f).get("datasets")
546
- if not isinstance(dataset_configs, list) or not dataset_configs:
547
- raise ValueError("--datasets JSON must contain a non-empty top-level 'datasets' list")
548
-
549
- logger.info(f"Loading {len(dataset_configs)} configured datasets from {args.datasets}")
550
- return build_multi_tts_dataloader(dataset_configs=dataset_configs, **common)
551
-
552
 
553
  def main():
554
  args = parse_args()
 
1
  import argparse
 
2
  import logging
3
  import math
4
  import os
 
16
  from transformers import get_cosine_schedule_with_warmup
17
  from torchao.float8 import Float8LinearConfig, convert_to_float8_training
18
 
19
+ from dataset import (
20
+ build_tts_dataloader,
21
+ extract_speaker_embs_from_batch,
22
+ load_titanet,
23
+ )
24
  from discriminator import ConformerDiscirminator
25
  from model_transformer import load_config, model_from_config
26
 
 
57
  return False
58
  if fqn in FP8_SKIP_EXACT or fqn.startswith(FP8_SKIP_PREFIXES):
59
  return False
60
+ if ".mamba." in fqn:
61
+ return False
62
  return True
63
 
64
 
 
142
  disc_t=None,
143
  disc_noise=None,
144
  ):
145
+ """Stack hidden states from the score net as discriminator input.
146
 
147
+ When disc_t/disc_noise are given the latents are noised to that level
148
+ first, so the discriminator sees noisy representations instead of
149
+ requiring ODE-sampled sequences.
150
+ """
151
  max_len = int(latent_lengths.max().item())
152
  latents = latents[:, :max_len, :]
153
  valid_mask = torch.arange(max_len, device=latents.device)[None, :] < latent_lengths[:, None]
 
253
  cond = cond * valid_audio_mask.unsqueeze(-1).to(cond.dtype)
254
  model_input = x_t * valid_audio_mask.unsqueeze(-1).to(x_t.dtype)
255
 
256
+ # Mutually exclusive CFG drop buckets. Marginals:
257
+ # P(text dropped) = p_drop_both + p_drop_text
258
+ # P(speaker dropped) = p_drop_both + p_drop_speaker
259
  p_drop_both = 0.1
260
  p_drop_text = 0.1
261
+ p_drop_speaker = 0.0 # raise in stage 2
262
 
263
  r = torch.rand(B, device=device)
264
  b0 = p_drop_both
 
308
  stats = {"fm_loss": fm_loss.detach(), "gen_adv_loss": zero, "speaker_aux_loss": zero}
309
  return fm_loss, stats, None
310
 
311
+ # --- speaker auxiliary prediction ---
312
  raw = unwrap_model(model)
313
  speaker_aux_loss = zero
314
  if need_hidden and hasattr(raw, "predict_speaker"):
 
453
  def parse_args():
454
  parser = argparse.ArgumentParser()
455
  parser.add_argument("--config", type=str, required=True)
456
+ parser.add_argument("--dataset", type=str, required=True)
 
 
457
  parser.add_argument("--streaming", action="store_true")
458
  parser.add_argument("--dataset_split", type=str, default="train")
459
  parser.add_argument("--tokenizer", type=str, default=None)
 
521
 
522
  def build_data(args, cfg, need_audio):
523
  data_cfg = cfg["data"]
 
 
524
  raw_max = data_cfg["max_audio_seconds"] * data_cfg["codec_rate_hz"]
525
+
526
+ logger.info(f"Loading dataset from {args.dataset}")
527
+ return build_tts_dataloader(
528
+ dataset_path=args.dataset,
529
  latent_dim=data_cfg["latent_dim"],
530
  need_audio=need_audio,
531
  max_text_len=data_cfg["max_text_length"],
532
  max_latent_len=int(data_cfg.get("max_latent_length", int(raw_max))),
533
  text_pad_id=data_cfg["text_pad_id"],
534
+ train_cfg=cfg["training"],
535
  tokenizer=(
536
  args.tokenizer
537
  or data_cfg.get("tokenizer")
538
  or data_cfg.get("tokenizer_name")
539
  or data_cfg.get("text_tokenizer")
540
  ),
541
+ streaming=args.streaming,
542
+ dataset_split=args.dataset_split,
543
  )
544
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
545
 
546
  def main():
547
  args = parse_args()