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

使用Hugging Face Trainer时collate_fn接收到空数据报错

解决Hugging Face训练时"stack expects a non-empty TensorList"错误

这个错误的核心原因是你的collate_fn收到了空的样本列表,说明数据加载流程中没有成功获取到训练样本。以下是排查和解决的具体步骤:

1. 检查数据集是否有效加载

首先确认你的训练/验证数据集本身有样本,且加载逻辑正确:

  • 打印数据集长度,确认样本数大于0:
    print(f"训练集样本数: {len(train_dataset)}")
    print(f"验证集样本数: {len(eval_dataset)}")
    
  • 如果使用自定义Dataset类,检查__len__方法是否正确返回样本总数,__getitem__方法是否能正常返回包含input_ids、attention_mask、labels等模型所需字段的字典,没有返回空值或无效数据的情况。

2. 排查预处理/过滤逻辑问题

如果数据集本身有样本,但collate_fn仍收到空列表,大概率是预处理阶段过滤掉了所有样本:

  • 检查你用dataset.map()执行的预处理函数,确认没有触发错误的过滤条件(比如某些样本预处理后返回空字典,或者被remove_columns误删了关键字段)。
  • 可以在预处理后打印数据集的前几个样本,确认每个样本都包含有效数据:
    print(train_dataset[0])
    

3. 检查TrainingArguments与数据加载参数

  • 如果你设置的batch_size过大,且数据集剩余样本数不足一个batch,同时没有开启drop_last=True,可能会生成空batch。可以在TrainingArguments中添加drop_last=True来丢弃最后一个不完整的batch:
    training_args = TrainingArguments(
        # 其他参数...
        per_device_train_batch_size=8,
        drop_last=True
    )
    
  • 若使用了自定义采样器(比如RandomSampler),确认采样逻辑没有过滤掉所有样本,或者采样器的参数设置错误。

4. 验证数据集划分是否正确

如果是通过train_test_split划分数据集,检查划分比例是否合理,比如不要设置train_size=0或test_size=0这种极端值,导致某一分集没有样本:

dataset = dataset.train_test_split(train_size=0.8, test_size=0.2)
train_dataset = dataset["train"]
eval_dataset = dataset["test"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:07:18