DTT模型的下载和运行
环境配置:
首先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 smallertrainer.devices:1
model.bn_norm: BN
- delete
trainer.sync_batchnorm
-
-
Data Partition
原来只有train和test,现在把train分成两部分(train和validation)。validation用于在训练的时候去验证。
python demos/split_dataset.py # data partition
- 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个)
但这个数据增强太慢了,我就没跑了(哪天晚上跑一下吧,后面也许用得到)
-
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
里的trainer.devices
由2改成4(因为你有4块GPU)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"))
-
Pick the best model
# edit api_key and path
python src/utils/pick_best.py
Bespoke Fine-tune
git checkout bespoke
关于训练的补充说明
这个训练太慢了,训一个模型要一周(总共4个模型),我考虑了先训一天看看效果的方法。
-
作者提供的训练4082个epoch的模型(有data_argumentation)
-
我自己训练的500多个epoch的模型(这500多轮里的最优模型)(无data_argumentation)
-
我自己训练的100多个epoch的模型(这100多轮里的最优模型)(无data_argumentation)
由此大概可估计效最终果