Я использую CoDi, который представляет собой мультимодальную модель скрытой диффузии. Я пытаюсь удалить модули изображений и видео из CoDi и точно настроить его с помощью данных пары текст-музыка.
Сценарий обучения (
Traceback (most recent call last):
File "", line 1, in
File "/home/m236866/.conda/envs/codi/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/home/m236866/.conda/envs/codi/lib/python3.8/multiprocessing/spawn.py", line 126, in _main
self = reduction.pickle.load(from_parent)
File "/home/m236866/.conda/envs/codi/lib/python3.8/site-packages/torch/nn/parallel/distributed.py", line 780, in __setstate__
self.process_group = _get_default_group()
File "/home/m236866/.conda/envs/codi/lib/python3.8/site-packages/torch/distributed/distributed_c10d.py", line 429, in _get_default_group
raise RuntimeError(
RuntimeError: Default process group has not been initialized, please make sure to call init_process_group.
Я использую CoDi, который представляет собой мультимодальную модель скрытой диффузии. Я пытаюсь удалить модули изображений и видео из CoDi и точно настроить его с помощью данных пары текст-музыка. Сценарий обучения ([code]train.py[/code]) для создания музыки из текстовой подсказки выглядит следующим образом: [code]import torch import torchaudio import yaml import matplotlib.pyplot as plt import numpy as np import os import pandas as pd import random from torch.utils.data import Dataset, DataLoader from core.models import codi from core.models.ema import LitEma from core.models.common.get_optimizer import get_optimizer from argparse import ArgumentParser import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP from torch.utils.data.distributed import DistributedSampler from core.models.common.get_model import get_model import warnings warnings.filterwarnings('ignore') import torch.multiprocessing as mp
def load_yaml_config(filepath): with open(filepath, 'r') as file: return yaml.safe_load(file)
class ConfigObject(object): def __init__(self, dictionary): for key in dictionary: setattr(self, key, dictionary[key])
def collate_fn(batch): texts, audios = zip(*batch) # 最大のオーディオ長を見つける max_length = max(audio.shape[1] for audio in audios) # パディング audios_padded = torch.stack([torch.nn.functional.pad(audio, (0, max_length - audio.shape[1])) for audio in audios]) texts = torch.stack(texts) return texts, audios_padded
sample_rate = 48000
### Model Define===============================================================
def model_define(x, c):
if x == "audio" and c == "text": # AudioLDM audioldm_cfg = load_yaml_config('configs/model/audioldm.yaml') audioldm = ConfigObject(audioldm_cfg["audioldm_autoencoder"])
# Dataset============================================================= class MusicCaps(Dataset): def __init__(self, csv_file, audio_dir, model, x, c, transform=None): self.audio_dir = audio_dir self.transform = transform self.data = [] self.model = model self.x = x self.c = c
all_data = pd.read_csv(csv_file)
# Checks for the existence of audio files and adds only those data that exist to the list for idx, row in all_data.iterrows(): audio_path = os.path.join(self.audio_dir, f"{row['ytid']}.wav") if os.path.exists(audio_path): self.data.append(row)
def __len__(self): return len(self.data)
def __getitem__(self, idx): row = self.data[idx] caption = row['caption'] # raw text audio_path = os.path.join(self.audio_dir, f"{row['ytid']}.wav") waveform = torchaudio.load(audio_path) # raw audio(Tensor)
if self.x == "audio" and self.c == "text": mel_latent = self.model.module.audioldm_encode(waveform[0]).detach() # transform mel-spectrogram(Tensor) into latent space text_emb = self.model.module.clip_encode_text([caption]).detach() return mel_latent, text_emb # data, condition elif self.x == "text" and self.c == "audio": text_latent = self.model.module.optimus_encode([caption]).detach() audio_emb = self.model.module.clap_encode_audio(waveform[0]).detach() return text_latent, audio_emb # data, condition
parser = ArgumentParser('DDP usage example') parser.add_argument('--local_rank', type=int, default=-1, metavar='N', help='Local process rank.') # you need this argument in your scripts for DDP to work args = parser.parse_args()
args.is_master = args.local_rank == 0 x = os.environ['XTYPE'] c = os.environ['CTYPE']
python -m torch.distributed.launch --nproc_per_node=$NUM_GPUS_PER_NODE --nnodes=$NUM_NODES --node_rank $NODE_RANK train.py [/code] Когда я выполняю это, я получаю следующую ошибку (повторяется в командной строке): [code]Traceback (most recent call last): File "", line 1, in File "/home/m236866/.conda/envs/codi/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main exitcode = _main(fd, parent_sentinel) File "/home/m236866/.conda/envs/codi/lib/python3.8/multiprocessing/spawn.py", line 126, in _main self = reduction.pickle.load(from_parent) File "/home/m236866/.conda/envs/codi/lib/python3.8/site-packages/torch/nn/parallel/distributed.py", line 780, in __setstate__ self.process_group = _get_default_group() File "/home/m236866/.conda/envs/codi/lib/python3.8/site-packages/torch/distributed/distributed_c10d.py", line 429, in _get_default_group raise RuntimeError( RuntimeError: Default process group has not been initialized, please make sure to call init_process_group. [/code] [b]Окружающая среда[/b] [code]OS: Ubuntu 18.04.6 Python: 3.8.18 Torch Version : 1.12.1+cu116 GPU Name: Tesla V100-SXM3-32GB [/code] Установлено со ссылкой на репозиторий CoDi: [code]conda create -n CoDi python=3.8 # prepare an environment
pip install torch==1.12.1+cu116 torchaudio==0.12.1+cu116 torchvision==0.13.1+cu116 \ -f https://download.pytorch.org/whl/torch_stable.html # change cuda version higher pytorch version is doable
pip install -r requirement.txt [/code] Я хотел бы устранить указанную выше ошибку, чтобы распределенное обучение можно было выполнять с использованием DDP. Ссылки: [list] [*]Мой репозиторий кода: https://github.com/NakataKoo/music-text-multimodal-diffusion/tree/no-image-video2