Hugging Face超参搜索时Trainer的model_init参数报RuntimeError问题
报错根因
问题的核心是model_init的传值逻辑写错了:
- 你当前代码里写的是
model_init = finetuning_utils.model_init(),这行代码会立刻执行一次model_init函数,把执行后返回的RoBERTa模型实例直接传给Trainer。 - Hugging Face Trainer要求
model_init必须是一个可调用的函数本身,不能是函数执行后的返回值——因为超参搜索流程需要在每一组超参试验时,主动调用这个函数重新初始化模型。你传成模型实例的话,Trainer内部解析参数时,会判定这个对象不符合“接受0或1个参数的可调用函数”的规范,直接抛出对应的RuntimeError。
修复方法
把model_init赋值行里函数名后面的括号删掉,直接传函数引用就行,修改后的代码:
#Initialising the model trainer = Trainer( args = training_args, tokenizer = tokenizer, train_dataset = train_data, eval_dataset = val_data, # 去掉函数名后的(),直接传函数引用 model_init = finetuning_utils.model_init, compute_metrics = finetuning_utils.compute_metrics, )
后续适配超参搜索的注意点
- 你当前实现的零参数
model_init函数,本身已经满足Trainer的入参要求,只是传值时多打了括号。 - 如果后续需要在超参搜索过程中根据每轮试验的参数调整模型配置,只需要给
model_init函数加一个可选的trial入参即可,不需要修改Trainer里的传参方式,改造后的函数定义示例:
def model_init(trial=None): """Returns an initialized model for use in a Hugging Face Trainer.""" model = RobertaForSequenceClassification.from_pretrained("roberta-base") return model
调整后函数就完全符合Trainer对model_init的参数规则,超参搜索流程可以正常完成多轮迭代。
内容的提问来源于stack exchange,提问作者CMOS-Y
相关产品推荐
相关产品推荐

