Skip to content

Cлайсинг в smpo трейнере #13

@porfirythelaw

Description

@porfirythelaw

if special_token_id is not None:
special_token_mask = (labels == special_token_id) & loss_mask
per_token_logps[special_token_mask][chosen_count:] = -per_token_logps[
special_token_mask
][chosen_count:]

Вот в этом куске слайсинг, похоже, работает не так как ожидается - вместо special токенов из rejected сэмплов он выбирает special токены из всего батча начиная с chosen_count.

Когда тензор per_token_logps индексируется булевой маской special_token_mask, то в результате получается 1д тензор, и размерность батча теряется.

per_token_logps shape: torch.Size([4, 972]) # (B, seq)
special_token_mask shape: torch.Size([4, 972]) # (B, seq)
per_token_logps[special_token_mask] shape: torch.Size([8]) # 1д тензор всех special токенов из всего батча
per_token_logps[special_token_mask][chosen_count:] shape: torch.Size([6]) # берём из 1д тензора все токены начиная с chosen_count

Чтобы взять special токены из rejected сэмплов, можно написать, например, так:

rejected_logps = per_token_logps[chosen_count:]     # (B, seq)

loss_mask = labels != label_pad_token_id
rejected_mask = loss_mask[chosen_count:]
special_mask_rej = (labels[chosen_count:] == special_token_id) & rejected_mask

rejected_logps[special_mask_rej] = -rejected_logps[special_mask_rej]

Эта же проблема, соответственно, и в других местах, где проводится похожий слайсинг:

# Winsorize extremal values for rejected tokens

# Winsorize extremal values for chosen tokens

# Clip minimum logprob for rejected tokens

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions