初创Agent实习-训练加速(padding+compile+FP8+Adam_Fused)

初创Agent实习-训练加速(padding+compile+FP8+Adam_Fused)
训练加速PaddingcompileFP8adamw_torch_fused从以上四个方面加速:本文档解释stage1_nemotron_qwen_djh_deepspeed_dev_zch_v4_lqy.py中train()的整体流程、当前 padding 策略、torch.compile与动态 padding 的关系,以及这套思路能否迁移到 SoulGard-VL 训练。1. 当前 Padding 是怎么做的?结论:当前代码主要是静态 padding 到max_length。1.1_SFTDatasetBase的 paddingSFT 数据主要走_SFTDatasetBase.__getitem__():iflen(input_ids)self.max_length:continuepad_len=self.max_length-len(input_ids)input_ids=input_ids+[self.tokenizer.pad_token_id]*pad_len label_ids=label_ids+[-100]*pad_lenreturndict(input_ids=torch.tensor(input_ids,dtype=torch.long),labels=torch.tensor(label_ids,dtype=torch.long),)这表示:每条样本都被 pad 到固定长度max_length。padding 在右侧,因为input_ids + pad。padding token 的 label 是-100,所以 loss 不会计算 pad 部分。但是注意:函数没有返回attention_mask,因此模型前向时通常仍然会对 pad token 做计算。也就是说:loss 不算 pad,但是 forward 仍然可能算 pad。如果样本真实长度只有 700,而max_length=2048,那么大约 1348 个 token 都是 padding。它们不贡献 loss,但会占用 attention/MLP 计算。1.2MyselfDataset_CMB_sft的 padding另一个数据集MyselfDataset_CMB_sft也是静态 padding:pad_len=self.max_length-seq_lenifpad_len0:input_id=input_id[-self.max_length:]label_id=label_id[-self.max_length:]else:input_id=[self.tokenizer.pad_token_id]*pad_len+input_id label_id=[-100]*pad_len+label_id区别是它采用左 padding:[PAD] [PAD] [PAD] prompt answer1.3Stage1DatasetMMap的长度Stage1DatasetMMap读取.bin/.idx:self._mmap=self._mmap.reshape(self.num_chunks,self.max_length)这个数据本身就是固定 chunk 长度,所以也是静态长度。2. 静态 Padding 会不会造成无意义计算?会。静态 padding 的问题是所有样本都被拉到同一个长度:short sample: 700 tokens - pad to 2048 long sample: 1900 tokens - pad to 2048对于 Transformer,序列长度越长,attention 计算越重。粗略理解:attention compute ~ O(seq_len^2) MLP compute ~ O(seq_len)如果大量样本远短于max_length,静态 padding 会浪费计算、显存和时间。更严重的是当前数据集没有显式返回attention_mask。虽然 labels 中 pad 是-100,loss 不算 pad,但模型可能仍然把 pad token 当成有效输入参与 attention。3. 可以改成动态 padding=True 吗?可以,但不建议粗暴地只改成padding=True。推荐方式是:Dataset 返回变长 input_ids / labels DataCollator 在 batch 内动态 pad 到当前 batch 最长样本 最好再 pad_to_multiple_of=8/16/64 如果使用 torch.compile,最好做长度分桶 bucketing3.1 动态 padding 的基本 collator 示例fromtorch.nn.utils.rnnimportpad_sequenceimporttorchclassDynamicSFTCollator:def__init__(self,pad_token_id:int,pad_to_multiple_of:int|None=8):self.pad_token_id=pad_token_id self.pad_to_multiple_of=pad_to_multiple_ofdef_round_up(self,length:int)-int:ifnotself.pad_to_multiple_of:returnlength m=self.pad_to_multiple_ofreturn((length+m-1)//m)*mdef__call__(self,features)

最新新闻

日新闻

周新闻

月新闻