sophia / decoder_full.py
Arain119
Sophia 1.0.0 — 1B K3-hybrid Chinese chat model (HF remote-code export + native package)
d53adc9
Raw History Blame
5.29 kB
# Generated by ml.integrations.export.runtime_packager.write_remote_code_bundle.
# Exported for HuggingFace trust_remote_code loading.
# This file is intentionally self-contained.
from __future__ import annotations
import torch
from .input_mask import is_all_ones_mask, slice_valid_tokens
from .decoder_types import DecoderConfig, DecoderCoreModel
from .decoder_loss import (
loss_stats,
mean_cross_entropy_loss,
)
from .decoder_loss_forward import forward_loss
def validate_decoder_inputs(
*,
input_ids: torch.Tensor | None,
labels: torch.Tensor | None,
compute_loss: bool,
) -> torch.Tensor:
if input_ids is None:
raise ValueError("input_ids is required")
if input_ids.dim() != 2:
raise ValueError("input_ids must be [B,T]")
if bool(compute_loss) and labels is None:
raise ValueError("compute_loss=True requires labels")
return input_ids
def forward_full_with_mask(
*,
runtime_model: DecoderCoreModel,
vocab_size: int,
input_ids: torch.Tensor,
attention_mask: torch.Tensor | None,
output_weight: torch.Tensor,
) -> torch.Tensor:
if attention_mask is None or is_all_ones_mask(attention_mask):
return runtime_model.forward_full(input_ids)
rows = slice_valid_tokens(input_ids, attention_mask)
logits = output_weight.new_zeros(
(int(input_ids.size(0)), int(input_ids.size(1)), int(vocab_size))
)
for batch_index, (start, end, row_tokens) in enumerate(rows):
row_logits = runtime_model.forward_full(row_tokens)
logits[batch_index, start:end] = row_logits[0]
return logits
def masked_loss(
*,
runtime_model: DecoderCoreModel,
config: DecoderConfig,
input_ids: torch.Tensor,
attention_mask: torch.Tensor,
labels: torch.Tensor,
vocab_size: int,
output_weight: torch.Tensor,
) -> tuple[torch.Tensor, torch.Tensor]:
rows = slice_valid_tokens(input_ids, attention_mask)
logits = output_weight.new_zeros(
(int(input_ids.size(0)), int(input_ids.size(1)), int(vocab_size))
)
loss_sum = output_weight.new_zeros(())
count = output_weight.new_zeros(())
for batch_index, (start, end, row_tokens) in enumerate(rows):
row_labels = labels[batch_index : batch_index + 1, start:end]
row_logits = runtime_model.forward_full(row_tokens)
logits[batch_index, start:end] = row_logits[0]
row_sum, row_count = loss_stats(row_logits, row_labels, label_offset=0)
loss_sum = loss_sum + row_sum
count = count + row_count
loss = torch.where(
count > 0,
loss_sum / count.clamp_min(1.0),
output_weight.new_zeros(()),
)
return logits, loss
def forward_decoder_full(
*,
runtime_model: DecoderCoreModel,
config: DecoderConfig,
training: bool,
input_ids: torch.Tensor,
attention_mask: torch.Tensor | None,
labels: torch.Tensor | None,
compute_loss: bool,
output_weight: torch.Tensor,
) -> tuple[torch.Tensor | None, torch.Tensor | None]:
if bool(compute_loss):
loss = forward_loss(
runtime_model=runtime_model,
config=config,
training=bool(training),
input_ids=input_ids,
attention_mask=attention_mask,
labels=labels,
output_weight=output_weight,
)
return loss, None
loss, logits = forward_full(
runtime_model=runtime_model,
config=config,
training=bool(training),
input_ids=input_ids,
attention_mask=attention_mask,
labels=labels,
)
if labels is not None and bool(training) and not bool(config.return_logits_in_train):
logits = None
return loss, logits
def forward_full(
*,
runtime_model: DecoderCoreModel,
config: DecoderConfig,
training: bool,
input_ids: torch.Tensor,
attention_mask: torch.Tensor | None,
labels: torch.Tensor | None,
) -> tuple[torch.Tensor | None, torch.Tensor | None]:
del training
if labels is not None:
if attention_mask is not None and not is_all_ones_mask(attention_mask):
logits, loss = masked_loss(
runtime_model=runtime_model,
config=config,
input_ids=input_ids,
attention_mask=attention_mask,
labels=labels,
vocab_size=int(getattr(config, "vocab_size", 0)),
output_weight=runtime_model.output.weight,
)
return loss, logits
logits = forward_full_with_mask(
runtime_model=runtime_model,
vocab_size=int(config.vocab_size),
input_ids=input_ids,
attention_mask=attention_mask,
output_weight=runtime_model.output.weight,
)
return mean_cross_entropy_loss(logits, labels, label_offset=0), logits
logits = forward_full_with_mask(
runtime_model=runtime_model,
vocab_size=int(config.vocab_size),
input_ids=input_ids,
attention_mask=attention_mask,
output_weight=runtime_model.output.weight,
)
return None, logits
__all__ = [
"forward_full_with_mask",
"forward_decoder_full",
"forward_full",
"masked_loss",
"validate_decoder_inputs",
]