coqui-ai / TTS

🐸💬 - a deep learning toolkit for Text-to-Speech, battle-tested in research and production
http://coqui.ai
Mozilla Public License 2.0
35.33k stars 4.31k forks source link

RuntimeError: The expanded size of the tensor (64) must match the existing size (112) at non-singleton dimension 2. Target sizes: [64, 80, 64]. Tensor sizes: [64, 1, 112] #370

Closed a-froghyar closed 3 years ago

a-froghyar commented 3 years ago

Hey,

I'm trying to run a training with Tacotron 1 using GST. I get the error on the first batch already.

Pytorch version: 1.8 and 1.7.1 (both yielded the same error) Python version: 3.8.0

Traceback (most recent call last): File "TTS/bin/train_tacotron.py", line 721, in <module> main(args) File "TTS/bin/train_tacotron.py", line 619, in main train_avg_loss_dict, global_step = train(train_loader, model, File "TTS/bin/train_tacotron.py", line 168, in train decoder_output, postnet_output, alignments, stop_tokens = model( File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/modules/module.py", line 889, in _call_impl result = self.forward(*input, **kwargs) File "/home/big-boy/projects/TTS/TTS/tts/models/tacotron.py", line 173, in forward decoder_outputs = decoder_outputs * output_mask.unsqueeze(1).expand_as(decoder_outputs) RuntimeError: The expanded size of the tensor (64) must match the existing size (112) at non-singleton dimension 2. Target sizes: [64, 80, 64]. Tensor sizes: [64, 1, 112]

My hyperparams: // TRAINING "batch_size": 64, "eval_batch_size": 16, "r": 4, "gradual_training": [ [0, 7, 64], [1, 5, 64], [50000, 3, 32], [130000, 2, 32], [290000, 1, 32] ], "mixed_precision": true,

// MULTI-SPEAKER and GST "use_speaker_embedding": false, // use speaker embedding to enable multi-speaker learning. "use_gst": true, "use_external_speaker_embedding_file": false, "external_speaker_embedding_file": "../../speakers-vctk-en.json", "gst": { // gst parameter if gst is enabled "gst_style_input": null, // Condition the style input either on a // -> wave file [path to wave] or // -> dictionary using the style tokens {'token1': 'value', 'token2': 'value'} example {"0": 0.15, "1": 0.15, "5": -0.15} // with the dictionary being len(dict) <= len(gst_style_tokens). "gst_embedding_dim": 512, "gst_num_heads": 4, "gst_style_tokens": 10, "gst_use_speaker_embedding": false },

erogol commented 3 years ago

@WeberJulian has an idea as he is also using GST

lexkoro commented 3 years ago

"r": 4,

set this to "r": 7

I think since you are using gradual training it loads the first batch of data with r=4 but tries to train with r=7


Edit: Just checked and got the same error

Traceback (most recent call last):
  File "TTS/bin/train_tacotron.py", line 721, in <module>
    main(args)
  File "TTS/bin/train_tacotron.py", line 623, in main
    scaler_st)
  File "TTS/bin/train_tacotron.py", line 166, in train
    text_input, text_lengths, mel_input, mel_lengths, speaker_ids=speaker_ids, speaker_embeddings=speaker_embeddings)
  File "/media/alexander/LinuxFS/Projects/TTS-dev/.venv/lib/python3.6/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/media/alexander/LinuxFS/Projects/TTS-dev/TTS/tts/models/tacotron.py", line 173, in forward
    decoder_outputs = decoder_outputs * output_mask.unsqueeze(1).expand_as(decoder_outputs)
RuntimeError: The expanded size of the tensor (216) must match the existing size (378) at non-singleton dimension 2.  Target sizes: [64, 80, 216].  Tensor sizes: [64, 1, 378]

The error is not related to GST. Just set r=7 in your config and it should work.

WeberJulian commented 3 years ago

Hum the error I had was with speaker_id initialisation in eval, but here it's concerning gst and it's during training. Here my best advice would be to compare tacotron and tacotron 2 in the debugger.

a-froghyar commented 3 years ago

Hey @WeberJulian thanks for your answer. What should I be looking for when I compare the two?

WeberJulian commented 3 years ago

@a-froghyar I would look for differences in shapes of the different tensors (like encoder_outputs before and after compute_gst)

WeberJulian commented 3 years ago

Have you checked yet if the same config in tacotron 2 works for you ?

a-froghyar commented 3 years ago

@WeberJulian not yet, I'll be on it later today and I'll report back, thanks again!

a-froghyar commented 3 years ago

@WeberJulian @erogol I'm trying to set up my debuging config, could you shed some light on debugging best practices please? :)

erogol commented 3 years ago

@a-froghyar have you checked @SanjaESC answer?

a-froghyar commented 3 years ago

@erogol yes I did, same error with T1, T2 threw a librosa error, my Dataset seems to be stereo apparently, will check back. librosa.util.exceptions.ParameterError: Invalid shape for monophonic audio: ndim=2, shape=(19680, 2) - I've checked and weirdly SOME of the wav files in my corpus are stereo, going to convert to mono now and try again.

erogol commented 3 years ago

for debugging you can use the small dataset set under tests folder. There are also some sample configs for model testing that you can copy and paste for debugging.

a-froghyar commented 3 years ago

Thanks, what I meant was actually how to launch the debugger in the IDE using a specific config.json for the training run? If I launch the debugger on train_tacotron.py, how do I feed it the config that I'm using?

a-froghyar commented 3 years ago

Solved my problem, sorry for the noob question, just needed to add the argument into my launch.json file like so: "args": ["--config_path", "TTS/tts/configs/gst_blizzard.json"],

where gst_blizzard.json is my custom config file

a-froghyar commented 3 years ago

@WeberJulian I've realised that I had a higher numpy version before, I downgraded to the one in the requirements and T2 is running, T1 now throws this error: loss = functional.l1_loss(x * mask, target * mask, reduction='sum') RuntimeError: The size of tensor a (80) must match the size of tensor b (513) at non-singleton dimension 2

After a few iterations, target - [64,111,80] actually has a different size to mask - [64,111,513]

erogol commented 3 years ago

t1 needs linear spectrograms. I guess you set the dataloader to return melspectrograms or there is something wrong in your settings. Pls pot tyour config here. @a-froghyar

erogol commented 3 years ago

For debugging I don't use the IDE. I just use breakpoint() or import pdb; pdb.set_trace() depending on th pythonversion and co through the code on termina l

a-froghyar commented 3 years ago

Thanks, doesn't t1 need Mel and Linear? Here's my config:

{ "model": "Tacotron", "run_name": "blizzard-gts", "run_description": "tacotron with DDC and differential spectral loss.",

// AUDIO PARAMETERS
"audio": {
    // stft parameters
    "fft_size": 1024, // number of stft frequency levels. Size of the linear spectogram frame.
    "win_length": 1024, // stft window length in ms.
    "hop_length": 256, // stft window hop-lengh in ms.
    "frame_length_ms": null, // stft window length in ms.If null, 'win_length' is used.
    "frame_shift_ms": null, // stft window hop-lengh in ms. If null, 'hop_length' is used.

    // Audio processing parameters
    "sample_rate": 24000, // DATASET-RELATED: wav sample-rate.
    "preemphasis": 0.0, // pre-emphasis to reduce spec noise and make it more structured. If 0.0, no -pre-emphasis.
    "ref_level_db": 20, // reference level db, theoretically 20db is the sound of air.

    // Silence trimming
    "do_trim_silence": true, // enable trimming of slience of audio as you load it. LJspeech (true), TWEB (false), Nancy (true)
    "trim_db": 60, // threshold for timming silence. Set this according to your dataset.

    // Griffin-Lim
    "power": 1.5, // value to sharpen wav signals after GL algorithm.
    "griffin_lim_iters": 60, // #griffin-lim iterations. 30-60 is a good range. Larger the value, slower the generation.

    // MelSpectrogram parameters
    "num_mels": 80, // size of the mel spec frame.
    "mel_fmin": 95.0, // minimum freq level for mel-spec. ~50 for male and ~95 for female voices. Tune for dataset!!
    "mel_fmax": 12000.0, // maximum freq level for mel-spec. Tune for dataset!!
    "spec_gain": 1,

    // Normalization parameters
    "signal_norm": true, // normalize spec values. Mean-Var normalization if 'stats_path' is defined otherwise range normalization defined by the other params.
    "min_level_db": -100, // lower bound for normalization
    "symmetric_norm": true, // move normalization to range [-1, 1]
    "max_norm": 4.0, // scale normalization to range [-max_norm, max_norm] or [0, max_norm]
    "clip_norm": true, // clip normalized values into the range.
    "stats_path": null // DO NOT USE WITH MULTI_SPEAKER MODEL. scaler stats file computed by 'compute_statistics.py'. If it is defined, mean-std based notmalization is used and other normalization params are ignored
},

// VOCABULARY PARAMETERS
// if custom character set is not defined,
// default set in symbols.py is used
// "characters":{
//     "pad": "_",
//     "eos": "~",
//     "bos": "^",
//     "characters": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!'(),-.:;? ",
//     "punctuations":"!'(),-.:;? ",
//     "phonemes":"iyɨʉɯuɪʏʊeøɘəɵɤoɛœɜɞʌɔæɐaɶɑɒᵻʘɓǀɗǃʄǂɠǁʛpbtdʈɖcɟkɡqɢʔɴŋɲɳnɱmʙrʀⱱɾɽɸβfvθðszʃʒʂʐçʝxɣχʁħʕhɦɬɮʋɹɻjɰlɭʎʟˈˌːˑʍwɥʜʢʡɕʑɺɧɚ˞ɫ"
// },

// DISTRIBUTED TRAINING
"distributed": {
    "backend": "nccl",
    "url": "tcp:\/\/localhost:54321"
},

"reinit_layers": [], // give a list of layer names to restore from the given checkpoint. If not defined, it reloads all heuristically matching layers.

// TRAINING
"batch_size": 64, // Batch size for training. Lower values than 32 might cause hard to learn attention. It is overwritten by 'gradual_training'.
"eval_batch_size": 16,
"r": 7, // Number of decoder frames to predict per iteration. Set the initial values if gradual training is enabled.
"gradual_training": [
    [0, 7, 64],
    [1, 5, 64],
    [50000, 3, 32],
    [130000, 2, 32],
    [290000, 1, 32]
], //set gradual training steps [first_step, r, batch_size]. If it is null, gradual training is disabled. For Tacotron, you might need to reduce the 'batch_size' as you proceeed.
"mixed_precision": true, // level of optimization with NVIDIA's apex feature for automatic mixed FP16/FP32 precision (AMP), NOTE: currently only O1 is supported, and use "O1" to activate.

// LOSS SETTINGS
"loss_masking": false, // enable / disable loss masking against the sequence padding.
"decoder_loss_alpha": 0.5, // original decoder loss weight. If > 0, it is enabled
"postnet_loss_alpha": 0.25, // original postnet loss weight. If > 0, it is enabled
"postnet_diff_spec_alpha": 0.25, // differential spectral loss weight. If > 0, it is enabled
"decoder_diff_spec_alpha": 0.25, // differential spectral loss weight. If > 0, it is enabled
"decoder_ssim_alpha": 0.5, // decoder ssim loss weight. If > 0, it is enabled
"postnet_ssim_alpha": 0.25, // postnet ssim loss weight. If > 0, it is enabled
"ga_alpha": 5.0, // weight for guided attention loss. If > 0, guided attention is enabled.
"stopnet_pos_weight": 15.0, // pos class weight for stopnet loss since there are way more negative samples than positive samples.

// VALIDATION
"run_eval": true,
"test_delay_epochs": 10, //Until attention is aligned, testing only wastes computation time.
"test_sentences_file": null, // set a file to load sentences to be used for testing. If it is null then we use default english sentences.

// OPTIMIZER
"noam_schedule": false, // use noam warmup and lr schedule.
"grad_clip": 1.0, // upper limit for gradients for clipping.
"epochs": 300000, // total number of epochs to train.
"lr": 0.0001, // Initial learning rate. If Noam decay is active, maximum learning rate.
"wd": 0.000001, // Weight decay weight.
"warmup_steps": 4000, // Noam decay steps to increase the learning rate from 0 to "lr"
"seq_len_norm": false, // Normalize eash sample loss with its length to alleviate imbalanced datasets. Use it if your dataset is small or has skewed distribution of sequence lengths.

// TACOTRON PRENET
"memory_size": -1, // ONLY TACOTRON - size of the memory queue used fro storing last decoder predictions for auto-regression. If < 0, memory queue is disabled and decoder only uses the last prediction frame.
"prenet_type": "original", // "original" or "bn".
"prenet_dropout": true, // enable/disable dropout at prenet.

// TACOTRON ATTENTION
"attention_type": "graves", // 'original' , 'graves', 'dynamic_convolution'
"attention_heads": 4, // number of attention heads (only for 'graves')
"attention_norm": "sigmoid", // softmax or sigmoid.
"windowing": false, // Enables attention windowing. Used only in eval mode.
"use_forward_attn": false, // if it uses forward attention. In general, it aligns faster.
"forward_attn_mask": false, // Additional masking forcing monotonicity only in eval mode.
"transition_agent": false, // enable/disable transition agent of forward attention.
"location_attn": true, // enable_disable location sensitive attention. It is enabled for TACOTRON by default.
"bidirectional_decoder": false, // use https://arxiv.org/abs/1907.09006. Use it, if attention does not work well with your dataset.
"double_decoder_consistency": false, // use DDC explained here https://erogol.com/solving-attention-problems-of-tts-models-with-double-decoder-consistency-draft/
"ddc_r": 7, // reduction rate for coarse decoder.

// STOPNET
"stopnet": true, // Train stopnet predicting the end of synthesis.
"separate_stopnet": true, // Train stopnet seperately if 'stopnet==true'. It prevents stopnet loss to influence the rest of the model. It causes a better model, but it trains SLOWER.

// TENSORBOARD and LOGGING
"print_step": 25, // Number of steps to log training on console.
"tb_plot_step": 100, // Number of steps to plot TB training figures.
"print_eval": false, // If True, it prints intermediate loss values in evalulation.
"save_step": 5000, // Number of training steps expected to save traninpg stats and checkpoints.
"checkpoint": true, // If true, it saves checkpoints per "save_step"
"tb_model_param_stats": false, // true, plots param stats per layer on tensorboard. Might be memory consuming, but good for debugging.

// DATA LOADING
"text_cleaner": "phoneme_cleaners",
"enable_eos_bos_chars": false, // enable/disable beginning of sentence and end of sentence chars.
"num_loader_workers": 8, // number of training data loader processes. Don't set it too big. 4-8 are good values.
"num_val_loader_workers": 8, // number of evaluation data loader processes.
"batch_group_size": 4, //Number of batches to shuffle after bucketing.
"min_seq_len": 6, // DATASET-RELATED: minimum text length to use in training
"max_seq_len": 153, // DATASET-RELATED: maximum text length
"compute_input_seq_cache": false, // if true, text sequences are computed before starting training. If phonemes are enabled, they are also computed at this stage.
"use_noise_augment": true,

// PATHS
"output_path": "/home/big-boy/Models/Blizzard/",

// PHONEMES
"phoneme_cache_path": "/home/big-boy/Models/phoneme_cache/", // phoneme computation is slow, therefore, it caches results in the given folder.
"use_phonemes": true, // use phonemes instead of raw characters. It is suggested for better pronounciation.
"phoneme_language": "en-us", // depending on your target language, pick one from  https://github.com/bootphon/phonemizer#languages

// MULTI-SPEAKER and GST
"use_speaker_embedding": false, // use speaker embedding to enable multi-speaker learning.
"use_gst": true, // use global style tokens
"use_external_speaker_embedding_file": false, // if true, forces the model to use external embedding per sample instead of nn.embeddings, that is, it supports external embeddings such as those used at: https://arxiv.org/abs /1806.04558
"external_speaker_embedding_file": "../../speakers-vctk-en.json", // if not null and use_external_speaker_embedding_file is true, it is used to load a specific embedding file and thus uses these embeddings instead of nn.embeddings, that is, it supports external embeddings such as those used at: https://arxiv.org/abs /1806.04558
"gst": { // gst parameter if gst is enabled
    "gst_style_input": null, // Condition the style input either on a
    // -> wave file [path to wave] or
    // -> dictionary using the style tokens {'token1': 'value', 'token2': 'value'} example {"0": 0.15, "1": 0.15, "5": -0.15}
    // with the dictionary being len(dict) <= len(gst_style_tokens).
    "gst_embedding_dim": 512,
    "gst_num_heads": 4,
    "gst_style_tokens": 10,
    "gst_use_speaker_embedding": false
},

// DATASETS
"datasets": // List of datasets. They all merged and they get different speaker_ids.
    [{
        "name": "ljspeech",
        "path": "/home/big-boy/Data/blizzard2013/segmented/",
        "meta_file_train": "metadata.csv", // for vtck if list, ignore speakers id in list for train, its useful for test cloning with new speakers
        "meta_file_val": null
    }]

}

erogol commented 3 years ago

can you post the full error here? I need the line number/

a-froghyar commented 3 years ago

/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/modules/loss.py:94: UserWarning: Using a target size (torch.Size([64, 90, 80])) that is different to the input size (torch.Size([64, 90, 513])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size. return F.l1_loss(input, target, reduction=self.reduction) ! Run is removed from /home/big-boy/Models/Blizzard/blizzard-gts-March-11-2021_05+38PM-45068a9 Traceback (most recent call last): File "/home/big-boy/projects/TTS/TTS/bin/train_tacotron.py", line 721, in main(args) File "/home/big-boy/projects/TTS/TTS/bin/train_tacotron.py", line 619, in main train_avg_loss_dict, global_step = train(train_loader, model, File "/home/big-boy/projects/TTS/TTS/bin/train_tacotron.py", line 180, in train loss_dict = criterion(postnet_output, decoder_output, mel_input, File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl result = self.forward(*input, kwargs) File "/home/big-boy/projects/TTS/TTS/tts/layers/losses.py", line 377, in forward postnet_diff_spec_loss = self.criterion_diff_spec(postnet_output, mel_input, output_lens) File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl result = self.forward(*input, *kwargs) File "/home/big-boy/projects/TTS/TTS/tts/layers/losses.py", line 203, in forward return self.loss_func(x_diff, target_diff) File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl result = self.forward(input, kwargs) File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/modules/loss.py", line 94, in forward return F.l1_loss(input, target, reduction=self.reduction) File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/nn/functional.py", line 2633, in l1_loss expanded_input, expanded_target = torch.broadcast_tensors(input, target) File "/home/big-boy/anaconda3/envs/PyCapacitron/lib/python3.8/site-packages/torch/functional.py", line 71, in broadcast_tensors return _VF.broadcast_tensors(tensors) # type: ignore RuntimeError: The size of tensor a (513) must match the size of tensor b (80) at non-singleton dimension 2

erogol commented 3 years ago

Ok I figured. It's a :bug: :)

a-froghyar commented 3 years ago

If I understand correctly it's the linear spectrogram that gets passed down instead of the mel? The linear is only needed for the Griffin Lin conversion, right?

erogol commented 3 years ago

There is no "need" but it just works better with GL.

erogol commented 3 years ago

@a-froghyar dev branch should work now

a-froghyar commented 3 years ago

Thanks so much!

a-froghyar commented 3 years ago

@erogol I was actually working in the main branch, I got the following error in the dev branch, not sure how it got to try to phonemize chinese:

Traceback (most recent call last): File "TTS/bin/train_tacotron.py", line 13, in from TTS.utils.arguments import parse_arguments, process_args File "/home/big-boy/projects/TTS/TTS/utils/arguments.py", line 11, in from TTS.tts.utils.text.symbols import parse_symbols File "/home/big-boy/projects/TTS/TTS/tts/utils/text/init.py", line 11, in from TTS.tts.utils.chinese_mandarin.phonemizer import chinese_text_to_phonemes File "/home/big-boy/projects/TTS/TTS/tts/utils/chinese_mandarin/phonemizer.py", line 3, in import pypinyin ModuleNotFoundError: No module named 'pypinyin'

WeberJulian commented 3 years ago

did you pip install -e . again after the checkout ?

a-froghyar commented 3 years ago

Training is running, thank you guys so much!

I had to downgrade to librosa==0.6.3, though because of this:

librosa.util.exceptions.ParameterError: Audio buffer is not Fortran-contiguous. Use numpy.asfortranarray to ensure Fortran contiguity.

lpierron commented 3 years ago

I have the same problem with v0.0.12:

 CUDA_VISIBLE_DEVICES="0" python ../../TTS/bin/train_tacotron.py --config_path model_config.json
 > Using CUDA:  True
 > Number of GPUs:  1
 > Git Hash: 59ab268
 > Experiment folder: /home/lpierron/Mozilla_TTS/CORPUS_LP/Models/maiLabs-fr-dca/mailabs-fr-ddc-April-23-2021_03+38PM-59ab268
 > Setting up Audio Processor...
 | > sample_rate:22050
 | > resample:False
 | > num_mels:80
 | > min_level_db:-100
 | > frame_shift_ms:None
 | > frame_length_ms:None
 | > ref_level_db:20
 | > fft_size:1024
 | > power:1.5
 | > preemphasis:0.0
 | > griffin_lim_iters:60
 | > signal_norm:True
 | > symmetric_norm:True
 | > mel_fmin:0
 | > mel_fmax:8000.0
 | > spec_gain:1.0
 | > stft_pad_mode:reflect
 | > max_norm:4.0
 | > clip_norm:True
 | > do_trim_silence:True
 | > trim_db:60
 | > do_sound_norm:False
 | > stats_path:./scale_stats.npy
 | > log_func:<ufunc 'log10'>
 | > exp_func:<function AudioProcessor.__init__.<locals>.<lambda> at 0x7f1ef7ac6c10>
 | > hop_length:256
 | > win_length:1024
 | > /tmp/tts/by_book/female/ezwa/monsieur_lecoq/metadata.csv
 | > Found 14211 files in /tmp/tts
 > Using model: Tacotron2

 > Model has 28183506 parameters
 > Starting with inf best loss.

 > DataLoader initialization
 | > Use phonemes: True
   | > phoneme language: fr-fr
 | > Number of instances : 14069
 | > Max length sequence: 281
 | > Min length sequence: 3
 | > Avg length sequence: 105.0826640130784
 | > Num. instances discarded by max-min (max=153, min=6) seq limits: 2420
 | > Batch group size: 128.

 > EPOCH: 0/1000

 > Number of output frames: 7

 > TRAINING (2021-04-23 15:38:18)
 ! Run is removed from /home/lpierron/Mozilla_TTS/CORPUS_LP/Models/maiLabs-fr-dca/mailabs-fr-ddc-April-23-2021_03+38PM-59ab268
Traceback (most recent call last):
  File "../../TTS/bin/train_tacotron.py", line 744, in <module>
    main(args)
  File "../../TTS/bin/train_tacotron.py", line 704, in main
    train_avg_loss_dict, global_step = train(
  File "../../TTS/bin/train_tacotron.py", line 198, in train
    decoder_output, postnet_output, alignments, stop_tokens = model(
  File "/home/lpierron/miniconda3/envs/tts/lib/python3.8/site-packages/torch/nn/modules/module.py", line 889, in _call_impl
    result = self.forward(*input, **kwargs)
  File "/home/lpierron/Mozilla_TTS/COQUI-TTS/TTS/TTS/tts/models/tacotron2.py", line 226, in forward
    decoder_outputs = decoder_outputs * output_mask.unsqueeze(1).expand_as(decoder_outputs)
RuntimeError: The expanded size of the tensor (12) must match the existing size (84) at non-singleton dimension 2.  Target sizes: [64, 80, 12].  Tensor sizes: [64, 1, 84]

I have downgraded librosa==0.6.3 but it doesn't work.

See my configuration next:

model_config.json.txt