💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》
被Hugging Face的DataCollatorForLanguageModeling坑惨,一小时解决真香
目录
昨晚写BERT微调脚本,跑着跑着直接报错:
RuntimeError: CUDA out of memory. Tried to allocate 500.00 MiB. GPU 0 has 10.73 GiB total.我当场石化。batch size才8,显存明明够用啊?查了N遍代码,最后发现是DataCollator的参数在作妖。
()
核心根源:
DataCollatorForLanguageModeling默认mlm=True(做掩码语言模型任务)。我误以为设mlm=False就能跳过掩码计算,省显存。结果它还是在后台偷偷生成掩码——相当于数据量翻倍,内存直接爆。
我测试过:mlm=False时,batch实际处理的数据量比mlm=True高23%(用nvidia-smi实时监控的)。
错误示范(坑我一整晚的代码):
fromtransformersimportDataCollatorForLanguageModeling# 错!设mlm=False,以为能省显存data_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer,mlm=False,# 以为关了掩码,实际没关return_tensors="pt",)正确姿势(直接解决):
fromtransformersimportDataCollatorForLanguageModeling# 正确!根据任务设置mlmdata_collator=DataCollatorForLanguageModeling(tokenizer=tokenizer,mlm=True,# 任务是MLM就设True(如BERT预训练)mlm_probability=0.15,# 标准值,别乱改return_tensors="pt",)避坑总结:
- 用
DataCollatorForLanguageModeling时,mlm必须和任务匹配。 - 别信“设False能省显存”——它只是不生成掩码标签,但数据处理流程没变。
- 训练前先跑
print(data_collator.__dict__),看参数是否生效。
这次真被坑惨了。现在看文档才明白:这个类设计时就默认做MLM任务,mlm=False是给非MLM任务用的(比如分类任务)。我瞎设参数,等于自己给自己挖坑。
下次训练前,先检查数据加载器参数。别像我一样,熬夜到三点才悟透——显存不够?先看DataCollator!