使用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
相关产品推荐
相关产品推荐

