使用 lm-eval 评估模型时报错:TypeError: ‘NoneType’ object is not callable 的解决方案
问题描述
在使用 lm-evaluation-harness 进行多 GPU 模型评估时,使用如下命令:
accelerate launch --multi-gpu --num_processes 2 \
-m lm_eval --model hf \
--model_args pretrained=${local_model_path} \
--tasks mmlu \
--batch_size 8 \
--log_samples \
--output_path ${output_path} \
--trust_remote_code
却报错如下:
TypeError: 'NoneType' object is not callable
错误栈显示问题出现在 datasets.load_dataset() 时,builder_cls 为 NoneType:
builder_instance: DatasetBuilder = builder_cls(
TypeError: 'NoneType' object is not callable
问题分析
报错的关键在于:
datasets.load_dataset()
的过程中,某个数据集无法被正确加载;
- 此错误通常是由于 datasets 包版本过新或过旧 与 lm-eval 中的任务配置不兼容导致的;
- 在 lm-eval0.4.5 搭配 datasets3.1.0 时出现该错误;
- 很可能是 mmlu 任务依赖的数据集在新版 datasets 中的加载逻辑发生了改变或 metadata 不兼容。
解决方法
将 datasets 包从 3.1.0 降级至 2.16.0:
pip install datasets==2.16.0
再次运行命令,即可成功评估:
accelerate launch --multi-gpu --num_processes 2 \
-m lm_eval --model hf \
--model_args pretrained=${local_model_path} \
--tasks mmlu \
--batch_size 8 \
--log_samples \
--output_path ${output_path} \
--trust_remote_code
参考链接
lm-evaluation-harness GitHub