You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DataCollatorForLanguageModeling时mlm=True且batch_size>1触发RuntimeError

解决DataCollatorForLanguageModeling在mlm=True且batch_size>1时的RuntimeError

问题原因

报错RuntimeError: output with shape [3, 1, 32] doesn't match the broadcast shape [3, 3, 32]的核心原因是自定义的SmilesDataset返回的样本张量多了一个额外维度。

当mlm=True时,DataCollatorForLanguageModeling会生成掩码并对输入进行掩码替换,这个过程需要对批量张量做广播操作。如果每个样本的input_ids是二维张量(比如[1, 32]),批量拼接后会变成[3, 1, 32],而掩码操作需要的形状是[3, 32](对应批量中每个样本的序列),广播时就会出现维度不匹配问题。

而mlm=False时,collator仅做简单拼接和padding,不会触发掩码广播逻辑;batch_size=1时,[1,1,32]的形状不会引发广播冲突,所以能正常运行。

解决方案

检查并修改SmilesDataset的__getitem__方法,确保返回的input_ids、attention_mask等张量是一维的,而非二维。

错误示例(导致额外维度)

class SmilesDataset(Dataset):
    def __init__(self, data, tokenizer):
        self.data = data
        self.tokenizer = tokenizer
    
    def __getitem__(self, idx):
        text = self.data[idx]
        tokenized = self.tokenizer(text, padding='max_length', truncation=True, max_length=32)
        # 错误:用[]包裹生成了二维张量
        return {
            'input_ids': torch.tensor([tokenized['input_ids']]),
            'attention_mask': torch.tensor([tokenized['attention_mask']])
        }

修正后的代码

class SmilesDataset(Dataset):
    def __init__(self, data, tokenizer):
        self.data = data
        self.tokenizer = tokenizer
    
    def __getitem__(self, idx):
        text = self.data[idx]
        tokenized = self.tokenizer(text, padding='max_length', truncation=True, max_length=32)
        # 正确:直接转换为一维张量
        return {
            'input_ids': torch.tensor(tokenized['input_ids']),
            'attention_mask': torch.tensor(tokenized['attention_mask'])
        }

修改后,批量拼接后的input_ids形状会变成[3, 32],DataCollatorForLanguageModeling的掩码广播逻辑就能正常工作,不会再触发维度不匹配的错误。

内容的提问来源于stack exchange,提问作者AnonHymn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:07:13