From 39f961abcd768fd61c483fea6d27c12cb256660f Mon Sep 17 00:00:00 2001 From: mrq Date: Thu, 18 Jul 2024 18:46:45 -0500 Subject: [PATCH] test trainer (vall_e.models.ar_nar) tests some SpeechX features --- data/config.yaml | 9 ++--- data/noise.dac | Bin 0 -> 30585 bytes data/noise.enc | Bin 0 -> 21653 bytes vall_e/data.py | 7 ++-- vall_e/models/ar_nar.py | 78 ++++++++++++++++++++++++++++++++-------- vall_e/models/base.py | 2 +- 6 files changed, 71 insertions(+), 25 deletions(-) create mode 100644 data/noise.dac create mode 100644 data/noise.enc diff --git a/data/config.yaml b/data/config.yaml index 0adaffa..d841c00 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -1,4 +1,4 @@ -sample_rate: 24_000 # 44_000 for dac +sample_rate: 24_000 # 44_000 / 44_100 for dac audio_backend: "vocos" # or dac # model definitions to train @@ -7,7 +7,7 @@ models: size: "full" # model dimensionality resp_levels: 8 # RVQ levels this model targets prom_levels: 8 # should always be the above - tasks: 8 # tasks this model can attend to, only tts is supported at the moment + tasks: 8 # tasks this model can attend to, only tts is guaranteed results at the moment langs: 2 # languages this model supports, semi-unused at the moment tones: 1 # tones this model supports, currently unused arch_type: llama # underlying LLM arch to use, currently focusing on llama @@ -19,7 +19,7 @@ models: # factors for split loss values, remove to have a unified loss calculation loss_factors: text: 0.1 # text phoneme portion of the sequence - prom: 0.0 # input prompt portion of the sequence + prom: 0.5 # input prompt portion of the sequence resp: 1.0 # output audio portin of the sequence # experimental settings @@ -28,7 +28,8 @@ models: interleave: False # interleaves RVQ levels, only works with above for now audio_embedding_mode: "" # "" | "inclusive" | "exclusive", whether to utilize the audio backend's embeddings with the input embeddings audio_embedding_sums: False # whether the input embeddings include all prior RVQ levels (sums) or only the current one, further experimentation is needed to see if this matters - p_rvq_levels: "equal" # "equal" | "auto", sets probabilities of which RVQ level to select during training, auto will have the next RVQ level half as likely as the previous one + p_rvq_levels: "auto" # "equal" | "auto", sets probabilities of which RVQ level to select during training, auto will have the next RVQ level half as likely as the previous one + unified_position_ids: False # specifies whether or not position IDs should be continuous across the whole sequence (if True, naive behavior), or restart them at the next segment of the sequence (if False) # hyperparameter settings (could be relegated to trainer settings) hyperparameters: diff --git a/data/noise.dac b/data/noise.dac new file mode 100644 index 0000000000000000000000000000000000000000..1a4d02ede4193072aa68388d301d3fadb6990995 GIT binary patch literal 30585 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 Zu}1ZrC_6SbE;h~@U0iJQTCv%&e*-pc{bc|E literal 0 HcmV?d00001 diff --git a/data/noise.enc b/data/noise.enc new file mode 100644 index 0000000000000000000000000000000000000000..40636d2b6b7911b5212b3691ef6c498b776e46f3 GIT binary patch literal 21653 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 DH``+l literal 0 HcmV?d00001 diff --git a/vall_e/data.py b/vall_e/data.py index d22a597..d9d5c2a 100755 --- a/vall_e/data.py +++ b/vall_e/data.py @@ -1063,11 +1063,8 @@ def create_datasets(): def create_train_val_dataloader(): train_dataset, val_dataset = create_datasets() - # it'll cry about trying to pickle a torch._C_generator or something - try: - subtrain_dataset = copy.deepcopy(train_dataset) - except Exception as e: - subtrain_dataset = Dataset( training=True ) + # deepcopy is slow + subtrain_dataset = Dataset( training=True ) if subtrain_dataset.sampler_type == "path": subtrain_dataset.head_(cfg.evaluation.size) diff --git a/vall_e/models/ar_nar.py b/vall_e/models/ar_nar.py index 2cdef3b..220e045 100644 --- a/vall_e/models/ar_nar.py +++ b/vall_e/models/ar_nar.py @@ -361,7 +361,7 @@ def example_usage(): from einops import repeat from tqdm import tqdm - from ..emb.qnt import decode_to_file, unload_model + from ..emb.qnt import decode_to_file, unload_model, trim_random, repeat_extend_audio, concat_audio, merge_audio from ..engines import Engine from ..utils import wrapper as ml @@ -385,7 +385,7 @@ def example_usage(): return torch.from_numpy(qnt["codes"].astype(np.int16))[0, :cfg.model.resp_levels, :].t().to(torch.int16) qnt = _load_quants(f"./data/qnt.{'dac' if cfg.audio_backend == 'dac' else 'enc'}") - + noise = _load_quants(f"./data/noise.{'dac' if cfg.audio_backend == 'dac' else 'enc'}") text_list = [ tokenize("ˈaɪ wɪl nˌɑːt ˈæsk ɐ sˈɛkənd tˈaɪm").to(device), @@ -404,6 +404,8 @@ def example_usage(): proms_list = proms_list[:1] resps_list = resps_list[:1] + batch_size = len(text_list) + # rentet-full is the only configuration with BitNet's BitLinear that converges despite the grad_norm saying otherwise kwargs = { 'n_text_tokens': 256, @@ -428,8 +430,11 @@ def example_usage(): pass """ + bos_id, space_id, eos_id = cfg.tokenizer.encode( " " ) + tasks = cfg.dataset.tasks_list + model = AR_NAR(**kwargs).to(device) - steps = 150 + steps = 150 * len(tasks) optimizer = cfg.hyperparameters.optimizer.lower() if cfg.yaml_path is not None else "prodigy" scheduler = cfg.hyperparameters.scheduler.lower() if cfg.yaml_path is not None else "" @@ -497,22 +502,61 @@ def example_usage(): print(f"AR+NAR ({cfg.model.arch_type}, {cfg.audio_backend}) parameter count: {sum(p.numel() for p in model.parameters() if p.requires_grad)}") - @torch.inference_mode() - def sample( name, steps=1000 ): - if cfg.audio_backend == "dac" and name == "init": - return + @torch.no_grad() + def sample_data(task=None): + texts = [] + proms = [] + resps = [] + for i in range(batch_size): + if task is None: + task = random.choice(tasks) + + text = text_list[i] + prom = proms_list[i] + resp = resps_list[i] + + # do nothing + if task == "tts": + ... + elif task == "tts-c": + trim_length = int(random.uniform(cfg.dataset.prompt_duration_range[0], cfg.dataset.prompt_duration_range[1]) * cfg.dataset.frames_per_second) + + prom = resp[:trim_length] + resp = resp[trim_length:] + elif task == "ns" or task == "sr": + # extend the noise to fill the target audio + noise_ext = repeat_extend_audio( noise, resp.shape[0] ) + # create the input prompt by merging the target audio with the noise + prom = merge_audio( resp.cpu(), noise_ext, scale=[1, cfg.dataset.noise_scale], device=cfg.dataset.reencode_device ) + # set the target to just be the noise if + if task == "sr": + resp = noise_ext + + # set the text prompt to empty to train without a guided text prompt + if random.random() < 0.5: + text = torch.tensor([bos_id, eos_id]).to(device=device, dtype=torch.uint8) + + texts.append( text.to(device) ) + proms.append( prom.to(device) ) + resps.append( resp.to(device) ) + + return texts, proms, resps + + @torch.inference_mode() + def sample( name, steps=1000, task=None ): engine.eval() + + texts, proms, resps = sample_data( task ) + if "ar" in cfg.model.capabilities: - resps_list = engine(text_list, proms_list, max_steps=steps, sampling_temperature=0.95 ) - else: - resps_list = [ qnt[:, 0].to( device ) ] + resps = engine( texts, proms, max_steps=steps, sampling_temperature=0.95 ) if "nar" in cfg.model.capabilities: - resps_list = engine( text_list, proms_list, resps_list=resps_list, sampling_temperature=0.2 ) + resps = engine( texts, proms, resps, sampling_temperature=0.2 ) - for i, o in enumerate(resps_list): - _ = decode_to_file(o.to(dtype=torch.int32), f"data/{cfg.model.arch_type}.{cfg.audio_backend}.{i}.{name}.wav", device=device) + for i, o in enumerate(resps): + _ = decode_to_file(o.to(dtype=torch.int32), f"data/{cfg.model.arch_type}.{cfg.audio_backend}.{i}.{task}.{name}.wav", device=device) unload_model() @@ -520,8 +564,10 @@ def example_usage(): engine.train() t = trange(steps) for i in t: + texts, proms, resps = sample_data() + stats = {"step": i} - stats |= engine.traverse(text_list=text_list, proms_list=proms_list, resps_list=resps_list) + stats |= engine.traverse(text_list=texts, proms_list=proms, resps_list=resps) stats |= {"grad_norm": engine.get_global_grad_norm()} tqdm.write(f"{stats}") @@ -534,7 +580,9 @@ def example_usage(): #sample("init", 5) train() - sample("final") + + for task in tasks: + sample("final", task=task) if __name__ == "__main__": example_usage() \ No newline at end of file diff --git a/vall_e/models/base.py b/vall_e/models/base.py index 97d27bb..8d0e3b0 100755 --- a/vall_e/models/base.py +++ b/vall_e/models/base.py @@ -880,6 +880,7 @@ class Base(nn.Module): # Base-line TTS task # Sequence: + # prom /may/ include tokens inside to help guide things, per SpeechX if f'<{task_type}>' in get_task_symmap(): # insert the text prompt if text_list is not None: @@ -933,7 +934,6 @@ class Base(nn.Module): # yes this could be encoded better inputs[i].append( ( "len", torch.Tensor([ 0 ] + [ int(i) for i in str( resps_list[i].shape[0]) ] + [ 10 ]).to(device=device, dtype=torch.int16) ) ) else: - raise Exception(f'Unrecognized task: {task_type}') return inputs