diff --git a/Jenkinsfile b/Jenkinsfile index 178d2a2b2144..6ba65f340eab 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -137,18 +137,18 @@ pipeline { parallel { stage('En TN grammars') { steps { - sh 'CUDA_VISIBLE_DEVICES="" python nemo_text_processing/text_normalization/normalize.py --text="1" --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22' + sh 'CUDA_VISIBLE_DEVICES="" python nemo_text_processing/text_normalization/normalize.py --text="1" --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22' } } stage('En ITN grammars') { steps { - sh 'CUDA_VISIBLE_DEVICES="" python nemo_text_processing/inverse_text_normalization/inverse_normalize.py --language en --text="twenty" --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22' + sh 'CUDA_VISIBLE_DEVICES="" python nemo_text_processing/inverse_text_normalization/inverse_normalize.py --language en --text="twenty" --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22' } } stage('Test En non-deterministic TN & Run all En TN/ITN tests (restore grammars from cache)') { steps { - sh 'CUDA_VISIBLE_DEVICES="" python nemo_text_processing/text_normalization/normalize_with_audio.py --text "\$.01" --n_tagged 2 --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22' - sh 'CUDA_VISIBLE_DEVICES="" pytest tests/nemo_text_processing/en/ -m "not pleasefixme" --cpu --tn_cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22' + sh 'CUDA_VISIBLE_DEVICES="" python nemo_text_processing/text_normalization/normalize_with_audio.py --text "\$.01" --n_tagged 2 --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22' + sh 'CUDA_VISIBLE_DEVICES="" pytest tests/nemo_text_processing/en/ -m "not pleasefixme" --cpu --tn_cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22' } } } @@ -165,7 +165,7 @@ pipeline { parallel { stage('L2: Eng TN') { steps { - sh 'cd tools/text_processing_deployment && python pynini_export.py --output=/home/TestData/nlp/text_norm/output/ --grammars=tn_grammars --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22 --language=en && ls -R /home/TestData/nlp/text_norm/output/ && echo ".far files created "|| exit 1' + sh 'cd tools/text_processing_deployment && python pynini_export.py --output=/home/TestData/nlp/text_norm/output/ --grammars=tn_grammars --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22 --language=en && ls -R /home/TestData/nlp/text_norm/output/ && echo ".far files created "|| exit 1' sh 'cd nemo_text_processing/text_normalization/ && python normalize.py --input_file=/home/TestData/nlp/text_norm/ci/test.txt --input_case="lower_cased" --language=en --output_file=/home/TestData/nlp/text_norm/output/test.pynini.txt --verbose' sh 'cat /home/TestData/nlp/text_norm/output/test.pynini.txt' sh 'cmp --silent /home/TestData/nlp/text_norm/output/test.pynini.txt /home/TestData/nlp/text_norm/ci/test_goal_py_05-25.txt || exit 1' @@ -175,7 +175,7 @@ pipeline { stage('L2: Eng ITN export') { steps { - sh 'cd tools/text_processing_deployment && python pynini_export.py --output=/home/TestData/nlp/text_denorm/output/ --grammars=itn_grammars --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22 --language=en && ls -R /home/TestData/nlp/text_denorm/output/ && echo ".far files created "|| exit 1' + sh 'cd tools/text_processing_deployment && python pynini_export.py --output=/home/TestData/nlp/text_denorm/output/ --grammars=itn_grammars --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22 --language=en && ls -R /home/TestData/nlp/text_denorm/output/ && echo ".far files created "|| exit 1' sh 'cd nemo_text_processing/inverse_text_normalization/ && python inverse_normalize.py --input_file=/home/TestData/nlp/text_denorm/ci/test.txt --language=en --output_file=/home/TestData/nlp/text_denorm/output/test.pynini.txt --verbose' sh 'cmp --silent /home/TestData/nlp/text_denorm/output/test.pynini.txt /home/TestData/nlp/text_denorm/ci/test_goal_py.txt || exit 1' sh 'rm -rf /home/TestData/nlp/text_denorm/output/*' @@ -184,7 +184,7 @@ pipeline { stage('L2: TN with Audio (audio and raw text)') { steps { sh 'cd nemo_text_processing/text_normalization && \ - python normalize_with_audio.py --language=en --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22 --text "The total amounts to \\$4.76." \ + python normalize_with_audio.py --language=en --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22 --text "The total amounts to \\$4.76." \ --audio_data /home/TestData/nlp/text_norm/audio_based/audio.wav | tail -n2 | head -n1 > /tmp/out_raw.txt 2>&1 && \ cmp --silent /tmp/out_raw.txt /home/TestData/nlp/text_norm/audio_based/result.txt || exit 1' } @@ -192,7 +192,7 @@ pipeline { stage('L2: TN with Audio (audio and text file)') { steps { sh 'cd nemo_text_processing/text_normalization && \ - python normalize_with_audio.py --language=en --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22 --text /home/TestData/nlp/text_norm/audio_based/text.txt \ + python normalize_with_audio.py --language=en --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22 --text /home/TestData/nlp/text_norm/audio_based/text.txt \ --audio_data /home/TestData/nlp/text_norm/audio_based/audio.wav | tail -n2 | head -n1 > /tmp/out_file.txt 2>&1 && \ cmp --silent /tmp/out_file.txt /home/TestData/nlp/text_norm/audio_based/result.txt || exit 1' } @@ -200,7 +200,7 @@ pipeline { stage('L2: TN with Audio (manifest)') { steps { sh 'cd nemo_text_processing/text_normalization && \ - python normalize_with_audio.py --language=en --audio_data /home/TestData/nlp/text_norm/audio_based/manifest.json --n_tagged=120 --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-14-22' + python normalize_with_audio.py --language=en --audio_data /home/TestData/nlp/text_norm/audio_based/manifest.json --n_tagged=120 --cache_dir /home/TestData/nlp/text_norm/ci/grammars/6-28-22' } } } @@ -2129,7 +2129,7 @@ pipeline { model.num_attention_heads=8 \ model.activation='swiglu' \ model.masked_softmax_fusion=False \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.micro_batch_size=2 \ @@ -2161,7 +2161,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='swiglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.masked_softmax_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ @@ -2893,7 +2893,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='swiglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.transformer_block_type='pre_ln' \ @@ -2918,7 +2918,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='swiglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.transformer_block_type='pre_ln' \ @@ -3015,7 +3015,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='swiglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.transformer_block_type='normformer' \ @@ -3040,7 +3040,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='swiglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.transformer_block_type='normformer' \ @@ -3094,7 +3094,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='reglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.data.data_prefix=[.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document,.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document]" @@ -3116,7 +3116,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='reglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.data.data_prefix=[.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document,.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document]" @@ -3150,7 +3150,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='geglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.data.data_prefix=[.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document,.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document]" @@ -3173,7 +3173,7 @@ pipeline { model.hidden_size=64 \ model.num_attention_heads=8 \ model.activation='geglu' \ - model.bias_gelu_fusion=False \ + model.bias_activation_fusion=False \ model.activations_checkpoint_method='block' \ model.activations_checkpoint_num_layers=1 \ model.data.data_prefix=[.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document,.5,/home/TestData/nlp/megatron_t5/data/pile_val_small_bert_tokenizer_text_document]" diff --git a/docs/source/_static/css/custom.css b/docs/source/_static/css/custom.css index a071bc424c60..16fc8d3b469f 100644 --- a/docs/source/_static/css/custom.css +++ b/docs/source/_static/css/custom.css @@ -2,55 +2,53 @@ @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400&display=swap'); body { - font-size: 100%; - font-family: 'Roboto', sans-serif; + font-size: 100%; + font-family: 'Roboto', sans-serif; } /* Width of template */ .wy-nav-content { - max-width: 1200px !important; + max-width: 1200px !important; } /* Standard Text Formatting */ -h1 -{ +h1 { color: #76b900; - text-align: center; + text-align: center; background-color: #ffffff; } -h2 -{ +h2 { color: #ffffff; - background-color: #ffffff; /* #76b900 */ - Padding: 5px; + background-color: #ffffff; + /* #76b900 */ + Padding: 5px; } -h3 -{ +h3 { padding-top: 0px; - border-top: solid 3px #000000; /* #76b900 */ - border-bottom: solid 3px #000000; /* #76b900 */ + border-top: solid 3px #000000; + /* #76b900 */ + border-bottom: solid 3px #000000; + /* #76b900 */ } -p -{ +p { margin-bottom: 24px; } + /* Link Colors */ -a -{ - color: #76b900; +a { + color: #76b900; } -a:visited -{ - color: #218219; +a:visited { + color: #218219; } .container-xl { @@ -73,56 +71,52 @@ table { } /* Table head Color */ -thead td -{ +thead td { background-color: #333333 !important; } -.row-odd p -{ +.row-odd p { /*padding-bottom: 0px;*/ /*margin-bottom: 0px;*/ } + /* even rows*/ -.row-even tr -{ - background-color: #e5f1e6 !important; +.row-even tr { + background-color: #e5f1e6 !important; } /* odd rows*/ .wy-table-responsive table tr { - background-color: #ffffff !important; + background-color: #ffffff !important; } .wy-table-responsive table td { - white-space: normal; + white-space: normal; } /* Removes bottom margin in tables*/ .rst-content .line-block { - margin-bottom: 0px; + margin-bottom: 0px; } .wy-table-responsive { - overflow: visible !important; + overflow: visible !important; } /* reduces the size of text in multiline table columns. */ -.rst-content table.docutils td -{ - font-size: 80%; +.rst-content table.docutils td { + font-size: 80%; } -.rst-content dl:not(.docutils) dt -{ +.rst-content dl:not(.docutils) dt { background-color: inherit; color: #000000; @@ -131,100 +125,130 @@ thead td } .rst-content dl:not(.docutils) dt:before { - color: #333333; + color: #333333; } .rst-content .line-block { - margin-bottom: 0px; + margin-bottom: 0px; } -.wy-side-nav-search, .wy-nav-top - { - background-color: #000000; - padding: 0; - } +.wy-side-nav-search, +.wy-nav-top { + background-color: #000000; + padding: 0; +} -.wy-side-nav-search img - { - padding: 0px; - padding: 0px 0px; - margin-bottom: 0; - } +.wy-side-nav-search img { + padding: 0px; + padding: 0px 0px; + margin-bottom: 0; +} -.wy-side-nav-search input[type=text] - { - border-radius: 0px; - } +.wy-side-nav-search input[type=text] { + border-radius: 0px; +} -.wy-menu-vertical p.caption - { +.wy-menu-vertical p.caption { color: #76b900; - } +} -.wy-side-nav-search>a img.logo, .wy-side-nav-search .wy-dropdown>a img.logo - { +.wy-side-nav-search>a img.logo, +.wy-side-nav-search .wy-dropdown>a img.logo { margin: 0px 0px 0px 0px; - } +} -.wy-nav-content - { - margin: 0; - min-height: 100%; - height: 100%; - background: #ffffff; - } +.wy-nav-content { + margin: 0; + min-height: 100%; + height: 100%; + background: #ffffff; +} - /* List (numbered, bulleted) padding Fix */ +/* List (numbered, bulleted) padding Fix */ -.wy-plain-list-decimal li -{ - margin-top: -6px; - margin-bottom: -6px; +.wy-plain-list-decimal li { + margin-top: -6px; + margin-bottom: -6px; } -.rst-content .section ol.loweralpha -{ - margin-top: -6px; - margin-bottom: 12px; +.rst-content .section ol.loweralpha { + margin-top: -6px; + margin-bottom: 12px; } -.wy-plain-list-disc, .rst-content .toctree-wrapper ul, article ul -{ - margin-top: 0px !important; - margin-bottom: 12px; +.wy-plain-list-disc, +.rst-content .toctree-wrapper ul, +article ul { + margin-top: 0px !important; + margin-bottom: 12px; } - /* Alert Boxes */ - /* Background color of Alert Box Title */ +/* Alert Boxes */ +/* Background color of Alert Box Title */ -.rst-content .section ul -{ - margin-top: -12px; - margin-bottom: 16px; +.rst-content .section ul { + margin-top: -12px; + margin-bottom: 16px; } -.wy-alert.wy-alert-info .wy-alert-title, .rst-content .note .wy-alert-title, .rst-content .wy-alert-info.attention .wy-alert-title, .rst-content .wy-alert-info.caution .wy-alert-title, .rst-content .wy-alert-info.danger .wy-alert-title, .rst-content .wy-alert-info.error .wy-alert-title, .rst-content .wy-alert-info.hint .wy-alert-title, .rst-content .wy-alert-info.important .wy-alert-title, .rst-content .wy-alert-info.tip .wy-alert-title, .rst-content .wy-alert-info.warning .wy-alert-title, .rst-content .seealso .wy-alert-title, .rst-content .wy-alert-info.admonition-todo .wy-alert-title, .rst-content .wy-alert-info.admonition .wy-alert-title, .wy-alert.wy-alert-info .rst-content .admonition-title, .rst-content .wy-alert.wy-alert-info .admonition-title, .rst-content .note .admonition-title, .rst-content .wy-alert-info.attention .admonition-title, .rst-content .wy-alert-info.caution .admonition-title, .rst-content .wy-alert-info.danger .admonition-title, .rst-content .wy-alert-info.error .admonition-title, .rst-content .wy-alert-info.hint .admonition-title, .rst-content .wy-alert-info.important .admonition-title, .rst-content .wy-alert-info.tip .admonition-title, .rst-content .wy-alert-info.warning .admonition-title, .rst-content .seealso .admonition-title, .rst-content .wy-alert-info.admonition-todo .admonition-title, .rst-content .wy-alert-info.admonition .admonition-title - { +.wy-alert.wy-alert-info .wy-alert-title, +.rst-content .note .wy-alert-title, +.rst-content .wy-alert-info.attention .wy-alert-title, +.rst-content .wy-alert-info.caution .wy-alert-title, +.rst-content .wy-alert-info.danger .wy-alert-title, +.rst-content .wy-alert-info.error .wy-alert-title, +.rst-content .wy-alert-info.hint .wy-alert-title, +.rst-content .wy-alert-info.important .wy-alert-title, +.rst-content .wy-alert-info.tip .wy-alert-title, +.rst-content .wy-alert-info.warning .wy-alert-title, +.rst-content .seealso .wy-alert-title, +.rst-content .wy-alert-info.admonition-todo .wy-alert-title, +.rst-content .wy-alert-info.admonition .wy-alert-title, +.wy-alert.wy-alert-info .rst-content .admonition-title, +.rst-content .wy-alert.wy-alert-info .admonition-title, +.rst-content .note .admonition-title, +.rst-content .wy-alert-info.attention .admonition-title, +.rst-content .wy-alert-info.caution .admonition-title, +.rst-content .wy-alert-info.danger .admonition-title, +.rst-content .wy-alert-info.error .admonition-title, +.rst-content .wy-alert-info.hint .admonition-title, +.rst-content .wy-alert-info.important .admonition-title, +.rst-content .wy-alert-info.tip .admonition-title, +.rst-content .wy-alert-info.warning .admonition-title, +.rst-content .seealso .admonition-title, +.rst-content .wy-alert-info.admonition-todo .admonition-title, +.rst-content .wy-alert-info.admonition .admonition-title { background: #76b900; - } +} - /* Background and Font Color of Alert Box Main Body*/ -.wy-alert.wy-alert-info, .rst-content .note, .rst-content .wy-alert-info.attention, .rst-content .wy-alert-info.caution, .rst-content .wy-alert-info.danger, .rst-content .wy-alert-info.error, .rst-content .wy-alert-info.hint, .rst-content .wy-alert-info.important, .rst-content .wy-alert-info.tip, .rst-content .wy-alert-info.warning, .rst-content .seealso, .rst-content .wy-alert-info.admonition-todo, .rst-content .wy-alert-info.admonition { - background: #333333; - color: #999999; - } +/* Background and Font Color of Alert Box Main Body*/ +.wy-alert.wy-alert-info, +.rst-content .note, +.rst-content .wy-alert-info.attention, +.rst-content .wy-alert-info.caution, +.rst-content .wy-alert-info.danger, +.rst-content .wy-alert-info.error, +.rst-content .wy-alert-info.hint, +.rst-content .wy-alert-info.important, +.rst-content .wy-alert-info.tip, +.rst-content .wy-alert-info.warning, +.rst-content .seealso, +.rst-content .wy-alert-info.admonition-todo, +.rst-content .wy-alert-info.admonition { + background: #333333; + color: #999999; +} -.section -{ +.section { margin-top: 50px; } /* Logo */ .navbar-brand-box { - background-color: #ffffff; + background-color: #ffffff; } /* ---------------------------------------------- Media Queries --------------------------------------- */ @@ -238,7 +262,7 @@ thead td body { font-size: 18px; } - + #site-navigation nav ul.nav { font-size: 18px; } @@ -254,7 +278,7 @@ thead td .toc-h2 { font-size: 18px; } - + .toc-h3 { font-size: 1rem; } @@ -267,8 +291,8 @@ thead td font-size: 18px; } - #main-content > div { + #main-content>div { margin-left: 10%; margin-right: 10%; } -} +} \ No newline at end of file diff --git a/examples/nlp/language_modeling/conf/megatron_bart_config.yaml b/examples/nlp/language_modeling/conf/megatron_bart_config.yaml index fb8094842ca3..03bc6466f1e6 100644 --- a/examples/nlp/language_modeling/conf/megatron_bart_config.yaml +++ b/examples/nlp/language_modeling/conf/megatron_bart_config.yaml @@ -63,12 +63,15 @@ model: init_method_std: 0.02 # Standard deviation of the zero mean normal distribution used for weight initialization.') hidden_dropout: 0.1 # Dropout probability for hidden state transformer. attention_dropout: 0.1 # Dropout probability in the attention layer. + position_embedding_type: 'learned_absolute' # Position embedding type. Options ['learned_absolute', 'relative'] + relative_attention_num_buckets: 32 # Relative position number of buckets for computing the bias + relative_attention_max_distance: 128 # max_distance to keep relative distance in the attention_num_buckets. kv_channels: null # Projection weights dimension in multi-head attention. Set to hidden_size // num_attention_heads if null apply_query_key_layer_scaling: True # scale Q * K^T by 1 / layer-number. layernorm_epsilon: 1e-5 persist_layer_norm: True # Use of persistent fused layer norm kernel. gradient_as_bucket_view: True # Allocate gradients in a contiguous bucket to save memory (less fragmentation and buffer memory) - bias_gelu_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent gelu activation. + bias_activation_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent activation function. masked_softmax_fusion: True # Use a kernel that fuses the attention softmax with it's mask. bias_dropout_add_fusion: True # Use a kernel that fuses the bias addition, dropout and residual connection addition. bias: True # Whether to use bias terms in all weight matrices. diff --git a/examples/nlp/language_modeling/conf/megatron_retro_config.yaml b/examples/nlp/language_modeling/conf/megatron_retro_config.yaml index 3cb87bb19c52..3b99d2ad904d 100644 --- a/examples/nlp/language_modeling/conf/megatron_retro_config.yaml +++ b/examples/nlp/language_modeling/conf/megatron_retro_config.yaml @@ -59,7 +59,7 @@ model: layernorm_epsilon: 1e-5 gradient_as_bucket_view: True # Allocate gradients in a contiguous bucket to save memory (less fragmentation and buffer memory) persist_layer_norm: False - bias_gelu_fusion: True + bias_activation_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent activation function. bias_dropout_add_fusion: True masked_softmax_fusion: True activation: 'gelu' diff --git a/examples/nlp/language_modeling/conf/megatron_t5_config.yaml b/examples/nlp/language_modeling/conf/megatron_t5_config.yaml index d3f8f402bdb2..df8010fa6258 100644 --- a/examples/nlp/language_modeling/conf/megatron_t5_config.yaml +++ b/examples/nlp/language_modeling/conf/megatron_t5_config.yaml @@ -72,7 +72,6 @@ model: layernorm_epsilon: 1e-5 persist_layer_norm: True # Use of persistent fused layer norm kernel. gradient_as_bucket_view: True # Allocate gradients in a contiguous bucket to save memory (less fragmentation and buffer memory) - bias_gelu_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent gelu activation. bias_activation_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent activation function. grad_div_ar_fusion: True # Fuse grad division into torch.distributed.all_reduce masked_softmax_fusion: True # Use a kernel that fuses the attention softmax with it's mask. diff --git a/examples/nlp/language_modeling/conf/megatron_t5_lm_adaptation_finetune.yaml b/examples/nlp/language_modeling/conf/megatron_t5_lm_adaptation_finetune.yaml index c499e9d76bcf..d3860e9957c0 100644 --- a/examples/nlp/language_modeling/conf/megatron_t5_lm_adaptation_finetune.yaml +++ b/examples/nlp/language_modeling/conf/megatron_t5_lm_adaptation_finetune.yaml @@ -53,7 +53,7 @@ model: megatron_amp_O2: False # use AMP with O2 style mixed precision instead of native amp on-the-fly weight autocasting. # JIT fusion params. - bias_gelu_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent gelu activation. + bias_activation_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent activation function. masked_softmax_fusion: True # Use a kernel that fuses the attention softmax with it's mask. bias_dropout_add_fusion: True # Use a kernel that fuses the bias addition, dropout and residual connection addition. diff --git a/examples/nlp/language_modeling/conf/megatron_ul2_config.yaml b/examples/nlp/language_modeling/conf/megatron_ul2_config.yaml index 20cd172e460c..113f2a6961af 100644 --- a/examples/nlp/language_modeling/conf/megatron_ul2_config.yaml +++ b/examples/nlp/language_modeling/conf/megatron_ul2_config.yaml @@ -62,12 +62,15 @@ model: init_method_std: 0.02 # Standard deviation of the zero mean normal distribution used for weight initialization.') hidden_dropout: 0.1 # Dropout probability for hidden state transformer. attention_dropout: 0.1 # Dropout probability in the attention layer. + position_embedding_type: 'learned_absolute' # Position embedding type. Options ['learned_absolute', 'relative'] + relative_attention_num_buckets: 32 # Relative position number of buckets for computing the bias + relative_attention_max_distance: 128 # max_distance to keep relative distance in the attention_num_buckets. kv_channels: null # Projection weights dimension in multi-head attention. Set to hidden_size // num_attention_heads if null apply_query_key_layer_scaling: True # scale Q * K^T by 1 / layer-number. layernorm_epsilon: 1e-5 persist_layer_norm: True # Use of persistent fused layer norm kernel. gradient_as_bucket_view: True # Allocate gradients in a contiguous bucket to save memory (less fragmentation and buffer memory) - bias_gelu_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent gelu activation. + bias_activation_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent activation function. masked_softmax_fusion: True # Use a kernel that fuses the attention softmax with it's mask. bias_dropout_add_fusion: True # Use a kernel that fuses the bias addition, dropout and residual connection addition. bias: True # Whether to use bias terms in all weight matrices. diff --git a/examples/nlp/machine_translation/conf/aayn_base_megatron.yaml b/examples/nlp/machine_translation/conf/aayn_base_megatron.yaml index d85946287e2d..286bfaf6d8d7 100644 --- a/examples/nlp/machine_translation/conf/aayn_base_megatron.yaml +++ b/examples/nlp/machine_translation/conf/aayn_base_megatron.yaml @@ -73,12 +73,15 @@ model: init_method_std: 0.02 # Standard deviation of the zero mean normal distribution used for weight initialization.') hidden_dropout: 0.1 # Dropout probability for hidden state transformer. attention_dropout: 0.1 # Dropout probability in the attention layer. + position_embedding_type: 'learned_absolute' # Position embedding type. Options ['learned_absolute', 'relative'] + relative_attention_num_buckets: 32 # Relative position number of buckets for computing the bias + relative_attention_max_distance: 128 # max_distance to keep relative distance in the attention_num_buckets. kv_channels: null # Projection weights dimension in multi-head attention. Set to hidden_size // num_attention_heads if null apply_query_key_layer_scaling: True # scale Q * K^T by 1 / layer-number. layernorm_epsilon: 1e-5 persist_layer_norm: True # Use of persistent fused layer norm kernel. gradient_as_bucket_view: True # Allocate gradients in a contiguous bucket to save memory (less fragmentation and buffer memory) - bias_gelu_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent gelu activation. + bias_activation_fusion: True # Use a kernel that fuses the bias addition from weight matrices with the subsequent activation function. masked_softmax_fusion: True # Use a kernel that fuses the attention softmax with it's mask. bias_dropout_add_fusion: True # Use a kernel that fuses the bias addition, dropout and residual connection addition. bias: True # Whether to use bias terms in all weight matrices. diff --git a/examples/tts/conf/de/fastpitch_align_22050.yaml b/examples/tts/conf/de/fastpitch_align_22050.yaml index d12ca3d2478d..2ba41b6fef1e 100644 --- a/examples/tts/conf/de/fastpitch_align_22050.yaml +++ b/examples/tts/conf/de/fastpitch_align_22050.yaml @@ -202,7 +202,7 @@ model: optim: name: adamw - lr: 1e-1 + lr: 1e-3 # optimizer arguments betas: [0.9, 0.999] weight_decay: 1e-6 diff --git a/nemo/collections/common/metrics/classification_accuracy.py b/nemo/collections/common/metrics/classification_accuracy.py index db746b869001..eca7379a382e 100644 --- a/nemo/collections/common/metrics/classification_accuracy.py +++ b/nemo/collections/common/metrics/classification_accuracy.py @@ -154,7 +154,7 @@ def compute_topk_accuracy(correct_counts_k, total_counts_k): class ExactStringPerCategoryMatchMetric(Metric): - def __init__(self, categories=[], dist_sync_on_step=False): + def __init__(self, categories=[], dist_sync_on_step=False, **kwargs): super().__init__(dist_sync_on_step=dist_sync_on_step) self.categories = set(categories) @@ -190,7 +190,7 @@ def compute(self): class ExactStringMatchMetric(Metric): - def __init__(self, dist_sync_on_step=False): + def __init__(self, dist_sync_on_step=False, **kwargs): super().__init__(dist_sync_on_step=dist_sync_on_step) self.add_state("correct", default=torch.tensor(0), dist_reduce_fx="sum") diff --git a/nemo/collections/nlp/models/language_modeling/megatron_lm_encoder_decoder_model.py b/nemo/collections/nlp/models/language_modeling/megatron_lm_encoder_decoder_model.py index cad504e04a28..6fa4e9d0129e 100644 --- a/nemo/collections/nlp/models/language_modeling/megatron_lm_encoder_decoder_model.py +++ b/nemo/collections/nlp/models/language_modeling/megatron_lm_encoder_decoder_model.py @@ -69,6 +69,10 @@ class MegatronLMEncoderDecoderModel(MegatronBaseModel): def __init__(self, cfg: DictConfig, trainer: Trainer): super().__init__(cfg, trainer=trainer) + if cfg.get('pipeline_model_parallel_size', 1) > 2 and self.cfg.get('position_embedding_type') == 'relative': + raise ValueError( + "pipeline_model_parallel_size cannot be > 2 with position_embedding_type == relative at the moment." + ) if cfg.get('pipeline_model_parallel_size', 1) > 1: if cfg.get('pipeline_model_parallel_split_rank', 0) <= 0: raise ValueError( @@ -116,7 +120,11 @@ def setup_optimizer_param_groups(self): def model_provider_func(self, pre_process, post_process, add_encoder, add_decoder): # TODO: create get_encoder_decoder_model()here for different losses (e..g, nll, vae, mim) - + if hasattr(self.cfg, 'bias_gelu_fusion'): + logging.warning('bias_gelu_fusion is deprecated. Please use bias_activation_fusion instead.') + activation_fusion = self.cfg.bias_gelu_fusion + else: + activation_fusion = self.cfg.get('bias_activation_fusion', True) model = MegatronTokenLevelEncoderDecoderModule( encoder_arch=self.cfg.encoder_arch, decoder_arch=self.cfg.decoder_arch, @@ -146,10 +154,7 @@ def model_provider_func(self, pre_process, post_process, add_encoder, add_decode activations_checkpoint_num_layers=self.cfg.get('activations_checkpoint_num_layers', 1), layernorm_epsilon=self.cfg.get('layernorm_epsilon', 1e-5), persist_layer_norm=self.cfg.get('persist_layer_norm', False), - bias_activation_fusion=( - (self.cfg.get('bias_gelu_fusion', True) and self.cfg.get('activation', 'gelu') == 'gelu') - or (self.cfg.get('bias_activation_fusion', True) and self.cfg.get('activation', 'gelu') == 'geglu') - ), + bias_activation_fusion=activation_fusion, bias_dropout_add_fusion=self.cfg.get('bias_dropout_add_fusion', True), masked_softmax_fusion=self.cfg.get('masked_softmax_fusion', True), onnx_safe=self.cfg.get('onnx_safe', False), @@ -393,7 +398,7 @@ def allreduce_word_and_position_embeddings(self): and parallel_state.get_pipeline_model_parallel_world_size() > 1 and parallel_state.get_pipeline_model_parallel_split_rank() is not None ): - if self.enc_dec_model.position_embedding_type != 'relative': + if self.cfg.get('position_embedding_type') != 'relative': position_embeddings_weight = self.enc_dec_model.position_embeddings_weight() if self.megatron_amp_o2: grad = position_embeddings_weight.main_grad @@ -706,7 +711,7 @@ def setup(self, stage=None): # when using pipeline model parallel the final stage need to initialize word embeddings if parallel_state.get_pipeline_model_parallel_world_size() > 1: self.enc_dec_model.sync_initial_word_embeddings() - if self.enc_dec_model.position_embedding_type != 'relative': + if self.cfg.get('position_embedding_type') != 'relative': self.enc_dec_model.sync_initial_position_embeddings() def setup_training_data(self, cfg): @@ -837,12 +842,12 @@ def dummy(): torch.distributed.broadcast( predicted_tokens_dec, parallel_state.get_pipeline_model_parallel_last_rank(), - group=parallel_state.get_model_parallel_group(), + group=parallel_state.get_pipeline_model_parallel_group(), ) torch.distributed.broadcast( log_probs, parallel_state.get_pipeline_model_parallel_last_rank(), - group=parallel_state.get_model_parallel_group(), + group=parallel_state.get_pipeline_model_parallel_group(), ) # Reset microbatch calculator to what it was before decoding. diff --git a/nemo/collections/nlp/modules/common/megatron/transformer.py b/nemo/collections/nlp/modules/common/megatron/transformer.py index 6fc77f01c27a..d1cdf7eb2211 100644 --- a/nemo/collections/nlp/modules/common/megatron/transformer.py +++ b/nemo/collections/nlp/modules/common/megatron/transformer.py @@ -159,19 +159,20 @@ def __init__( bias=bias, ) - glu_activation_family = activation in ['reglu', 'swiglu'] + self.glu_activation_family = activation in ['geglu', 'reglu', 'swiglu'] + bias_activation_fusion_unavailable = activation in ['reglu', 'swiglu'] - if glu_activation_family and bias_activation_fusion: + if bias_activation_fusion_unavailable and bias_activation_fusion: raise ValueError( f"Cannot use bias_activation_fusion with {activation} activation. Please turn bias gelu fusion off." ) - if glu_activation_family and openai_gelu: + if self.glu_activation_family and openai_gelu: raise ValueError( f"Cannot use openai_gelu with specificed activation function : {activation} Please turn openai gelu off." ) - if glu_activation_family and onnx_safe: + if self.glu_activation_family and onnx_safe: raise ValueError( f"Cannot use onnx_safe with specificed activation function : {activation} Please turn onnx safe off." ) @@ -180,8 +181,6 @@ def __init__( raise ValueError( f"Cannot use bias_activation_fusion without bias terms. Please set bias=True or bias_activation_fusion=False." ) - else: - glu_activation_family = False self.bias_activation_fusion = bias_activation_fusion @@ -224,18 +223,18 @@ def forward(self, hidden_states): # [s, b, 4hp] intermediate_parallel, bias_parallel = self.dense_h_to_4h(hidden_states) - if self.activation in ['geglu', 'reglu', 'swiglu']: + if self.glu_activation_family: intermediate_parallel_2, bias_parallel_2 = self.dense_h_to_4h_2(hidden_states) if self.bias_activation_fusion: if self.activation == 'gelu': intermediate_parallel = fused_bias_gelu(intermediate_parallel, bias_parallel) - else: + elif self.activation == 'geglu': intermediate_parallel = fused_bias_geglu( intermediate_parallel, bias_parallel, intermediate_parallel_2, bias_parallel_2 ) - elif self.activation in ['geglu', 'reglu', 'swiglu']: + elif self.activation in ['reglu', 'swiglu']: if bias_parallel is not None: intermediate_parallel = self.activation_func(intermediate_parallel + bias_parallel) * ( intermediate_parallel_2 + bias_parallel_2 @@ -287,6 +286,7 @@ def __init__( megatron_legacy=False, bias=True, headscale=False, + has_relative_attention_bias=False, ): super(ParallelAttention, self).__init__() @@ -299,6 +299,7 @@ def __init__( self.attn_mask_type = attn_mask_type self.megatron_legacy = megatron_legacy self.headscale = headscale + self.has_relative_attention_bias = has_relative_attention_bias if kv_channels is None: assert ( @@ -382,7 +383,7 @@ def __init__( self.position_embedding_type = position_embedding_type self.relative_attention_num_buckets = relative_attention_num_buckets self.relative_attention_max_distance = relative_attention_max_distance - if self.position_embedding_type == 'relative': + if self.position_embedding_type == 'relative' and self.has_relative_attention_bias: self.relative_attention_bias = torch.nn.Embedding( relative_attention_num_buckets, self.num_attention_heads_per_partition ).to(torch.cuda.current_device()) @@ -498,7 +499,7 @@ def compute_bias(self, query_length, key_length): relative_position = memory_position - context_position # shape (query_length, key_length) relative_position_bucket = self._relative_position_bucket( relative_position, # shape (query_length, key_length) - bidirectional=(self.layer_type != LayerType.decoder), # (not self.is_decoder), + bidirectional=(self.attention_type != AttnMaskType.causal), # self.is_decoder and self_attention. num_buckets=self.relative_attention_num_buckets, max_distance=self.relative_attention_max_distance, ) @@ -683,9 +684,12 @@ def forward( if position_bias is None: if self.position_embedding_type == 'relative': - position_bias = self.compute_bias(real_seq_length, key_length) - else: - pass # HuggingFace implementation initialize position_bias to zero when not using + if self.has_relative_attention_bias: + position_bias = self.compute_bias(real_seq_length, key_length) + elif attention_mask is not None: + position_bias = torch.zeros_like(attention_mask).to(torch.cuda.current_device()) + else: + position_bias = torch.zeros(1, key_length, key_length).to(torch.cuda.current_device()) # if key and values are already calculated # we want only the last query position bias @@ -977,6 +981,7 @@ def __init__( normalization='layernorm', transformer_block_type='pre_ln', headscale=False, + has_relative_attention_bias=False, ): super(ParallelTransformerLayer_, self).__init__() @@ -1040,6 +1045,7 @@ def __init__( megatron_legacy=megatron_legacy, bias=bias, headscale=headscale, + has_relative_attention_bias=has_relative_attention_bias, ) # Normformer normalization if transformer_block_type == 'normformer': @@ -1092,6 +1098,7 @@ def __init__( megatron_legacy=megatron_legacy, bias=bias, headscale=headscale, + has_relative_attention_bias=False, ) # Normformer normalization if transformer_block_type == 'normformer': @@ -1221,14 +1228,6 @@ def forward( # Post-LN: x -> MHA -> Residual -> LN -> MLP -> Residual -> LN # Normformer: x -> LN -> MHA -> LN -> Residual -> MLP (w/LN) -> Residual - if type(hidden_states) is tuple: - if len(hidden_states) == 2: - hidden_states, position_bias = hidden_states - elif len(hidden_states) == 3: - hidden_states, position_bias, encoder_decoder_position_bias = hidden_states - else: - raise IndexError('Hidden_states needs to be tuple containing 2 or 3 elements.') - residual = hidden_states # Layer norm at the beginning of the transformer layer. if self.transformer_block_type in ['pre_ln', 'normformer']: @@ -1242,6 +1241,7 @@ def forward( set_inference_key_value_memory=set_inference_key_value_memory, inference_max_sequence_len=inference_max_sequence_len, rotary_pos_emb=self_attention_pos_emb, + position_bias=position_bias, ) if get_key_value: @@ -1491,7 +1491,7 @@ def __init__( self.num_layers = self.get_num_layers(num_layers) # Transformer layers. - def build_layer(layer_number): + def build_layer(layer_number, has_relative_attention_bias=False): if isinstance(layer_type, list): lt = layer_type[layer_number - 1] else: @@ -1529,6 +1529,7 @@ def build_layer(layer_number): normalization=normalization, transformer_block_type=transformer_block_type, headscale=headscale, + has_relative_attention_bias=has_relative_attention_bias, ) if parallel_state.get_virtual_pipeline_model_parallel_world_size() is not None: @@ -1565,7 +1566,14 @@ def build_layer(layer_number): else: offset = parallel_state.get_pipeline_model_parallel_rank() * self.num_layers - self.layers = torch.nn.ModuleList([build_layer(i + 1 + offset) for i in range(self.num_layers)]) + self.layers = torch.nn.ModuleList( + [ + build_layer( + i + 1 + offset, has_relative_attention_bias=(i == 0) and parallel_state.is_pipeline_first_stage() + ) + for i in range(self.num_layers) + ] + ) if self.post_process and self.transformer_block_type != 'post_ln': # Final layer norm before output. @@ -1631,9 +1639,16 @@ def custom_forward(*inputs): encoder_output, enc_dec_attn_mask, rotary_pos_emb, - position_bias, - encoder_decoder_position_bias, + position_bias=position_bias, + encoder_decoder_position_bias=encoder_decoder_position_bias, ) + if type(x_) is tuple: + if len(x_) == 2: + x_, position_bias = x_ + elif len(x_) == 3: + x_, position_bias, encoder_decoder_position_bias = x_ + else: + raise IndexError('Hidden_states (x_) needs to be tuple containing 2 or 3 elements.') return x_ return custom_forward @@ -1711,9 +1726,10 @@ def forward( inference_max_sequence_len=None, rotary_pos_emb=None, # list of positional embedding tensors, first one self attention, second one and third one are for cross attention (q, k) retrieved_emb=None, # tensor of retrieved embedding of shape [b, k, r, n, d] - position_bias=None, - encoder_decoder_position_bias=None, ): + position_bias = None + encoder_decoder_position_bias = None + # Checks. if inference_max_sequence_len: assert self.activations_checkpoint_method is None, 'inference does not work with activation checkpointing' diff --git a/nemo/collections/tts/torch/g2ps.py b/nemo/collections/tts/torch/g2ps.py index 694f8b25820a..a6286aa5710c 100644 --- a/nemo/collections/tts/torch/g2ps.py +++ b/nemo/collections/tts/torch/g2ps.py @@ -405,7 +405,7 @@ def parse_one_word(self, word: str): ): if word[-3] == 'T': # Case like "airport's" - return self.phoneme_dict[word[:-2]][0] + ["t", "s"], True + return self.phoneme_dict[word[:-2]][0] + ["s"], True elif word[-3] == 'S': # Case like "jones's" return self.phoneme_dict[word[:-2]][0] + ["ɪ", "z"], True @@ -420,14 +420,11 @@ def parse_one_word(self, word: str): and (word[:-1] in self.phoneme_dict) and (not self.ignore_ambiguous_words or self.is_unique_in_phoneme_dict(word[:-1])) ): - if word[-3] == 'T': - # Case like "airport's" - return self.phoneme_dict[word[:-2]][0] + ["t", "s"], True - elif word[-3] == 'S': - # Case like "jones's" - return self.phoneme_dict[word[:-2]][0] + ["ɪ", "z"], True + if word[-2] == 'T': + # Case like "airports" + return self.phoneme_dict[word[:-1]][0] + ["s"], True else: - return self.phoneme_dict[word[:-2]][0] + ["z"], True + return self.phoneme_dict[word[:-1]][0] + ["z"], True # Phoneme dict lookup for unique words (or default pron if ignore_ambiguous_words=False) if word in self.phoneme_dict and (not self.ignore_ambiguous_words or self.is_unique_in_phoneme_dict(word)): diff --git a/nemo_text_processing/text_normalization/en/data/measure/unit.tsv b/nemo_text_processing/text_normalization/en/data/measure/unit.tsv index c8893cbbdcd0..96afbb71d27f 100644 --- a/nemo_text_processing/text_normalization/en/data/measure/unit.tsv +++ b/nemo_text_processing/text_normalization/en/data/measure/unit.tsv @@ -1,8 +1,11 @@ amu atomic mass unit bar bar ° degree +º degree °c degree Celsius °C degree Celsius +ºc degree Celsius +ºC degree Celsius ℃ degree Celsius cm2 square centimeter cm² square centimeter diff --git a/nemo_text_processing/text_normalization/en/data/whitelist/symbol.tsv b/nemo_text_processing/text_normalization/en/data/whitelist/symbol.tsv index 63c035026564..6f2f8c69a8e6 100644 --- a/nemo_text_processing/text_normalization/en/data/whitelist/symbol.tsv +++ b/nemo_text_processing/text_normalization/en/data/whitelist/symbol.tsv @@ -19,3 +19,5 @@ $ dollar € euro ₩ won ¥ yen +° degree +º degree diff --git a/nemo_text_processing/text_normalization/en/taggers/word.py b/nemo_text_processing/text_normalization/en/taggers/word.py index 0b1ebc469384..fa6a965aab2e 100644 --- a/nemo_text_processing/text_normalization/en/taggers/word.py +++ b/nemo_text_processing/text_normalization/en/taggers/word.py @@ -14,6 +14,7 @@ import pynini from nemo_text_processing.text_normalization.en.graph_utils import ( + MIN_NEG_WEIGHT, NEMO_ALPHA, NEMO_DIGIT, NEMO_NOT_SPACE, @@ -22,6 +23,7 @@ convert_space, get_abs_path, ) +from nemo_text_processing.text_normalization.en.taggers.punctuation import PunctuationFst from pynini.examples import plurals from pynini.lib import pynutil @@ -40,8 +42,11 @@ class WordFst(GraphFst): def __init__(self, punctuation: GraphFst, deterministic: bool = True): super().__init__(name="word", kind="classify", deterministic=deterministic) + punct = PunctuationFst().graph + default_graph = pynini.closure(pynini.difference(NEMO_NOT_SPACE, punct.project("input")), 1) symbols_to_exclude = (pynini.union("$", "€", "₩", "£", "¥", "#", "%") | NEMO_DIGIT).optimize() graph = pynini.closure(pynini.difference(NEMO_NOT_SPACE, symbols_to_exclude), 1) + graph = pynutil.add_weight(graph, MIN_NEG_WEIGHT) | default_graph # leave phones of format [HH AH0 L OW1] untouched phoneme_unit = pynini.closure(NEMO_ALPHA, 1) + pynini.closure(NEMO_DIGIT) diff --git a/tests/nemo_text_processing/en/data_text_normalization/test_cases_measure.txt b/tests/nemo_text_processing/en/data_text_normalization/test_cases_measure.txt index 8d5e6dee094f..c26138f813ca 100644 --- a/tests/nemo_text_processing/en/data_text_normalization/test_cases_measure.txt +++ b/tests/nemo_text_processing/en/data_text_normalization/test_cases_measure.txt @@ -15,3 +15,4 @@ covid-19.5~covid- nineteen point five 2°C~two degrees Celsius 1°C~one degree Celsius 1234-123kg~one thousand two hundred and thirty four to one hundred and twenty three kilograms +45º&C~forty five degree and C diff --git a/tests/nemo_text_processing/en/data_text_normalization/test_cases_normalize_with_audio.txt b/tests/nemo_text_processing/en/data_text_normalization/test_cases_normalize_with_audio.txt index 639cea6366ad..5698b7886116 100644 --- a/tests/nemo_text_processing/en/data_text_normalization/test_cases_normalize_with_audio.txt +++ b/tests/nemo_text_processing/en/data_text_normalization/test_cases_normalize_with_audio.txt @@ -65,7 +65,7 @@ four five six seven forty five sixty seven four thousand five hundred and sixty seven ~This example number 15,000 can be a very long one, and can fail to produce valid normalization for such an easy number like 10,125 or dollar value $5349.01, and can fail to terminate, and can fail to terminate, and can fail to terminate, and can fail to terminate, and can fail to terminate, 452. -This example number fifteen thousand can be a very long one, and can fail to produce valid normalization for such an easy number like ten thousand one hundred twenty five or dollar value five thousand and three forty nine us dollars one cent, and can fail to terminate, and can fail to terminate, and can fail to terminate, and can fail to terminate, and can fail to terminate, four hundred fifty two. +This example number fifteen thousand can be a very long one, and can fail to produce valid normalization for such an easy number like ten thousand one hundred twenty five or dollar value five thousand and three forty nine us dollars and one cent, and can fail to terminate, and can fail to terminate, and can fail to terminate, and can fail to terminate, and can fail to terminate, four fifty two. ~$1.01 one dollar one cent one dollar and one cent diff --git a/tests/nemo_text_processing/en/data_text_normalization/test_cases_punctuation.txt b/tests/nemo_text_processing/en/data_text_normalization/test_cases_punctuation.txt index 56ab0c1ca12e..c3073a3934bf 100644 --- a/tests/nemo_text_processing/en/data_text_normalization/test_cases_punctuation.txt +++ b/tests/nemo_text_processing/en/data_text_normalization/test_cases_punctuation.txt @@ -60,3 +60,4 @@ dr. Evil~dr. Evil (1)Hello~(one) Hello ÀÁÂÃ check §- and ƛ, also ɧ~ÀÁÂÃ check section - and ƛ, also ɧ Hi it's 5pm,4A.M.?-34. Hi,no,yes,34! 12,again,4 and NO?17 and $.01,here & there--0.004kg~Hi it's five PM, four AM.? minus thirty four. Hi,no,yes, thirty four! twelve, again, four and NO? seventeen and one cent, here and there - minus zero point zero zero four kilograms +1°C.~one degree Celsius. diff --git a/tutorials/nlp/Non_English_Downstream_Tasks_(NER).ipynb b/tutorials/nlp/Non_English_Downstream_Tasks_(NER).ipynb index 443f0713a45c..bfa56e5a2567 100644 --- a/tutorials/nlp/Non_English_Downstream_Tasks_(NER).ipynb +++ b/tutorials/nlp/Non_English_Downstream_Tasks_(NER).ipynb @@ -31,7 +31,7 @@ "# If you're using Google Colab and not running locally, run this cell\n", "\n", "# install NeMo\n", - "!python -m pip install git+https://github.com/NVIDIA/NeMo.git@${BRANCH}#egg=nemo_toolkit[nlp]" + "!python -m pip install git+https://github.com/NVIDIA/NeMo.git@$BRANCH#egg=nemo_toolkit[nlp]" ] }, { diff --git a/tutorials/tts/Fastpitch_Training_GermanTTS.ipynb b/tutorials/tts/Fastpitch_Training_GermanTTS.ipynb index 1c0ec8716701..a35fb9d94d77 100644 --- a/tutorials/tts/Fastpitch_Training_GermanTTS.ipynb +++ b/tutorials/tts/Fastpitch_Training_GermanTTS.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "f5adc294", + "id": "9e23311d", "metadata": {}, "source": [ "# Modifying FastPitch to Train on a Non-English (German) Dataset\n", @@ -16,7 +16,7 @@ }, { "cell_type": "markdown", - "id": "fc18f4fb", + "id": "2e57b884", "metadata": {}, "source": [ "# License\n", @@ -39,7 +39,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e27a7dc1", + "id": "392161ff", "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ "3. Connect to an instance with a GPU (Runtime -> Change runtime type -> select \"GPU\" for hardware accelerator)\n", "4. Run this cell to set up dependencies# .\n", "\"\"\"\n", - "BRANCH = 'tts_germanfastpitch'\n", + "BRANCH = 'main'\n", "# # If you're using Colab and not running locally, uncomment and run this cell.\n", "# !apt-get install sox libsndfile1 ffmpeg\n", "# !pip install wget unidecode pynini==2.1.4 scipy==1.7.3\n", @@ -61,7 +61,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bf1cc79c", + "id": "d9a5e132", "metadata": {}, "outputs": [], "source": [ @@ -78,25 +78,28 @@ { "cell_type": "code", "execution_count": null, - "id": "0023bb0f", + "id": "c588ff4f", "metadata": {}, "outputs": [], "source": [ "# lets download the files we need to run this tutorial\n", "\n", - "!mkdir /NeMo\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/scripts/dataset_processing/tts/openslr/get_data.py\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/fastpitch.py\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/hifigan_finetune.py\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/scripts/dataset_processing/tts/extract_sup_data.py\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/NVIDIA/NeMo/$BRANCH/examples/tts/conf/de/fastpitch_align_22050.yaml\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/NVIDIA/NeMo/$BRANCH/examples/tts/conf/hifigan/hifigan.yaml\n", - "!cd /NeMo && wget https://raw.githubusercontent.com/NVIDIA/NeMo/$BRANCH/nemo_text_processing/text_normalization/de/data/whitelist.tsv" + "!mkdir NeMoGermanTTS\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/scripts/dataset_processing/tts/openslr/get_data.py\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/fastpitch.py\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/hifigan_finetune.py\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/scripts/dataset_processing/tts/extract_sup_data.py\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/NVIDIA/NeMo/$BRANCH/examples/tts/conf/de/fastpitch_align_22050.yaml\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/NVIDIA/NeMo/$BRANCH/examples/tts/conf/hifigan/hifigan.yaml\n", + "!cd NeMoGermanTTS && wget https://raw.githubusercontent.com/NVIDIA/NeMo/$BRANCH/nemo_text_processing/text_normalization/de/data/whitelist.tsv\n", + "!cd NeMoGermanTTS && mkdir -p model/train_ds && cd model/train_ds && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/conf/hifigan/model/train_ds/train_ds_finetune.yaml\n", + "!cd NeMoGermanTTS && mkdir -p model/train_ds && cd model/validation_ds && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/conf/hifigan/model/validation_ds/val_ds_finetune.yaml\n", + "!cd NeMoGermanTTS && mkdir -p model/generator && cd model/generator && wget https://raw.githubusercontent.com/nvidia/NeMo/$BRANCH/examples/tts/conf/hifigan/model/generator/v1.yaml" ] }, { "cell_type": "markdown", - "id": "0addf41a", + "id": "c3b37631", "metadata": {}, "source": [ "# Introduction" @@ -104,7 +107,7 @@ }, { "cell_type": "markdown", - "id": "c0c67aa7", + "id": "ba60fc45", "metadata": {}, "source": [ "### FastPitch\n", @@ -119,7 +122,7 @@ }, { "cell_type": "markdown", - "id": "b0fb61bc", + "id": "747a9f24", "metadata": {}, "source": [ "# Dataset Preparation" @@ -127,7 +130,7 @@ }, { "cell_type": "markdown", - "id": "dbc3a5ab", + "id": "e1cf7a8d", "metadata": {}, "source": [ "We will show example of preprocessing and training using OpenSLR's German Neutral TTS dataset ([link](https://www.openslr.org/95)). It is a free single german speaker dataset (> 23 hours) by Thorsten Müller (voice) and Dominik Kreutz (audio optimization) for tts training. \n", @@ -138,12 +141,12 @@ "3. Normalizing text\n", "4. Phonemization\n", "5. Creating dataset config\n", - "6. Creating suppplementary data" + "6. Creating supplementary data" ] }, { "cell_type": "markdown", - "id": "add9f955", + "id": "40e76a38", "metadata": {}, "source": [ "## 1. Downloading the dataset" @@ -152,12 +155,12 @@ { "cell_type": "code", "execution_count": null, - "id": "9982b65b", + "id": "36b8a1d3", "metadata": {}, "outputs": [], "source": [ - "!mkdir /Data && \\\n", - " cd /Data && \\\n", + "!mkdir DataGermanTTS && \\\n", + " cd DataGermanTTS && \\\n", " wget https://us.openslr.org/resources/95/thorsten-de_v02.tgz && \\\n", " tar -zxvf thorsten-de_v02.tgz" ] @@ -165,29 +168,29 @@ { "cell_type": "code", "execution_count": null, - "id": "e500cf5b", + "id": "6db032e5", "metadata": {}, "outputs": [], "source": [ - "# /Data directory looks like\n", - "!ls /Data -R" + "# DataGermanTTS directory looks like\n", + "!ls DataGermanTTS -R" ] }, { "cell_type": "markdown", - "id": "8dd1f324", + "id": "0e94204b", "metadata": {}, "source": [ "\n", "```bash\n", - "$ ls /Data -R\n", - "/Data:\n", + "$ ls DataGermanTTS -R\n", + "DataGermanTTS:\n", "thorsten-de thorsten-de_v02.tgz\n", "\n", - "/Data/thorsten-de:\n", + "DataGermanTTS/thorsten-de:\n", "metadata.csv metadata_shuf.csv metadata_train.csv metadata_val.csv wavs\n", "\n", - "/Data/thorsten-de/wavs:\n", + "DataGermanTTS/thorsten-de/wavs:\n", "00025a6fbea659dae6ece011e749aa34.wav 80689a91d5c8e32847ccbba2322e2122.wav\n", "000314280388fb390b3e70b69ee53a23.wav 8068cbcbe28085c15d2e8a8f7291d009.wav\n", "000624f768d7e282534a850980619fb2.wav 8071b84557c9a780d23414e241393f00.wav\n", @@ -199,36 +202,38 @@ }, { "cell_type": "markdown", - "id": "1be59a49", + "id": "c4f33db9", "metadata": {}, "source": [ "## 2. Creating manifests \n", "\n", - "We've created `scripts/dataset_processing/tts/openslr/get_data.py` script that reads the `/Data/thorsten-de/metadata.csv` provided with the dataset and generates the following fields per each datapoint:\n", + "We've created `scripts/dataset_processing/tts/openslr/get_data.py` script that reads the `DataGermanTTS/thorsten-de/metadata.csv` provided with the dataset and generates the following fields per each datapoint:\n", "1. `audio_filepath`: location of the wav file\n", "2. `duration`: duration of the wav file\n", "3. `text`: original text supplied by OpenSLR\n", " \n", - "After that, the script randomly splits the datapoints into 3 buckets, `train_manifest.json`, `val_manifest.json` and `test_manifest.json`. Example:" + "After that, the script randomly splits the datapoints into 3 buckets, `train_manifest.json`, `val_manifest.json` and `test_manifest.json`.\n", + "\n", + "Note: This step will take sometime to run for the entire dataset. If you are only interested in testing the scripts, please feel free to shorten the `DataGermanTTS/thorsten-de/metadata.csv` file to include only, say, top 100 records." ] }, { "cell_type": "code", "execution_count": null, - "id": "a887e246", + "id": "eb063cf4", "metadata": {}, "outputs": [], "source": [ - "!(cd /NeMo && \\\n", + "!(cd NeMoGermanTTS && \\\n", " python get_data.py \\\n", - " --data-root /Data/ \\\n", + " --data-root ../DataGermanTTS/ \\\n", " --val-size 0.1 \\\n", " --test-size 0.2)" ] }, { "cell_type": "markdown", - "id": "7b5925c5", + "id": "3811cc56", "metadata": {}, "source": [ "In the example above, 10% datapoints go to validation set, 20% go to test set and the remaining 70% go to training set." @@ -237,26 +242,26 @@ { "cell_type": "code", "execution_count": null, - "id": "d85c0161", + "id": "5c7b9430", "metadata": {}, "outputs": [], "source": [ - "# /Data directory looks like\n", - "!ls /Data -R" + "# DataGermanTTS directory looks like\n", + "!ls DataGermanTTS -R" ] }, { "cell_type": "markdown", - "id": "e8478373", + "id": "4d2dd715", "metadata": {}, "source": [ "```bash\n", - "$ ls /Data -R\n", - "/Data:\n", + "$ ls DataGermanTTS -R\n", + "DataGermanTTS:\n", "thorsten-de\n", "thorsten-de_v02.tgz\n", "\n", - "/Data/thorsten-de:\n", + "DataGermanTTS/thorsten-de:\n", "metadata.csv\n", "metadata_shuf.csv\n", "metadata_train.csv\n", @@ -266,7 +271,7 @@ "val_manifest.json\n", "wavs\n", "\n", - "/Data/thorsten-de/wavs:\n", + "DataGermanTTS/thorsten-de/wavs:\n", "00025a6fbea659dae6ece011e749aa34.wav\n", "000314280388fb390b3e70b69ee53a23.wav\n", "000624f768d7e282534a850980619fb2.wav\n", @@ -276,12 +281,12 @@ }, { "cell_type": "markdown", - "id": "11ac14a9", + "id": "2f6ea189", "metadata": {}, "source": [ "## 3. Normalizing text\n", "\n", - "The script above, i.e. `scripts/dataset_processing/tts/openslr/get_data.py`, also generates a another field per each datapoint:\n", + "The script above, i.e. `scripts/dataset_processing/tts/openslr/get_data.py`, also generates another field per each datapoint:\n", "- `normalized_text`: normalized text via NeMo's text normalizer:\n", " ```python\n", " nemo_text_processing.text_normalization.normalize.Normalizer(lang=\"de\", input_case=\"cased\", overwrite_cache=True, cache_dir=str(file_path / \"cache_dir\"))\n", @@ -289,30 +294,30 @@ " \n", "German language text normalizer (defined here: `nemo_text_processing/text_normalization/de`) was created using the tutorial shared under NeMo's `Grammar customization` documentation [here](https://docs.nvidia.com/deeplearning/nemo/user-guide/docs/en/main/nlp/text_normalization/wfst/wfst_text_normalization.html#grammar-customization). Here are some example records:\n", "```json\n", - "{\"audio_filepath\": \"/Data/thorsten-de/wavs/f1becc89cb4079a123ead68c9c8bb8ae.wav\", \"duration\": 7.250023, \"text\": \"Öffne den Webbrowser und rufe www.archlinux.org auf.\", \"normalized_text\": \"Öffne den Webbrowser und rufe w w w punkt a r c h l i n u x punkt o r g auf.\"}\n", + "{\"audio_filepath\": \"DataGermanTTS/thorsten-de/wavs/f1becc89cb4079a123ead68c9c8bb8ae.wav\", \"duration\": 7.250023, \"text\": \"Öffne den Webbrowser und rufe www.archlinux.org auf.\", \"normalized_text\": \"Öffne den Webbrowser und rufe w w w punkt a r c h l i n u x punkt o r g auf.\"}\n", "```\n", "Notice that the URL has been spelled out. \n", "\n", "In other cases, the normalized text may look the same as text, example:\n", "```json\n", - "{\"audio_filepath\": \"/Data/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\"}\n", + "{\"audio_filepath\": \"DataGermanTTS/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\"}\n", "```" ] }, { "cell_type": "markdown", - "id": "1ea88eae", + "id": "6c7f253e", "metadata": {}, "source": [ "## 4. Phonemization\n", "\n", - "The pronunciation of a word can be represented as a string of phones, which are speech sounds, each represented with symbols adapated from the Roman alphabet. The IPA is designed to represent those qualities of speech that are part of lexical (and to a limited extent prosodic) sounds in oral language: phones, phonemes, intonation and the separation of words and syllables. Training model with phonemes as well as text will help the model generate more accurate speech sounds." + "The pronunciation of a word can be represented as a string of phones, which are speech sounds, each represented with symbols adapted from the Roman alphabet. The IPA is designed to represent those qualities of speech that are part of lexical (and to a limited extent prosodic) sounds in oral language: phones, phonemes, intonation and the separation of words and syllables. Training model with phonemes as well as text will help the model generate more accurate speech sounds." ] }, { "cell_type": "code", "execution_count": null, - "id": "00de9751", + "id": "b6c8dad0", "metadata": {}, "outputs": [], "source": [ @@ -322,7 +327,7 @@ }, { "cell_type": "markdown", - "id": "c2d57066", + "id": "f5a88926", "metadata": {}, "source": [ "The original dataset only contains text input, so, in order to add phonemes, we need to convert German text into phonemes using [bootphon/phonemizer](https://github.com/bootphon/phonemizer).\n", @@ -333,7 +338,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ce78633", + "id": "2ffe9bb6", "metadata": {}, "outputs": [], "source": [ @@ -342,7 +347,7 @@ }, { "cell_type": "markdown", - "id": "2d416091", + "id": "f6a79794", "metadata": {}, "source": [ "Alternatively, you can use phonemizer via docker container:\n", @@ -350,7 +355,7 @@ "git clone https://github.com/bootphon/phonemizer\n", "cd phonemizer\n", "docker build -t phonemizer .\n", - "docker run --rm -d -it -p 8888:8888 -v /Data:/Data --ipc=host phonemizer /bin/bash\n", + "docker run --rm -d -it -p 8888:8888 -v DataGermanTTS:DataGermanTTS --ipc=host phonemizer /bin/bash\n", "docker exec -it /bin/bash\n", "```\n", "\n", @@ -360,7 +365,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ec4f0de7", + "id": "131ce5d0", "metadata": {}, "outputs": [], "source": [ @@ -369,7 +374,9 @@ "\n", "backend = EspeakBackend('de')\n", "\n", - "input_manifest_filepaths = [\"/Data/thorsten-de/train_manifest\", \"/Data/thorsten-de/test_manifest\", \"/Data/thorsten-de/val_manifest\"]\n", + "input_manifest_filepaths = [\"DataGermanTTS/thorsten-de/train_manifest\", \\\n", + " \"DataGermanTTS/thorsten-de/test_manifest\", \\\n", + " \"DataGermanTTS/thorsten-de/val_manifest\"]\n", "\n", "for input_manifest_filepath in input_manifest_filepaths:\n", " output_manifest_filepath = input_manifest_filepath+\"_phonemes\"\n", @@ -399,29 +406,29 @@ }, { "cell_type": "markdown", - "id": "f5994604", + "id": "e0e4a206", "metadata": {}, "source": [ "To better understand the phonemize method, refer to the docs [here](https://github.com/bootphon/phonemizer/blob/master/phonemizer/backend/base.py#L137).\n", "\n", - "Run the above script for train, test and val records, resulting in `train_phonemes_manifest.json`, `test_phonemes_manifest.json` and `val_phonemes_manifest.json` respectively.\n", + "Run the above script for train, test and val records, resulting in `train_manifest_phonemes.json`, `test_manifest_phonemes.json` and `val_manifest_phonemes.json` respectively.\n", "\n", "We are effectively doubling the size of our dataset. Each original record maps on to two records, one with original `normalized_text` field value and `is_phoneme` set to 0 and another with phonemized text and `is_phoneme` flag set to 1.\n", "\n", "Example of input record:\n", "```json\n", - "{\"audio_filepath\": \"/Data/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\"}\n", + "{\"audio_filepath\": \"DataGermanTTS/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\"}\n", "```\n", "And corresponding output records:\n", "```json\n", - "{\"audio_filepath\": \"/Data/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\", \"is_phoneme\": 0}\n", - "{\"audio_filepath\": \"/Data/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"\\u0261e\\u02d0t di\\u02d0 \\u0283ant\\u0251\\u02d0t a\\u028af za\\u026an k\\u0254nto\\u02d0 \", \"is_phoneme\": 1}\n", + "{\"audio_filepath\": \"DataGermanTTS/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\", \"is_phoneme\": 0}\n", + "{\"audio_filepath\": \"DataGermanTTS/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"\\u0261e\\u02d0t di\\u02d0 \\u0283ant\\u0251\\u02d0t a\\u028af za\\u026an k\\u0254nto\\u02d0 \", \"is_phoneme\": 1}\n", "```" ] }, { "cell_type": "markdown", - "id": "3f2a97df", + "id": "18578da2", "metadata": {}, "source": [ "## 5. Creating dataset config\n", @@ -441,7 +448,7 @@ "manifest_filepath: \"train_manifest.json\"\n", "sup_data_path: \"sup_data\"\n", "sup_data_types: [ \"align_prior_matrix\", \"pitch\" ]\n", - "whitelist_path: \"/NeMo/whitelist.tsv\"\n", + "whitelist_path: \"NeMoGermanTTS/whitelist.tsv\"\n", "\n", "dataset:\n", " _target_: nemo.collections.tts.torch.data.TTSDataset\n", @@ -482,12 +489,12 @@ " phonemes: true\n", "```\n", "\n", - "Save the above config in `/NeMo/ds_for_fastpitch_align.yaml`." + "Save the above config in `NeMoGermanTTS/ds_for_fastpitch_align.yaml`." ] }, { "cell_type": "markdown", - "id": "20d3ea4b", + "id": "b515c5b4", "metadata": {}, "source": [ "## 6. Creating Supplementary Data\n", @@ -500,31 +507,30 @@ { "cell_type": "code", "execution_count": null, - "id": "a9bb1915", + "id": "114dabfc", "metadata": {}, "outputs": [], "source": [ - "!cd /NeMo/ && \\\n", - " python extract_sup_data.py \\\n", - " --config-path /NeMo \\\n", + "!python NeMoGermanTTS/extract_sup_data.py \\\n", + " --config-path . \\\n", " --config-name ds_for_fastpitch_align.yaml \\\n", - " manifest_filepath=/Data/thorsten-de/train_manifest_phonemes.json \\\n", - " sup_data_path=/Data/thorsten-de/phonemes/" + " manifest_filepath=DataGermanTTS/thorsten-de/train_manifest_phonemes.json \\\n", + " sup_data_path=DataGermanTTS/thorsten-de/phonemes/" ] }, { "cell_type": "markdown", - "id": "b7225af2", + "id": "adfba0f9", "metadata": {}, "source": [ "The above example gives the following result:\n", "1. Creates two folders under `sup_data_path` - `pitch` and `align_prior_matrix`\n", - "2. Prints out `PITCH_MEAN, PITCH_STD = 132.524658203125, 37.389366149902344`" + "2. Prints out some values for pitch mean and standard deviation: `PITCH_MEAN, PITCH_STD = 132.524658203125, 37.389366149902344`. Use these values while training FastPitch." ] }, { "cell_type": "markdown", - "id": "692ac466", + "id": "3278f1ee", "metadata": {}, "source": [ "# Training" @@ -532,7 +538,7 @@ }, { "cell_type": "markdown", - "id": "d552f7ab", + "id": "1ef91842", "metadata": {}, "source": [ "Before we train our model, let's define model config. Most of the model config stays the same as defined here: `examples/tts/conf/fastpitch_align_44100.yaml`, except:\n", @@ -542,22 +548,22 @@ "\n", "3. The `sample_rate` is updated to 22050 KHz per our dataset. And accordingly halve the `n_window_size`, `n_window_stride` and `n_fft` parameters as well. \n", "\n", - "We have already downloaded the config after making these changes here: `/NeMo/fastpitch_align_22050.yaml`" + "We have already downloaded the config after making these changes here: `NeMoGermanTTS/fastpitch_align_22050.yaml`" ] }, { "cell_type": "code", "execution_count": null, - "id": "f21fc784", + "id": "e7f2373e", "metadata": {}, "outputs": [], "source": [ - "!cat /NeMo/fastpitch_align_22050.yaml" + "!cat NeMoGermanTTS/fastpitch_align_22050.yaml" ] }, { "cell_type": "markdown", - "id": "96edcb13", + "id": "1de1cf64", "metadata": {}, "source": [ "If you are using Weights and Biases, you may need to login first. More details [here](https://docs.wandb.ai/ref/cli/wandb-login)." @@ -566,51 +572,47 @@ { "cell_type": "code", "execution_count": null, - "id": "bb23fba3", + "id": "c60ed72a", "metadata": {}, "outputs": [], "source": [ - "wandb_api_key = \"apikey\"\n", - "wandb_project_name = \"GermanTTS\"\n", - "wandb_run_name = \"tutorial\"\n", - "\n", - "!wandb login ${wandb_api_key}" + "!wandb login #paste_wandb_apikey_here" ] }, { "cell_type": "markdown", - "id": "48e16fed", + "id": "51ec332e", "metadata": {}, "source": [ - "Now we are ready for training our model! Let's try to train FastPitch." + "Now we are ready for training our model! Let's try to train FastPitch. Paste the PITCH_MEAN and PITCH_STD from previous steps here." ] }, { "cell_type": "code", "execution_count": null, - "id": "1b37ec68", + "id": "4ad43d30", "metadata": {}, "outputs": [], "source": [ - "!(cd /NeMo && CUDA_VISIBLE_DEVICES=0 python fastpitch.py --config-path /NeMo --config-name fastpitch_align_22050 \\\n", + "!(cd NeMoGermanTTS && CUDA_VISIBLE_DEVICES=0 python fastpitch.py --config-path . --config-name fastpitch_align_22050 \\\n", " model.train_ds.dataloader_params.batch_size=32 \\\n", " model.validation_ds.dataloader_params.batch_size=32 \\\n", - " train_dataset=/Data/thorsten-de/train_manifest_phonemes.json \\\n", - " validation_datasets=/Data/thorsten-de/val_manifest_phonemes.json \\\n", - " sup_data_path=/Data/thorsten-de/phonemes/ \\\n", - " whitelist_path=/NeMo/whitelist.tsv \\\n", - " exp_manager.exp_dir=/result \\\n", + " train_dataset=../DataGermanTTS/thorsten-de/train_manifest_phonemes.json \\\n", + " validation_datasets=../DataGermanTTS/thorsten-de/val_manifest_phonemes.json \\\n", + " sup_data_path=../DataGermanTTS/thorsten-de/phonemes/ \\\n", + " whitelist_path=./whitelist.tsv \\\n", + " exp_manager.exp_dir=resultGermanTTS \\\n", " trainer.max_epochs=1 \\\n", - " pitch_mean=132.524658203125 \\\n", - " pitch_std=37.389366149902344 \\\n", + " pitch_mean=#paste_pitch_mean_here \\\n", + " pitch_std=#paste_pitch_std_here \\\n", " +exp_manager.create_wandb_logger=true \\\n", - " +exp_manager.wandb_logger_kwargs.name=${wandb_run_name} \\\n", - " +exp_manager.wandb_logger_kwargs.project=${wandb_project_name})" + " +exp_manager.wandb_logger_kwargs.name=\"tutorial\" \\\n", + " +exp_manager.wandb_logger_kwargs.project=\"GermanTTS\")" ] }, { "cell_type": "markdown", - "id": "e422a61c", + "id": "b8082cfc", "metadata": {}, "source": [ "Note:\n", @@ -622,7 +624,7 @@ }, { "cell_type": "markdown", - "id": "02c5bea2", + "id": "7a36f955", "metadata": {}, "source": [ "## Evaluating FastPitch + pretrained HiFi-GAN\n", @@ -633,7 +635,20 @@ { "cell_type": "code", "execution_count": null, - "id": "bb7ae759", + "id": "d70d5f7d", + "metadata": {}, + "outputs": [], + "source": [ + "import IPython.display as ipd\n", + "from nemo.collections.tts.models import HifiGanModel, FastPitchModel\n", + "from matplotlib.pyplot import imshow\n", + "from matplotlib import pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e9ee07a", "metadata": {}, "outputs": [], "source": [ @@ -641,13 +656,14 @@ "fastpitch_model_path = \"\" # from the results directory\n", "test = \"Diese Musiksammlung soll die Vielfalt des Lebens widerspiegeln.\" # text input to the model\n", "test_id = \"877d9f668a877713b48735f282af62ca\" # identifier for the audio corresponding to the test text\n", - "data_path = \"/Data/thorsten-de/wavs/\" # path to dataset folder with wav files from original dataset" + "data_path = \"DataGermanTTS/thorsten-de/wavs/\" # path to dataset folder with wav files from original dataset\n", + "seed = 1234" ] }, { "cell_type": "code", "execution_count": null, - "id": "d409870c", + "id": "32a234f4", "metadata": {}, "outputs": [], "source": [ @@ -671,7 +687,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c5c60fc2", + "id": "9a3f5eaa", "metadata": {}, "outputs": [], "source": [ @@ -680,13 +696,13 @@ "if \".nemo\" in fastpitch_model_path:\n", " spec_gen_model = FastPitchModel.restore_from(fastpitch_model_path).eval().cuda()\n", "else:\n", - " FastPitchModel.load_from_checkpoint(checkpoint_path=fastpitch_model_path).eval().cuda()" + " spec_gen_model = FastPitchModel.load_from_checkpoint(checkpoint_path=fastpitch_model_path).eval().cuda()" ] }, { "cell_type": "code", "execution_count": null, - "id": "6695665f", + "id": "de04b514", "metadata": {}, "outputs": [], "source": [ @@ -708,15 +724,15 @@ }, { "cell_type": "markdown", - "id": "98782fb8", + "id": "e57e9baf", "metadata": {}, "source": [ - "We see that audio quality is not as good as we expect. One of the ways mentioned in the [FastPitch_Finetuning.ipynb](FastPitch_Finetuning.ipynb) tutorial is to finetune HiFi-GAN. Lets try that out next!" + "We see that audio quality is not as good as we expect, even after training FastPitch for 1000 epochs. One of the ways mentioned in the [FastPitch_Finetuning.ipynb](FastPitch_Finetuning.ipynb) tutorial is to finetune HiFi-GAN. Lets try that out next!" ] }, { "cell_type": "markdown", - "id": "4e33d57b", + "id": "e6d62337", "metadata": {}, "source": [ "# Finetuning HiFi-GAN\n", @@ -726,7 +742,7 @@ }, { "cell_type": "markdown", - "id": "473cbfb6", + "id": "4efcf84d", "metadata": {}, "source": [ "## Generating synthetic mels\n", @@ -736,20 +752,20 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "14a34ba9", + "execution_count": null, + "id": "59d12874", "metadata": {}, "outputs": [], "source": [ - "test_audio_filepath = \"/Data/thorsten-de/wavs/5d000c81c8e7c4817cbfd7c4b8738feb.wav\"\n", + "test_audio_filepath = \"DataGermanTTS/thorsten-de/wavs/5d000c81c8e7c4817cbfd7c4b8738feb.wav\"\n", "test_audio_text = \"Dieser Geruch, wenn jemand eine Clementine \\u00f6ffnet!\"\n", "fastpitch_model_path = \"\"" ] }, { "cell_type": "code", - "execution_count": 12, - "id": "dfa99f1e", + "execution_count": null, + "id": "9395abc3", "metadata": {}, "outputs": [], "source": [ @@ -782,7 +798,7 @@ { "cell_type": "code", "execution_count": null, - "id": "14988711", + "id": "1679a9f9", "metadata": {}, "outputs": [], "source": [ @@ -791,7 +807,7 @@ }, { "cell_type": "markdown", - "id": "046e7e7c", + "id": "4a2cb665", "metadata": {}, "source": [ "So we have 2 types of mel spectrograms that we can use for finetuning HiFi-GAN:\n", @@ -801,31 +817,10 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "3ac663e7", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loading original melspec\n", - "spectrogram shape = (80, 315)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "id": "cb1ec7d4", + "metadata": {}, + "outputs": [], "source": [ "print(\"loading original melspec\")\n", "y, sr = librosa.load(test_audio_filepath)\n", @@ -839,7 +834,7 @@ }, { "cell_type": "markdown", - "id": "e67c3f3a", + "id": "a06ab269", "metadata": {}, "source": [ "### 2. Mel spectrogram predicted from FastPitch" @@ -847,31 +842,10 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "eb8fd365", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loading fastpitch melspec via generate_spectrogram\n", - "spectrogram shape = (80, 291)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "id": "2ba1586a", + "metadata": {}, + "outputs": [], "source": [ "print(\"loading fastpitch melspec via generate_spectrogram\")\n", "with torch.no_grad():\n", @@ -888,7 +862,7 @@ }, { "cell_type": "markdown", - "id": "354fbd71", + "id": "bf1639d4", "metadata": {}, "source": [ "Note: The above spectrogram has the duration 291 which is not equal to the ground truth length, i.e. 315. In order to finetune HiFi-GAN we need mel spectrogram predicted from FastPitch with groundtruth alignment and duration.\n", @@ -898,31 +872,10 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "f2189d94", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "loading fastpitch melspec via forward method with groundtruth alignment and duration\n", - "spectrogram shape = (80, 315)\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "execution_count": null, + "id": "f9fde5e7", + "metadata": {}, + "outputs": [], "source": [ "print(\"loading fastpitch melspec via forward method with groundtruth alignment and duration\")\n", "with torch.no_grad():\n", @@ -953,7 +906,7 @@ }, { "cell_type": "markdown", - "id": "114e3c89", + "id": "f49b70b9", "metadata": {}, "source": [ "In our experience, \n", @@ -966,7 +919,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5686fc76", + "id": "4d2c5e5d", "metadata": {}, "outputs": [], "source": [ @@ -982,8 +935,8 @@ "\n", "folder_name = \"synmels\"\n", "fastpitch_model_path = \"\"\n", - "dataset_part = \"test_phonemes\" # or \"val_phonemes\", \"train_phonemes\"\n", - "dataset_base_path = \"/Data/\"\n", + "dataset_parts = [\"test_manifest_phonemes\", \"val_manifest_phonemes\", \"train_manifest_phonemes\"]\n", + "dataset_base_path = \"DataGermanTTS/\"\n", "\n", "from nemo.collections.tts.models import FastPitchModel\n", "if \".nemo\" in fastpitch_model_path:\n", @@ -998,74 +951,75 @@ " samples = f.read(dtype='float32')\n", " return samples.transpose()\n", " \n", - "# Get records from the manifest\n", - "manifest_path = dataset_base_path+\"thorsten-de/\"+dataset_part+\"_manifest.json\"\n", - "records = []\n", - "with open(manifest_path, \"r\") as f:\n", - " for i, line in enumerate(f):\n", - " records.append(json.loads(line))\n", + "for dataset_part in dataset_parts:\n", + " # Get records from the manifest\n", + " manifest_path = f\"{dataset_base_path}thorsten-de/{dataset_part}.json\"\n", + " records = []\n", + " with open(manifest_path, \"r\") as f:\n", + " for i, line in enumerate(f):\n", + " records.append(json.loads(line))\n", "\n", - "beta_binomial_interpolator = BetaBinomialInterpolator()\n", + " beta_binomial_interpolator = BetaBinomialInterpolator()\n", "\n", - "spec_model.eval()\n", - "device = spec_model.device\n", + " spec_model.eval()\n", + " device = spec_model.device\n", "\n", - "save_dir = Path(dataset_base_path+folder_name+\"/\"+dataset_part)\n", + " save_dir = Path(f\"{dataset_base_path}{folder_name}/{dataset_part}\")\n", "\n", - "save_dir.mkdir(exist_ok=True, parents=True)\n", + " save_dir.mkdir(exist_ok=True, parents=True)\n", "\n", - "# Generate a spectrograms (we need to use ground truth alignment for correct matching between audio and mels)\n", - "for i, r in enumerate(records):\n", - " audio = load_wav(r[\"audio_filepath\"])\n", + " # Generate a spectrograms (we need to use ground truth alignment for correct matching between audio and mels)\n", + " for i, r in enumerate(records):\n", + " audio = load_wav(r[\"audio_filepath\"])\n", "\n", - " audio = torch.from_numpy(audio).unsqueeze(0).to(device)\n", - " audio_len = torch.tensor(audio.shape[1], dtype=torch.long, device=device).unsqueeze(0)\n", - "\n", - " # Again, our finetuned FastPitch model doesn't use multiple speakers,\n", - " # but we keep the code to support it here for reference\n", - " if spec_model.fastpitch.speaker_emb is not None and \"speaker\" in r:\n", - " speaker = torch.tensor([r['speaker']]).to(device)\n", - " else:\n", - " speaker = None\n", + " audio = torch.from_numpy(audio).unsqueeze(0).to(device)\n", + " audio_len = torch.tensor(audio.shape[1], dtype=torch.long, device=device).unsqueeze(0)\n", "\n", - " with torch.no_grad():\n", - " if \"normalized_text\" in r:\n", - " text = spec_model.parse(r[\"normalized_text\"], normalize=False)\n", + " # Again, our finetuned FastPitch model doesn't use multiple speakers,\n", + " # but we keep the code to support it here for reference\n", + " if spec_model.fastpitch.speaker_emb is not None and \"speaker\" in r:\n", + " speaker = torch.tensor([r['speaker']]).to(device)\n", " else:\n", - " text = spec_model.parse(r['text'])\n", + " speaker = None\n", "\n", - " text_len = torch.tensor(text.shape[-1], dtype=torch.long, device=device).unsqueeze(0)\n", + " with torch.no_grad():\n", + " if \"normalized_text\" in r:\n", + " text = spec_model.parse(r[\"normalized_text\"], normalize=False)\n", + " else:\n", + " text = spec_model.parse(r['text'])\n", "\n", - " spect, spect_len = spec_model.preprocessor(input_signal=audio, length=audio_len)\n", + " text_len = torch.tensor(text.shape[-1], dtype=torch.long, device=device).unsqueeze(0)\n", "\n", - " # Generate attention prior and spectrogram inputs for HiFi-GAN\n", - " attn_prior = torch.from_numpy(\n", - " beta_binomial_interpolator(spect_len.item(), text_len.item())\n", - " ).unsqueeze(0).to(text.device)\n", - " \n", - " spectrogram = spec_model.forward(\n", - " text=text, \n", - " input_lens=text_len, \n", - " spec=spect, \n", - " mel_lens=spect_len, \n", - " attn_prior=attn_prior,\n", - " speaker=speaker,\n", - " )[0]\n", + " spect, spect_len = spec_model.preprocessor(input_signal=audio, length=audio_len)\n", + "\n", + " # Generate attention prior and spectrogram inputs for HiFi-GAN\n", + " attn_prior = torch.from_numpy(\n", + " beta_binomial_interpolator(spect_len.item(), text_len.item())\n", + " ).unsqueeze(0).to(text.device)\n", + "\n", + " spectrogram = spec_model.forward(\n", + " text=text, \n", + " input_lens=text_len, \n", + " spec=spect, \n", + " mel_lens=spect_len, \n", + " attn_prior=attn_prior,\n", + " speaker=speaker,\n", + " )[0]\n", "\n", - " save_path = save_dir / f\"mel_{i}.npy\"\n", - " np.save(save_path, spectrogram[0].to('cpu').numpy())\n", - " r[\"mel_filepath\"] = str(save_path)\n", + " save_path = save_dir / f\"mel_{i}.npy\"\n", + " np.save(save_path, spectrogram[0].to('cpu').numpy())\n", + " r[\"mel_filepath\"] = str(save_path)\n", "\n", - "hifigan_manifest_path = dataset_base_path+folder_name+\"/hifigan_\"+dataset_part+\"_ft.json\"\n", + " hifigan_manifest_path = f\"{dataset_base_path}{folder_name}/hifigan_{dataset_part}_ft.json\"\n", "\n", - "with open(hifigan_manifest_path, \"w\") as f:\n", - " for r in records:\n", - " f.write(json.dumps(r) + '\\n')" + " with open(hifigan_manifest_path, \"w\") as f:\n", + " for r in records:\n", + " f.write(json.dumps(r) + '\\n')" ] }, { "cell_type": "markdown", - "id": "4e4f65cb", + "id": "371506df", "metadata": {}, "source": [ "Revisiting how we implement #2.1 (i.e. Predicted mel spectrogram predicted from FastPitch with groundtruth alignment and duration):\n", @@ -1094,27 +1048,27 @@ " \n", "Repeat the above script for train and validation datasets as well. \n", "\n", - "Finally, the `/Data/synmels` will look like:\n", + "Finally, the `DataGermanTTS/synmels` will look like:\n", "```\n", - "/Data/synmels/:\n", - "hifigan_test_ft.json\n", - "hifigan_train_ft.json\n", - "hifigan_val_ft.json\n", - "test\n", - "train\n", - "val\n", - "\n", - "/Data/synmels/test:\n", + "DataGermanTTS/synmels/:\n", + "hifigan_test_manifest_phonemes_ft.json\n", + "hifigan_train_manifest_phonemes_ft.json\n", + "hifigan_val_manifest_phonemes_ft.json\n", + "test_manifest_phonemes\n", + "train_manifest_phonemes\n", + "val_manifest_phonemes\n", + "\n", + "DataGermanTTS/synmels/test_manifest_phonemes:\n", "mel_0.npy\n", "mel_1.npy\n", "...\n", "\n", - "/Data/synmels/train:\n", + "DataGermanTTS/synmels/train_manifest_phonemes:\n", "mel_0.npy\n", "mel_1.npy\n", "...\n", "\n", - "/Data/synmels/val:\n", + "DataGermanTTS/synmels/val_manifest_phonemes:\n", "mel_0.npy\n", "mel_1.npy\n", "...\n", @@ -1122,13 +1076,13 @@ "\n", "Example HiFi-GAN manifest:\n", "```json\n", - "{\"audio_filepath\": \"/Data/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\", \"mel_filepath\": \"/Data/synmels/test/mel_0.npy\"}\n", + "{\"audio_filepath\": \"DataGermanTTS/thorsten-de/wavs/e50eb02c25353f85549900d2fc1e0e32.wav\", \"duration\": 2.409977, \"text\": \"Geht die Schandtat auf sein Konto?\", \"normalized_text\": \"Geht die Schandtat auf sein Konto?\", \"mel_filepath\": \"DataGermanTTS/synmels/test_manifest_phonemes/mel_0.npy\"}\n", "```" ] }, { "cell_type": "markdown", - "id": "33541413", + "id": "565e07a8", "metadata": {}, "source": [ "## Launch finetuning\n", @@ -1139,37 +1093,18 @@ { "cell_type": "code", "execution_count": null, - "id": "2deb96ae", + "id": "fa06c0b1", "metadata": {}, "outputs": [], "source": [ - "!(cd /Data && \\\n", + "!(cd DataGermanTTS && \\\n", " wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/nemo/tts_hifigan/versions/1.0.0rc1/zip -O tts_hifigan_1.0.0rc1.zip && \\\n", " unzip tts_hifigan_1.0.0rc1.zip)" ] }, { "cell_type": "markdown", - "id": "5c324ba6", - "metadata": {}, - "source": [ - "Setting up wandb" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7f7a12f6", - "metadata": {}, - "outputs": [], - "source": [ - "wandb_project_name = \"GermanTTS\"\n", - "wandb_run_name = \"tutorial_2\"" - ] - }, - { - "cell_type": "markdown", - "id": "ddd4623b", + "id": "fc7e8554", "metadata": {}, "source": [ "We will be re-using the existing HiFi-GAN config and HiFi-GAN pretrained on English." @@ -1178,30 +1113,29 @@ { "cell_type": "code", "execution_count": null, - "id": "ca4a5291", + "id": "73b4cbc2", "metadata": {}, "outputs": [], "source": [ - "!(cd /NeMo && \\\n", - " python hifigan_finetune.py --config-path /NeMo --config-name hifigan.yaml \\\n", + "!(python NeMoGermanTTS/hifigan_finetune.py --config-path . --config-name hifigan.yaml \\\n", " model.max_steps=10 \\\n", " model.optim.lr=0.00001 \\\n", - " model.train_ds=train_ds_finetune \\\n", - " model.validation_ds=val_ds_finetune \\\n", " ~model.optim.sched \\\n", - " train_dataset=/Data/synmels/hifigan_train_phonemes_ft.json \\\n", - " validation_datasets=/Data/synmels/hifigan_val_phonemes_ft.json \\\n", - " exp_manager.exp_dir=/result \\\n", - " +init_from_nemo_model=/Data/tts_hifigan.nemo \\\n", + " train_dataset=DataGermanTTS/synmels/hifigan_train_manifest_phonemes_ft.json \\\n", + " validation_datasets=DataGermanTTS/synmels/hifigan_val_manifest_phonemes_ft.json \\\n", + " exp_manager.exp_dir=resultGermanTTS \\\n", + " +init_from_nemo_model=DataGermanTTS/tts_hifigan.nemo \\\n", " trainer.devices=-1 \\\n", + " model/train_ds=train_ds_finetune \\\n", + " model/validation_ds=val_ds_finetune \\\n", " exp_manager.create_wandb_logger=true \\\n", - " exp_manager.wandb_logger_kwargs.name=${wandb_run_name} \\\n", - " exp_manager.wandb_logger_kwargs.project=${wandb_project_name})" + " exp_manager.wandb_logger_kwargs.name=\"tutorial_2\" \\\n", + " exp_manager.wandb_logger_kwargs.project=\"GermanTTS\")" ] }, { "cell_type": "markdown", - "id": "3cdafb08", + "id": "c8721ea1", "metadata": {}, "source": [ "Note: We've limited the above run to 10 steps only, so we can validate the implementation within the scope of this tutorial. We recommend evaluating around every 50 steps HiFi-GAN until you get desired quality results." @@ -1209,7 +1143,7 @@ }, { "cell_type": "markdown", - "id": "3d69751f", + "id": "a3b04d69", "metadata": {}, "source": [ "## Evaluating FastPitch and Finetuned HiFi-GAN\n", @@ -1220,22 +1154,28 @@ { "cell_type": "code", "execution_count": null, - "id": "8abcc589", + "id": "a62d54cf", "metadata": {}, "outputs": [], "source": [ "hfg_path = \"\"\n", + "fastpitch_model_path = \"\"\n", "\n", "if \".nemo\" in hfg_path:\n", " vocoder_model_pt = HifiGanModel.restore_from(hfg_path).eval().cuda()\n", "else:\n", - " vocoder_model_pt = HifiGanModel.load_from_checkpoint(checkpoint_path=hfg_path).eval().cuda()" + " vocoder_model_pt = HifiGanModel.load_from_checkpoint(checkpoint_path=hfg_path).eval().cuda()\n", + " \n", + "if \".nemo\" in fastpitch_model_path:\n", + " spec_gen_model = FastPitchModel.restore_from(fastpitch_model_path).eval().cuda()\n", + "else:\n", + " spec_gen_model = FastPitchModel.load_from_checkpoint(checkpoint_path=fastpitch_model_path).eval().cuda()" ] }, { "cell_type": "code", "execution_count": null, - "id": "9b196494", + "id": "94c2b645", "metadata": {}, "outputs": [], "source": [ @@ -1257,7 +1197,7 @@ }, { "cell_type": "markdown", - "id": "5cb8f4d8", + "id": "dbe10199", "metadata": {}, "source": [ "That's it!" @@ -1280,7 +1220,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.12" + "version": "3.8.13" } }, "nbformat": 4,