ESPNet2使用

如何使用pdb逐步调试ESPNet2

pdb不支持分布式训练,所以如果希望利用pdb进行调试,需要将对应数据集下面的enh.sh中的530-536行注释掉

#注释如下几行以运行pdb调试
${python} -m espnet2.bin.launch \
    --cmd "${cuda_cmd} --name ${jobname}" \
    --log "${enh_exp}"/train.log \
    --ngpu "${ngpu}" \
    --num_nodes "${num_nodes}" \
    --init_file_prefix "${enh_exp}"/.dist_init_ \
    --multiprocessing_distributed true -- \

再在想要逐步运行的位置加上pdb.set_trace(),最后可以选择在CPU上调试,或者GPU上调试:

#在CPU上调试
bash run.sh --stage 6 --stop_stage 6 
#在GPU上调试
srun -p 2080ti --gres=gpu:1 run.sh --stage 6 --stop_stage 6

如果希望在测试阶段(stage 7)进行调试,那么可以注释掉enh.sh中的的592行,并修改597行的keys.JOB.scpkeys.1.scp

#注释下面带{_cmd}的一行,并修keys.JOB.scp为keys.1.scp以运行pdb调试
${_cmd} --gpu "${_ngpu}" JOB=1:"${_nj}" "${_logdir}"/enh_inference.JOB.log \                               ${python} -m espnet2.bin.enh_inference \
        --ngpu "${_ngpu}" \
        --fs "${fs}" \
        --data_path_and_name_and_type "${_data}/${_scp},speech_mix,${_type}" \
        #--key_file "${_logdir}"/keys.JOB.scp \
        --key_file "${_logdir}"/keys.1.scp \
        --enh_train_config "${enh_exp}"/config.yaml \
        --enh_model_file "${enh_exp}"/"${inference_model}" \
        --output_dir "${_logdir}"/output.JOB \
        ${_opts} ${inference_args}

为了在CPU上运行调试,还需要修改espnet/espnet2/bin/enh_inference.py,在SeparateSpeech类的初始化函数最开始加上:

    def __init__(
        self,
        enh_train_config: Union[Path, str],
        enh_model_file: Union[Path, str] = None,
        segment_size: Optional[float] = None,
        hop_size: Optional[float] = None,
        normalize_segment_scale: bool = False,
        show_progressbar: bool = False,
        ref_channel: Optional[int] = None,
        normalize_output_wav: bool = False,
        device: str = "cpu",
        dtype: str = "float32",
    ):  
        assert check_argument_types()
        #pdb.set_trace()
        #加上下面两句以在CPU上运行调试    
        if device == 'cuda':
            device = 'cpu'

        # 1. Build Enh model
        enh_model, enh_train_args = EnhancementInformedTask.build_model_from_file(
            enh_train_config, enh_model_file, device
        )   
        enh_model.to(dtype=getattr(torch, dtype)).eval()

之后便可以通过下面的命令运行调试:

bash ./run.sh --stage 7 --stop-stage 7

如何为ESPNet新增一个Task

在ESPNet2框架下新增加一个任务,可以参考官方文档中有关task的说明。举例来说,若想要新增加一个增强任务,需要:

  • espnet/espnet2/enh目录下,仿照espnet_model.py创建一个与任务相关的新模型
  • espnet/espnet2/enh目录下的encoder,decoder,separator目录下创建新模型需要的模块:abs_needed_module.py, needed_module.py
  • espnet/espnet2/bin目录下,仿照enh_train.py, enh_inference.py, enh_scoring.py创建与新模型相关的文件
  • espnet/espnet2/task目录下,仿照enh.py创建与新任务相关的任务

你可能感兴趣的:(ESPNet2使用)