forked from mrq/DL-Art-School
Checkin
This commit is contained in:
parent
3cb14123bc
commit
cc74a43675
codes
models/audio
trainer
|
@ -609,7 +609,6 @@ def test_vqvae_model():
|
||||||
o = model(clip, ts, cond)
|
o = model(clip, ts, cond)
|
||||||
pg = model.get_grad_norm_parameter_groups()
|
pg = model.get_grad_norm_parameter_groups()
|
||||||
|
|
||||||
"""
|
|
||||||
with torch.no_grad():
|
with torch.no_grad():
|
||||||
proj = torch.randn(2, 100, 512).cuda()
|
proj = torch.randn(2, 100, 512).cuda()
|
||||||
clip = clip.cuda()
|
clip = clip.cuda()
|
||||||
|
@ -618,10 +617,9 @@ def test_vqvae_model():
|
||||||
model = model.cuda().eval()
|
model = model.cuda().eval()
|
||||||
model.diff.enable_fp16 = True
|
model.diff.enable_fp16 = True
|
||||||
ti = model.diff.timestep_independent(proj, clip.shape[2])
|
ti = model.diff.timestep_independent(proj, clip.shape[2])
|
||||||
for k in range(100):
|
for k in range(1000):
|
||||||
model.diff(clip, ts, precomputed_code_embeddings=ti)
|
model.diff(clip, ts, precomputed_code_embeddings=ti)
|
||||||
print(f"Elapsed: {time()-start}")
|
print(f"Elapsed: {time()-start}")
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def test_multi_vqvae_model():
|
def test_multi_vqvae_model():
|
||||||
|
@ -690,4 +688,5 @@ def extract_diff(in_f, out_f, remove_head=False):
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
#extract_diff('X:\\dlas\\experiments\\train_music_diffusion_tfd12\\models\\41000_generator_ema.pth', 'extracted_diff.pth', True)
|
#extract_diff('X:\\dlas\\experiments\\train_music_diffusion_tfd12\\models\\41000_generator_ema.pth', 'extracted_diff.pth', True)
|
||||||
#test_cheater_model()
|
#test_cheater_model()
|
||||||
extract_diff('X:\\dlas\experiments\\train_music_diffusion_tfd_cheater_from_scratch\\models\\56500_generator_ema.pth', 'extracted.pth', remove_head=True)
|
test_vqvae_model()
|
||||||
|
#extract_diff('X:\\dlas\experiments\\train_music_diffusion_tfd_cheater_from_scratch\\models\\56500_generator_ema.pth', 'extracted.pth', remove_head=True)
|
||||||
|
|
|
@ -19,8 +19,8 @@ class SubBlock(nn.Module):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.dropout = nn.Dropout(p=dropout)
|
self.dropout = nn.Dropout(p=dropout)
|
||||||
self.attn = AttentionBlock(inp_dim, out_channels=contraction_dim, num_heads=heads)
|
self.attn = AttentionBlock(inp_dim, out_channels=contraction_dim, num_heads=heads)
|
||||||
self.register_buffer('mask', build_local_attention_mask(n=4000, l=64), persistent=False)
|
self.register_buffer('mask', build_local_attention_mask(n=6000, l=64), persistent=False)
|
||||||
self.pos_bias = RelativeQKBias(l=64)
|
self.pos_bias = RelativeQKBias(l=64, max_positions=6000)
|
||||||
ff_contract = contraction_dim//2
|
ff_contract = contraction_dim//2
|
||||||
self.ff1 = nn.Sequential(nn.Conv1d(inp_dim+contraction_dim, ff_contract, kernel_size=1),
|
self.ff1 = nn.Sequential(nn.Conv1d(inp_dim+contraction_dim, ff_contract, kernel_size=1),
|
||||||
nn.GroupNorm(8, ff_contract),
|
nn.GroupNorm(8, ff_contract),
|
||||||
|
|
|
@ -7,7 +7,8 @@ import torch.nn.functional as F
|
||||||
from torch import autocast
|
from torch import autocast
|
||||||
|
|
||||||
from models.diffusion.nn import timestep_embedding, normalization, zero_module, conv_nd, linear
|
from models.diffusion.nn import timestep_embedding, normalization, zero_module, conv_nd, linear
|
||||||
from models.diffusion.unet_diffusion import AttentionBlock, TimestepEmbedSequential, TimestepBlock
|
from models.diffusion.unet_diffusion import TimestepEmbedSequential, TimestepBlock, QKVAttentionLegacy
|
||||||
|
from models.lucidrains.x_transformers import RelativePositionBias
|
||||||
from trainer.networks import register_model
|
from trainer.networks import register_model
|
||||||
from utils.util import checkpoint
|
from utils.util import checkpoint
|
||||||
|
|
||||||
|
@ -19,6 +20,52 @@ def is_sequence(t):
|
||||||
return t.dtype == torch.long
|
return t.dtype == torch.long
|
||||||
|
|
||||||
|
|
||||||
|
class AttentionBlock(nn.Module):
|
||||||
|
"""
|
||||||
|
An attention block that allows spatial positions to attend to each other.
|
||||||
|
|
||||||
|
Originally ported from here, but adapted to the N-d case.
|
||||||
|
https://github.com/hojonathanho/diffusion/blob/1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/models/unet.py#L66.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
channels,
|
||||||
|
num_heads=1,
|
||||||
|
num_head_channels=-1,
|
||||||
|
do_checkpoint=True,
|
||||||
|
relative_pos_embeddings=False,
|
||||||
|
):
|
||||||
|
super().__init__()
|
||||||
|
self.channels = channels
|
||||||
|
self.do_checkpoint = do_checkpoint
|
||||||
|
if num_head_channels == -1:
|
||||||
|
self.num_heads = num_heads
|
||||||
|
else:
|
||||||
|
assert (
|
||||||
|
channels % num_head_channels == 0
|
||||||
|
), f"q,k,v channels {channels} is not divisible by num_head_channels {num_head_channels}"
|
||||||
|
self.num_heads = channels // num_head_channels
|
||||||
|
self.norm = normalization(channels)
|
||||||
|
self.qkv = nn.Conv1d(channels, channels * 3, 1)
|
||||||
|
# split heads before split qkv
|
||||||
|
self.attention = QKVAttentionLegacy(self.num_heads)
|
||||||
|
|
||||||
|
self.proj_out = zero_module(nn.Conv1d(channels, channels, 1))
|
||||||
|
if relative_pos_embeddings:
|
||||||
|
self.relative_pos_embeddings = RelativePositionBias(scale=(channels // self.num_heads) ** .5, causal=False, heads=num_heads, num_buckets=32, max_distance=64)
|
||||||
|
else:
|
||||||
|
self.relative_pos_embeddings = None
|
||||||
|
|
||||||
|
def forward(self, x, mask=None):
|
||||||
|
b, c, *spatial = x.shape
|
||||||
|
x = x.reshape(b, c, -1)
|
||||||
|
qkv = self.qkv(self.norm(x))
|
||||||
|
h = self.attention(qkv, mask, self.relative_pos_embeddings)
|
||||||
|
h = self.proj_out(h)
|
||||||
|
return (x + h).reshape(b, c, *spatial)
|
||||||
|
|
||||||
|
|
||||||
class ResBlock(TimestepBlock):
|
class ResBlock(TimestepBlock):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
@ -336,7 +383,7 @@ if __name__ == '__main__':
|
||||||
start = time()
|
start = time()
|
||||||
model = model.cuda().eval()
|
model = model.cuda().eval()
|
||||||
ti = model.timestep_independent(proj, clip, clip.shape[2], False)
|
ti = model.timestep_independent(proj, clip, clip.shape[2], False)
|
||||||
for k in range(100):
|
for k in range(1000):
|
||||||
model(clip, ts, precomputed_aligned_embeddings=ti)
|
model(clip, ts, precomputed_aligned_embeddings=ti)
|
||||||
print(f"Elapsed: {time()-start}")
|
print(f"Elapsed: {time()-start}")
|
||||||
|
|
||||||
|
|
|
@ -137,8 +137,8 @@ class MusicDiffusionFid(evaluator.Evaluator):
|
||||||
# s = q9.clamp(1, 9999999999)
|
# s = q9.clamp(1, 9999999999)
|
||||||
# x = x.clamp(-s, s) / s
|
# x = x.clamp(-s, s) / s
|
||||||
# return x
|
# return x
|
||||||
perp = self.diffuser.p_sample_loop_for_log_perplexity(self.model, mel_norm,
|
#perp = self.diffuser.p_sample_loop_for_log_perplexity(self.model, mel_norm,
|
||||||
model_kwargs = {'truth_mel': mel_norm})
|
# model_kwargs = {'truth_mel': mel_norm})
|
||||||
|
|
||||||
sampler = self.diffuser.ddim_sample_loop if self.ddim else self.diffuser.p_sample_loop
|
sampler = self.diffuser.ddim_sample_loop if self.ddim else self.diffuser.p_sample_loop
|
||||||
gen_mel = sampler(self.model, mel_norm.shape, model_kwargs={'truth_mel': mel_norm})
|
gen_mel = sampler(self.model, mel_norm.shape, model_kwargs={'truth_mel': mel_norm})
|
||||||
|
@ -155,7 +155,7 @@ class MusicDiffusionFid(evaluator.Evaluator):
|
||||||
model_kwargs={'codes': mel})
|
model_kwargs={'codes': mel})
|
||||||
real_wav = pixel_shuffle_1d(real_wav, 16)
|
real_wav = pixel_shuffle_1d(real_wav, 16)
|
||||||
|
|
||||||
return gen_wav, real_wav.squeeze(0), gen_mel, mel_norm, sample_rate, perp
|
return gen_wav, real_wav.squeeze(0), gen_mel, mel_norm, sample_rate, torch.tensor([0])
|
||||||
|
|
||||||
def perform_reconstruction_from_cheater_gen(self, audio, sample_rate=22050):
|
def perform_reconstruction_from_cheater_gen(self, audio, sample_rate=22050):
|
||||||
audio = audio.unsqueeze(0)
|
audio = audio.unsqueeze(0)
|
||||||
|
@ -303,7 +303,7 @@ class MusicDiffusionFid(evaluator.Evaluator):
|
||||||
gen_projections = torch.stack(gen_projections, dim=0)
|
gen_projections = torch.stack(gen_projections, dim=0)
|
||||||
real_projections = torch.stack(real_projections, dim=0)
|
real_projections = torch.stack(real_projections, dim=0)
|
||||||
frechet_distance = torch.tensor(self.compute_frechet_distance(gen_projections, real_projections), device=self.env['device'])
|
frechet_distance = torch.tensor(self.compute_frechet_distance(gen_projections, real_projections), device=self.env['device'])
|
||||||
perplexity = torch.stack(perplexities, dim=0).mean()
|
perplexity = torch.stack(perplexities, dim=0).float().mean()
|
||||||
|
|
||||||
if distributed.is_initialized() and distributed.get_world_size() > 1:
|
if distributed.is_initialized() and distributed.get_world_size() > 1:
|
||||||
distributed.all_reduce(frechet_distance)
|
distributed.all_reduce(frechet_distance)
|
||||||
|
@ -338,16 +338,17 @@ if __name__ == '__main__':
|
||||||
# For TFD+cheater trainer
|
# For TFD+cheater trainer
|
||||||
diffusion = load_model_from_config('X:\\dlas\\experiments\\train_music_diffusion_tfd_and_cheater.yml', 'generator',
|
diffusion = load_model_from_config('X:\\dlas\\experiments\\train_music_diffusion_tfd_and_cheater.yml', 'generator',
|
||||||
also_load_savepoint=False, strict_load=False,
|
also_load_savepoint=False, strict_load=False,
|
||||||
load_path='X:\\dlas\\experiments\\train_music_diffusion_tfd14_and_cheater_g2\\models\\120000_generator_ema.pth'
|
load_path='X:\\dlas\\experiments\\tfd14_and_cheater.pth'
|
||||||
).cuda()
|
).cuda()
|
||||||
opt_eval = {'path': 'Y:\\split\\yt-music-eval', # eval music, mostly electronica. :)
|
opt_eval = {#'path': 'Y:\\split\\yt-music-eval', # eval music, mostly electronica. :)
|
||||||
#'path': 'E:\\music_eval', # this is music from the training dataset, including a lot more variety.
|
#'path': 'E:\\music_eval', # this is music from the training dataset, including a lot more variety.
|
||||||
|
'path': 'Y:\\separated\\tfd14_test',
|
||||||
'diffusion_steps': 256,
|
'diffusion_steps': 256,
|
||||||
'conditioning_free': False, 'conditioning_free_k': 1, 'use_ddim': False, 'clip_audio': True,
|
'conditioning_free': True, 'conditioning_free_k': 1, 'use_ddim': False, 'clip_audio': True,
|
||||||
'diffusion_schedule': 'cosine', 'diffusion_type': 'from_codes_quant',
|
'diffusion_schedule': 'cosine', 'diffusion_type': 'from_codes_quant',
|
||||||
}
|
}
|
||||||
|
|
||||||
env = {'rank': 0, 'base_path': 'D:\\tmp\\test_eval_music', 'step': 13, 'device': 'cuda', 'opt': {}}
|
env = {'rank': 0, 'base_path': 'D:\\tmp\\test_eval_music', 'step': 18, 'device': 'cuda', 'opt': {}}
|
||||||
eval = MusicDiffusionFid(diffusion, opt_eval, env)
|
eval = MusicDiffusionFid(diffusion, opt_eval, env)
|
||||||
fds = []
|
fds = []
|
||||||
for i in range(2):
|
for i in range(2):
|
||||||
|
|
|
@ -11,7 +11,7 @@ from utils.util import opt_get, load_model_from_config, pad_or_truncate
|
||||||
|
|
||||||
MEL_MIN = -11.512925148010254
|
MEL_MIN = -11.512925148010254
|
||||||
TACOTRON_MEL_MAX = 2.3143386840820312
|
TACOTRON_MEL_MAX = 2.3143386840820312
|
||||||
TORCH_MEL_MAX = 4.82
|
TORCH_MEL_MAX = 4.82 # FYI: this STILL isn't assertive enough...
|
||||||
|
|
||||||
def normalize_torch_mel(mel):
|
def normalize_torch_mel(mel):
|
||||||
return 2 * ((mel - MEL_MIN) / (TORCH_MEL_MAX - MEL_MIN)) - 1
|
return 2 * ((mel - MEL_MIN) / (TORCH_MEL_MAX - MEL_MIN)) - 1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user