# This config describes a CarneliNet model with 384 filters (CarneliNet-384) with CTC loss and word-piece tokenizer. # The values in this config have tested on LibriSpeech dataset for effective batch size of 1K trained on 32 GPUs with AMP enabled. # Larger and smaller models, e.g. CarneliNet-1024, can reuse the same architecture and config file. However, for larger model # SpecAugment regularization is stronger and number of filters in epilog layer is also increased. Specifically for LibriSpeech dataset # activation function and weight initialization policy also change for the largest of models. If a training dataset is much larger than # LibriSpeech, Swish and tds_uniform parameters may show improvements even for CarneliNet-1024. # # The changes between models is captured in the following table. The rest of the parameters is the same across all models. # +-----------------+---------+---------+------------+----------------+------------+ # | Model | filters | encoder | activation | weight | time_masks | # | | | final | | init_mode | | # | | | filters | | | | # +-----------------+---------+---------+------------+----------------+------------+ # | CarneliNet-256 | 256 | 640 | Swish | tds_uniform | 2 | # +-----------------+---------+---------+------------+----------------+------------+ # | CarneliNet-384 | 384 | 640 | Swish | tds_uniform | 2 | # +-----------------+---------+---------+------------+----------------+------------+ # | CarneliNet-512 | 512 | 640 | Swish | tds_uniform | 10 | # +-----------------+---------+---------+------------+----------------+------------+ # | CarneliNet-768 | 768 | 1024 | ReLu | xavier_uniform | 10 | # +-----------------+---------+---------+------------+----------------+------------+ # | CarneliNet-1024 | 1024 | 1024 | ReLu | xavier_uniform | 10 | # +-----------------+---------+---------+------------+----------------+------------+ name: &name "CarneliNet-384-8x-Stride" model: sample_rate: &sample_rate 16000 train_ds: manifest_filepath: ??? sample_rate: 16000 batch_size: 32 trim_silence: false use_start_end_token: false max_duration: 16.7 shuffle: true num_workers: 8 pin_memory: true # tarred datasets is_tarred: false tarred_audio_filepaths: null shuffle_n: 2048 # bucketing params bucketing_strategy: "synced_randomized" bucketing_batch_size: null validation_ds: manifest_filepath: ??? sample_rate: 16000 batch_size: 32 shuffle: false use_start_end_token: false num_workers: 8 pin_memory: true test_ds: manifest_filepath: null sample_rate: 16000 batch_size: 32 shuffle: false use_start_end_token: false num_workers: 8 pin_memory: true model_defaults: repeat: 5 dropout: 0.1 separable: true se: true se_context_size: -1 se_repeat: false kernel_size: 11 filters: 384 encoder_final_filters: 640 tokenizer: dir: ??? # path to directory which contains either tokenizer.model (bpe) or vocab.txt (for wpe) type: ??? # Can be either bpe or wpe preprocessor: _target_: nemo.collections.asr.modules.AudioToMelSpectrogramPreprocessor sample_rate: *sample_rate normalize: "per_feature" window_size: 0.025 window_stride: 0.01 window: "hann" features: &n_mels 80 n_fft: 512 frame_splicing: 1 dither: 0.00001 pad_to: 16 stft_conv: false spec_augment: _target_: nemo.collections.asr.modules.SpectrogramAugmentation freq_masks: 2 time_masks: 2 freq_width: 27 time_width: 0.05 encoder: _target_: nemo.collections.asr.modules.ParallelConvASREncoder feat_in: *n_mels activation: swish init_mode: tds_uniform conv_mask: true jasper: - filters: ${model.model_defaults.filters} repeat: 1 kernel: [5] stride: [1] dilation: [1] dropout: 0.0 residual: false separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} - filters: ${model.model_defaults.filters} repeat: ${model.model_defaults.repeat} kernel: [5] stride: [2] dilation: [1] dropout: ${model.model_defaults.dropout} residual: true separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} stride_last: true residual_mode: "stride_add" - filters: ${model.model_defaults.filters} repeat: ${model.model_defaults.repeat} kernel: ["${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}"] stride: [1] dilation: [1] dropout: ${model.model_defaults.dropout} residual: true separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} - filters: ${model.model_defaults.filters} repeat: ${model.model_defaults.repeat} kernel: [7] stride: [2] # *stride dilation: [1] dropout: ${model.model_defaults.dropout} residual: true separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} stride_last: true residual_mode: "stride_add" - filters: ${model.model_defaults.filters} repeat: ${model.model_defaults.repeat} kernel: ["${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}"] stride: [1] dilation: [1] dropout: ${model.model_defaults.dropout} residual: true separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} - filters: ${model.model_defaults.filters} repeat: ${model.model_defaults.repeat} kernel: [13] stride: [2] # stride dilation: [1] dropout: ${model.model_defaults.dropout} residual: true separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} stride_last: true residual_mode: "stride_add" - filters: ${model.model_defaults.filters} repeat: ${model.model_defaults.repeat} kernel: ["${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}","${model.model_defaults.kernel_size}"] stride: [1] dilation: [1] dropout: ${model.model_defaults.dropout} residual: true separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} - filters: ${model.model_defaults.encoder_final_filters} repeat: 1 kernel: ["${model.model_defaults.kernel_size}"] stride: [1] dilation: [1] dropout: 0.0 residual: false separable: ${model.model_defaults.separable} se: ${model.model_defaults.se} se_context_size: ${model.model_defaults.se_context_size} se_repeat: ${model.model_defaults.se_repeat} decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.model_defaults.encoder_final_filters} num_classes: -1 # filled with vocabulary size from tokenizer at runtime vocabulary: [] # filled with vocabulary from tokenizer at runtime optim: name: novograd lr: 0.1 # optimizer arguments betas: [0.8, 0.25] weight_decay: 0.001 # scheduler setup sched: name: CosineAnnealing # scheduler config override warmup_steps: 1000 warmup_ratio: null min_lr: 1e-5 last_epoch: -1 trainer: devices: 1 # number of gpus max_epochs: 100 max_steps: -1 # computed at runtime if not set num_nodes: 1 accelerator: gpu strategy: ddp accumulate_grad_batches: 1 enable_checkpointing: False # Provided by exp_manager logger: false # Provided by exp_manager log_every_n_steps: 50 # Interval of logging. val_check_interval: 1.0 # Set to 0.25 to check 4 times per epoch, or an int for number of iterations precision: 32 # If AMP is available, change to 16 to gain training speed increase and lower memory consumption (preferred). sync_batchnorm: false benchmark: false # needs to be false for models with variable-length speech input as it slows down training exp_manager: exp_dir: null name: *name create_tensorboard_logger: true create_checkpoint_callback: true checkpoint_callback_params: monitor: "val_wer" mode: "min" always_save_nemo: true create_wandb_logger: false wandb_logger_kwargs: name: null project: null entity: null resume_if_exists: false resume_ignore_no_checkpoint: false hydra: run: dir: . job_logging: root: handlers: null