[NPU]Fix run_lora_a_embedding out-of-vocab token produces wrong embedding. (#32031)
This commit is contained in:
@@ -21,6 +21,47 @@ class AscendLoRABackend(BaseLoRABackend):
|
|||||||
):
|
):
|
||||||
super().__init__(max_loras_per_batch, device)
|
super().__init__(max_loras_per_batch, device)
|
||||||
|
|
||||||
|
def run_lora_a_embedding(
|
||||||
|
self, input_ids, weights, vocab_size, extra_embeddings=None, *args, **kwargs
|
||||||
|
):
|
||||||
|
assert (
|
||||||
|
extra_embeddings is None
|
||||||
|
), "Ascend LoRA embedding backend does not support extra embeddings (added tokens)."
|
||||||
|
|
||||||
|
total_seq_len = input_ids.shape[0]
|
||||||
|
if weights.numel() == 0:
|
||||||
|
return torch.zeros(
|
||||||
|
total_seq_len, 0, device=input_ids.device, dtype=weights.dtype
|
||||||
|
)
|
||||||
|
|
||||||
|
num_loras, max_rank, vocab_size_w = weights.shape
|
||||||
|
clamped_ids = input_ids.clamp(0, vocab_size_w - 1).to(torch.int64)
|
||||||
|
token_lora_idx = torch.repeat_interleave(
|
||||||
|
self.batch_info.weight_indices.to(torch.int64),
|
||||||
|
self.batch_info.seg_lens,
|
||||||
|
output_size=total_seq_len,
|
||||||
|
)
|
||||||
|
|
||||||
|
rank_per_token = self.batch_info.lora_ranks[token_lora_idx]
|
||||||
|
scaling_per_token = self.batch_info.scalings[token_lora_idx]
|
||||||
|
rank_idx = torch.arange(max_rank, device=weights.device)
|
||||||
|
token_lora_idx_expanded = token_lora_idx.unsqueeze(1).expand(
|
||||||
|
total_seq_len, max_rank
|
||||||
|
)
|
||||||
|
rank_idx_expanded = rank_idx.unsqueeze(0).expand(total_seq_len, max_rank)
|
||||||
|
clamped_ids_expanded = clamped_ids.unsqueeze(1).expand(total_seq_len, max_rank)
|
||||||
|
|
||||||
|
result = weights[
|
||||||
|
token_lora_idx_expanded, rank_idx_expanded, clamped_ids_expanded
|
||||||
|
]
|
||||||
|
|
||||||
|
rank_mask = rank_idx.unsqueeze(0) < rank_per_token.unsqueeze(1)
|
||||||
|
result = result * rank_mask.to(result.dtype)
|
||||||
|
|
||||||
|
result = result * scaling_per_token.unsqueeze(1).to(result.dtype)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
def run_lora_a_sgemm(
|
def run_lora_a_sgemm(
|
||||||
self, x: torch.Tensor, weights: torch.Tensor, *args, **kwargs
|
self, x: torch.Tensor, weights: torch.Tensor, *args, **kwargs
|
||||||
) -> torch.Tensor:
|
) -> torch.Tensor:
|
||||||
|
|||||||
Reference in New Issue
Block a user