如何使用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.scp
为keys.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
创建与新任务相关的任务