05 DTT模型的下载和运行

DTT模型的下载和运行

GitHub地址:junyuchen-cjy/DTTNet-Pytorch: An official implementation of the ICASSP 2024 paper: Dual-Path TFC-TDF UNet for Music Source Separation (github.com)

环境配置:

首先git clone https://github.com/junyuchen-cjy/DTTNet-Pytorch.git

然后根据readme的指示,

conda env create -f conda_env_gpu.yaml -n DTT
source /root/miniconda3/etc/profile.d/conda.sh#这句应该不需要的。GPT告诉我:如果你的终端已经正确配置了Conda初始化脚本,并且能够直接使用conda命令,那么可以不需要手动执行这条命令。否则,在特定情况下,手动加载是必要的。而且这句的路径是错误的,我的机器上miniconda3不装在这个地方。
conda activate DTT
pip install -r requirements.txt
export PYTHONPATH=$PYTHONPATH:$(pwd) # for Windows, replace the 'export' with 'set'
#将当前工作目录添加到PYTHONPATH环境变量中,通常用于确保Python解释器能找到并导入当前目录中的模块(但应该只是临时有效的)

Edit .env file according to the instructions. It is recommended to use wandb to manage the logs.

cp .env.example .env
vim .env

下面是我修改之后的.env文件

# the folder of musdb18hq dataset, contains train and test folders
data_dir=/data1/icassp2024/cadenza_data/cad1/task1/audio/musdb18hq/

PROJECT_ROOT=/home/wujunyu/DTTNet-Pytorch/

# the directory where the checkpoints will be saved
LOG_DIR=/home/wujunyu/DTTNet-Pytorch/check_points

# You don't have to fill this if you want to use tensorboard only.
wandb_api_key=这边不放出来 # go wandb.ai/settings and copy your key

# Number of cores of your cpu, will be used in dataloaders
NUM_WORKERS=32

HYDRA_FULL_ERROR=1

(PROJECT_ROOT的作用是跑模型推理时结果存在PROJECT_ROOT\infer\songname_suffix\

wandb_api_key:这边不放出来(去wandb的官网上注册一个号就有了,我的用户名叫idoitgoose,是和我的github捆绑的)

这里就配完了,以后只需要conda activate DTT即可。

模型推理Inference(即用模型处理音频)

首先根据readme里提供的链接去百度网盘下载了dtt_ckpts文件夹(里面装着4个.ckpt文件,其实就是4种训练好的模型的checkpoint,里面存好了参数和其他一些信息),然后把这个文件夹放到机器的这个模型的目录DTTNet-Pytorch/下面

python run_infer.py model=vocals ckpt_path="/home/wujunyu/DTTNet-Pytorch/dtt_ckpts/vocalsg32_ep4082.ckpt" mixture_path="/data1/icassp2024/cadenza_data/cad1/task1/audio/musdb18hq/test/Al James - Schoolboy Facination/mixture.wav"

评价Evaluation

先设置一下 pool_workers in configs\evaluation,可以设置为CPU核数

export ckpt_path="/home/wujunyu/DTTNet-Pytorch/dtt_ckpts/vocalsg32_ep4082.ckpt" 
####上面这个是作者提供的训练好的参数

python run_eval.py model=vocals logger.wandb.name=xxxx
###注意这个xxxx应替换为一个实际的名称(帮助你识别和管理不同的训练或评估运行)

# or if you don't want to use logger
python run_eval.py model=vocals logger=[]

评价自己训的模型时:export ckpt_path="/home/wujunyu/DTTNet-Pytorch/check_points/vocals_vocals_g32_5/checkpoints/epoch=107-step=21924.ckpt"

训练train

Note that you will need:

  • 1 TB disk space for data augmentation.

    • Otherwise, edit

      configs/datamodule/musdb18_hq.yaml
      

      so that:

      • aug_params=[]. This will train the model without data augmentation.(其实这边没写清楚,应该改成两个0
  • 2 A40 (48GB). Or equivalently, 4 RTX 3090 (24 GB).

    • Otherwise, edit

      configs/experiment/vocals_dis.yaml
      

      so that:

      • datamodule.batch_size is smaller
      • trainer.devices:1
      • model.bn_norm: BN
      • deletetrainer.sync_batchnorm
  1. Data Partition

    原来只有train和test,现在把train分成两部分(train和validation)。validation用于在训练的时候去验证。

python demos/split_dataset.py # data partition
  1. Data Augmentation (Optional)
# install aug tools
sudo apt-get update
sudo apt-get install soundstretch

mkdir /data1/icassp2024/cadenza_data/cad1/task1/audio/tmp/

# perform augumentation
python src/utils/data_augmentation.py --data_dir /data1/icassp2024/cadenza_data/cad1/task1/audio/musdb18hq/

注意:这段指令已经修改好了,readme里面原本给的是错的(那些路径都不对),还有data_augmentation.py的第69,70行的路径也要修改

效果就是保持原本的train文件夹不变之外,新建了许多文件夹,里面存放经过data argmentation(数据增强)的各个歌曲的5个.wav文件(mix+4个)

但这个数据增强太慢了,我就没跑了(哪天晚上跑一下吧,后面也许用得到)

在这里插入图片描述

  1. Run code

    **首先要修改一下数据集的配置文件``configs/datamodule/musdb18_hq.yaml**

    我跑训练之前没跑data argumentation,所以需要修改configs/datamodule/musdb18_hq.yaml,里面的aug_params原本是

    aug_params:
      - 2   # maximum pitch shift in semitones (-x < shift param < x)
      - 20  # maximum time stretch percentage (-x < stretch param < x)
    

    要改成

    aug_params:
      - 0   # maximum pitch shift in semitones (-x < shift param < x)
      - 0  # maximum time stretch percentage (-x < stretch param < x)
    

    其实就是在src\datamodules\datasets\musdb.py文件里用到的

    max_pitch, max_tempo = aug_params
                for p in range(-max_pitch, max_pitch+1):
                    for t in range(-max_tempo, max_tempo+1, 10):
                        aug_split = split if p==t==0 else split + f'_p={p}_t={t}'
                        datasets.append(self.musdb_path.joinpath(aug_split))
                        metadata_caches.append(self.musdb_path.joinpath('metadata').joinpath(aug_split + '.pkl'))
    

    不改的话,会加载train_p=-1_t=-10之类的文件(需要先跑data argumentation才有啊)

    然后要修改一下训练时的批次大小和GPU数量

    就是修改configs/experiment/vocals_dis.yaml里的

    1. trainer.devices由2改成4(因为你有4块GPU)
    2. datamodule.batch_size由8改成4(之前8的时候会CUDA out of memory)

    接下来就可以跑训练了

    python train.py experiment=vocals_dis datamodule=musdb_dev14 trainer=default
    
    # or if you don't want to use logger(我用的是上面的)
    
    python train.py experiment=vocals_dis datamodule=musdb_dev14 trainer=default logger=[]
    

    The 5 best models will be saved under LOG_DIR\dtt_vocals_suffix\checkpoints

    如果训了一段时间后主动结束,后面又想接着上次训练继续,怎么办?

    可以修改DTTNet-Pytorch/configs/experiment/vocals_dis.yaml中的trainer部分配置

    trainer:
      devices: 4 # int or list
      sync_batchnorm: True
      track_grad_norm: 2
      ################################加上下面这行,就可以接着训啦
      resume_from_checkpoint: /home/wujunyu/DTTNet-Pytorch/check_points/vocals_vocals_g32_5/checkpoints/last.ckpt
    

    对应到src\train.py中的这段代码:

    if "resume_from_checkpoint" in cfg.trainer:
            ckpt_path = cfg.trainer.resume_from_checkpoint
            print("ckpt_path:",ckpt_path)
            print(type(ckpt_path))
            # get the parent directory of the checkpoint path
            log_dir = os.path.dirname(os.path.dirname(ckpt_path))
            tensorboard_dir = os.path.join(log_dir, "tensorboard")
            if os.path.exists(tensorboard_dir):
                # copy tensorboard dir to the parent directory of the checkpoint path
                # HydraConfig.get().run.dir returns new dir so do not use it! (now fixed)
                shutil.copytree(tensorboard_dir,os.path.join(os.getcwd(),"tensorboard"))
    
            wandb_dir = os.path.join(log_dir, "wandb")
            if os.path.exists(wandb_dir):
                shutil.copytree(wandb_dir,os.path.join(os.getcwd(),"wandb"))
    
  2. Pick the best model

# edit api_key and path
python src/utils/pick_best.py

Bespoke Fine-tune

git checkout bespoke

关于训练的补充说明

这个训练太慢了,训一个模型要一周(总共4个模型),我考虑了先训一天看看效果的方法。

  1. 作者提供的训练4082个epoch的模型(有data_argumentation)

    在这里插入图片描述

  2. 我自己训练的500多个epoch的模型(这500多轮里的最优模型)(无data_argumentation)

    在这里插入图片描述

  3. 我自己训练的100多个epoch的模型(这100多轮里的最优模型)(无data_argumentation)

    在这里插入图片描述

由此大概可估计效最终果

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值