feat(sft): make only_unmask_final configurable in SFTConfig#2268
Open
Ai-chan-0411 wants to merge 1 commit intoNVIDIA-NeMo:mainfrom
Open
feat(sft): make only_unmask_final configurable in SFTConfig#2268Ai-chan-0411 wants to merge 1 commit intoNVIDIA-NeMo:mainfrom
Ai-chan-0411 wants to merge 1 commit intoNVIDIA-NeMo:mainfrom
Conversation
For multi-turn SFT tasks where only the final assistant response should be trained on, the only_unmask_final flag in add_loss_mask_to_message_log was not accessible through SFTConfig. Add only_unmask_final as a configurable boolean in SFTConfig and wire it through to both training and validation loss mask calls. Defaults to false to preserve existing behavior. Closes NVIDIA-NeMo#2219 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Context
While working on a multi-turn SFT setup, I noticed that
add_loss_mask_to_message_logalready supports anonly_unmask_finalparameter (which masks all messages except the last one), but there was no way to set it through the SFT configuration — it was hardcoded toFalseat both call sites insft.py.This came up when trying to train on only the final assistant response in a multi-turn conversation, which is a common pattern for instruction-following tasks where prior turns serve as context.
Changes
only_unmask_final: boolfield toSFTConfigTypedDictadd_loss_mask_to_message_login bothvalidate()andsft_train()only_unmask_final: falseto the basesft.yamlconfig (other configs inherit this default)The default is
false, so existing behavior is unchanged. Setting it totruecauses only the final message in each conversation to be unmasked for loss computation, regardless of role.Closes #2219