微调LILT(LayoutLM)模型遇RuntimeError及IndexError求助
解决LILT(LayoutLM)微调时的CUDA/CPU运行错误
一、CUDA cublasLtMatmul执行失败 错误排查
- 检查CUDA版本与PyTorch、Transformers兼容性:用
torch.version.cuda和nvcc --version确认版本对齐,PyTorch 2.0+需搭配CUDA 11.7及以上,版本不匹配会引发算子执行异常。 - 降低batch size:当前batch size设为4,尝试降到2或1,避免显存隐性不足导致的矩阵乘法故障。
- 关闭混合精度训练:如果开启了
torch.cuda.amp,暂时禁用,排查是否是自动混合精度的数值精度问题触发cublas错误。 - 更新CUDA驱动与PyTorch:升级到对应PyTorch支持的稳定版驱动,重新安装适配CUDA的PyTorch包。
二、CPU下IndexError(索引越界) 错误排查
- 检查labels取值范围:LayoutLM token分类任务中,labels的每个值必须在
0到num_labels-1之间,或为-100(忽略标签)。遍历数据集确认是否存在超出分类数的索引,比如模型定义5类但labels出现5及以上数值。 - 核对tokenizer与模型一致性:确保使用
LiltTokenizer且与预训练模型vocab完全匹配,自定义tokenizer或修改vocab会导致input_ids出现模型未识别的索引,触发越界。 - 验证bbox取值:LILT要求bbox坐标为0-1000的整数,检查所有bbox元素是否在
[0,1000]区间内,超出范围会引发内部处理错误。 - 定位报错堆栈:捕获IndexError的完整堆栈信息,确定是embedding层(input_ids/bbox异常)还是分类头(labels异常)触发的问题。
三、通用排查方案
- 单条数据测试:从dataloader取出单条数据传入模型
forward方法,确认单条正常后再测试batch size=2,逐步定位是否为batch内数据异常。 - 检查预处理逻辑:验证截断/填充到512长度时,bbox填充值为
[0,0,0,0]、labels填充值为-100,填充值错误会导致模型处理异常。 - 对比官方示例:用Hugging Face官方LayoutLM token分类示例代码替换你的数据集,排查是否为自定义训练循环或数据加载逻辑的问题。
内容的提问来源于stack exchange,提问作者Arrais
相关产品推荐
相关产品推荐

