|
|
@ -8,6 +8,9 @@ from AR.models.utils import (
|
|
|
|
sample,
|
|
|
|
sample,
|
|
|
|
logits_to_probs,
|
|
|
|
logits_to_probs,
|
|
|
|
multinomial_sample_one_no_sync,
|
|
|
|
multinomial_sample_one_no_sync,
|
|
|
|
|
|
|
|
dpo_loss,
|
|
|
|
|
|
|
|
make_reject_y,
|
|
|
|
|
|
|
|
get_batch_logps
|
|
|
|
)
|
|
|
|
)
|
|
|
|
from AR.modules.embedding import SinePositionalEmbedding
|
|
|
|
from AR.modules.embedding import SinePositionalEmbedding
|
|
|
|
from AR.modules.embedding import TokenEmbedding
|
|
|
|
from AR.modules.embedding import TokenEmbedding
|
|
|
@ -85,11 +88,104 @@ class Text2SemanticDecoder(nn.Module):
|
|
|
|
ignore_index=self.EOS,
|
|
|
|
ignore_index=self.EOS,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_input_data(self, x, x_lens, y, y_lens, bert_feature):
|
|
|
|
|
|
|
|
x = self.ar_text_embedding(x)
|
|
|
|
|
|
|
|
x = x + self.bert_proj(bert_feature.transpose(1, 2))
|
|
|
|
|
|
|
|
x = self.ar_text_position(x)
|
|
|
|
|
|
|
|
x_mask = make_pad_mask(x_lens)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y_mask = make_pad_mask(y_lens)
|
|
|
|
|
|
|
|
y_mask_int = y_mask.type(torch.int64)
|
|
|
|
|
|
|
|
codes = y.type(torch.int64) * (1 - y_mask_int)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Training
|
|
|
|
|
|
|
|
# AR Decoder
|
|
|
|
|
|
|
|
y, targets = self.pad_y_eos(codes, y_mask_int, eos_id=self.EOS)
|
|
|
|
|
|
|
|
x_len = x_lens.max()
|
|
|
|
|
|
|
|
y_len = y_lens.max()
|
|
|
|
|
|
|
|
y_emb = self.ar_audio_embedding(y)
|
|
|
|
|
|
|
|
y_pos = self.ar_audio_position(y_emb)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xy_padding_mask = torch.concat([x_mask, y_mask], dim=1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ar_xy_padding_mask = xy_padding_mask
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x_attn_mask = F.pad(
|
|
|
|
|
|
|
|
torch.zeros((x_len, x_len), dtype=torch.bool, device=x.device),
|
|
|
|
|
|
|
|
(0, y_len),
|
|
|
|
|
|
|
|
value=True,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y_attn_mask = F.pad(
|
|
|
|
|
|
|
|
torch.triu(
|
|
|
|
|
|
|
|
torch.ones(y_len, y_len, dtype=torch.bool, device=x.device),
|
|
|
|
|
|
|
|
diagonal=1,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
(x_len, 0),
|
|
|
|
|
|
|
|
value=False,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xy_attn_mask = torch.concat([x_attn_mask, y_attn_mask], dim=0)
|
|
|
|
|
|
|
|
bsz, src_len = x.shape[0], x_len + y_len
|
|
|
|
|
|
|
|
_xy_padding_mask = (
|
|
|
|
|
|
|
|
ar_xy_padding_mask.view(bsz, 1, 1, src_len)
|
|
|
|
|
|
|
|
.expand(-1, self.num_head, -1, -1)
|
|
|
|
|
|
|
|
.reshape(bsz * self.num_head, 1, src_len)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
xy_attn_mask = xy_attn_mask.logical_or(_xy_padding_mask)
|
|
|
|
|
|
|
|
new_attn_mask = torch.zeros_like(xy_attn_mask, dtype=x.dtype)
|
|
|
|
|
|
|
|
new_attn_mask.masked_fill_(xy_attn_mask, float("-inf"))
|
|
|
|
|
|
|
|
xy_attn_mask = new_attn_mask
|
|
|
|
|
|
|
|
# x 和完整的 y 一次性输入模型
|
|
|
|
|
|
|
|
xy_pos = torch.concat([x, y_pos], dim=1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return xy_pos, xy_attn_mask, targets
|
|
|
|
|
|
|
|
|
|
|
|
def forward(self, x, x_lens, y, y_lens, bert_feature):
|
|
|
|
def forward(self, x, x_lens, y, y_lens, bert_feature):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
x: phoneme_ids
|
|
|
|
x: phoneme_ids
|
|
|
|
y: semantic_ids
|
|
|
|
y: semantic_ids
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reject_y, reject_y_lens = make_reject_y(y, y_lens)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xy_pos, xy_attn_mask, targets = self.make_input_data(x, x_lens, y, y_lens, bert_feature)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xy_dec, _ = self.h(
|
|
|
|
|
|
|
|
(xy_pos, None),
|
|
|
|
|
|
|
|
mask=xy_attn_mask,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
x_len = x_lens.max()
|
|
|
|
|
|
|
|
logits = self.ar_predict_layer(xy_dec[:, x_len:])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
###### DPO #############
|
|
|
|
|
|
|
|
reject_xy_pos, reject_xy_attn_mask, reject_targets = self.make_input_data(x, x_lens, reject_y, reject_y_lens, bert_feature)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reject_xy_dec, _ = self.h(
|
|
|
|
|
|
|
|
(reject_xy_pos, None),
|
|
|
|
|
|
|
|
mask=reject_xy_attn_mask,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
x_len = x_lens.max()
|
|
|
|
|
|
|
|
reject_logits = self.ar_predict_layer(reject_xy_dec[:, x_len:])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# loss
|
|
|
|
|
|
|
|
# from feiteng: 每次 duration 越多, 梯度更新也应该更多, 所以用 sum
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loss_1 = F.cross_entropy(logits.permute(0, 2, 1), targets, reduction="sum")
|
|
|
|
|
|
|
|
acc = self.ar_accuracy_metric(logits.permute(0, 2, 1).detach(), targets).item()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A_logits, R_logits = get_batch_logps(logits, reject_logits, targets, reject_targets)
|
|
|
|
|
|
|
|
loss_2, _, _ = dpo_loss(A_logits, R_logits, 0, 0, 0.2, reference_free=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loss = loss_1 + loss_2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return loss, acc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def forward_old(self, x, x_lens, y, y_lens, bert_feature):
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
x: phoneme_ids
|
|
|
|
|
|
|
|
y: semantic_ids
|
|
|
|
|
|
|
|
"""
|
|
|
|
x = self.ar_text_embedding(x)
|
|
|
|
x = self.ar_text_embedding(x)
|
|
|
|
x = x + self.bert_proj(bert_feature.transpose(1, 2))
|
|
|
|
x = x + self.bert_proj(bert_feature.transpose(1, 2))
|
|
|
|
x = self.ar_text_position(x)
|
|
|
|
x = self.ar_text_position(x)
|
|
|
@ -231,6 +327,7 @@ class Text2SemanticDecoder(nn.Module):
|
|
|
|
prompts, ####参考音频token
|
|
|
|
prompts, ####参考音频token
|
|
|
|
bert_feature,
|
|
|
|
bert_feature,
|
|
|
|
top_k: int = -100,
|
|
|
|
top_k: int = -100,
|
|
|
|
|
|
|
|
top_p: int = 100,
|
|
|
|
early_stop_num: int = -1,
|
|
|
|
early_stop_num: int = -1,
|
|
|
|
temperature: float = 1.0,
|
|
|
|
temperature: float = 1.0,
|
|
|
|
):
|
|
|
|
):
|
|
|
@ -305,7 +402,7 @@ class Text2SemanticDecoder(nn.Module):
|
|
|
|
if(idx==0):###第一次跑不能EOS否则没有了
|
|
|
|
if(idx==0):###第一次跑不能EOS否则没有了
|
|
|
|
logits = logits[:, :-1] ###刨除1024终止符号的概率
|
|
|
|
logits = logits[:, :-1] ###刨除1024终止符号的概率
|
|
|
|
samples = sample(
|
|
|
|
samples = sample(
|
|
|
|
logits[0], y, top_k=top_k, top_p=1.0, repetition_penalty=1.35
|
|
|
|
logits[0], y, top_k=top_k, top_p=top_p, repetition_penalty=1.05, temperature=temperature
|
|
|
|
)[0].unsqueeze(0)
|
|
|
|
)[0].unsqueeze(0)
|
|
|
|
if early_stop_num != -1 and (y.shape[1] - prefix_len) > early_stop_num:
|
|
|
|
if early_stop_num != -1 and (y.shape[1] - prefix_len) > early_stop_num:
|
|
|
|
print("use early stop num:", early_stop_num)
|
|
|
|
print("use early stop num:", early_stop_num)
|
|
|
|