如何解决for循环中多wandb超参调优任务命令行仅显示单图表问题
问题
我正在进行超参数调优,编写了在for循环中运行多wandb任务的代码如下:
combinations = list(itertools.product(*self.grid_model_configs.values())) for combination in combinations: param_names = self.grid_model_configs.keys() model_config = {key: value for key, value in zip(param_names, combination)} wandb.login() run = wandb.init( name=repr(model_config).replace("'", "").replace('{', '').replace('}', ''), project='D2T', config={ 'training_config': self.training_config, 'model_config': model_config } ) filtered_param = {k: v for k, v in model_config.items() if k in [p.name for p in inspect.signature(PointerGenerator).parameters.values()]} pointernet = PointerGenerator(device=self.device, **filtered_param).to(self.device) trainer = Trainer(training_arguments=self.training_config, model=pointernet, criterion=Criterion(), tokenizer=self.tokenizer, wandb=run) trainer.fit(train_dataloader, dev_dataloader)
但在wandb平台中,多个参数组合仅显示一张图表。该代码在Jupyter Notebook中可正常运行,通过命令行运行时则出现上述异常,请问如何解决?
解决方案
显式关闭每个wandb run:命令行环境下,wandb不会自动在循环迭代后终止当前run,导致所有实验数据被合并到同一个run中。在
trainer.fit()执行完成后,添加wandb.finish()来结束当前run:trainer.fit(train_dataloader, dev_dataloader) wandb.finish() # 新增该行代码将wandb.login()移到循环外:
wandb.login()只需在程序启动时调用一次,循环内重复调用可能导致状态冲突。调整代码位置:wandb.login() # 移至for循环外部 combinations = list(itertools.product(*self.grid_model_configs.values())) for combination in combinations: # 移除循环内的wandb.login(),其余代码保持不变确保run名称唯一:当前通过
repr(model_config)生成的名称可能存在重复风险,改用更直观的键值对拼接方式生成唯一名称:name = "_".join([f"{key}={value}" for key, value in model_config.items()]) run = wandb.init( name=name, project='D2T', config={ 'training_config': self.training_config, 'model_config': model_config } )统一wandb版本:命令行与Jupyter Notebook的wandb版本差异可能导致行为不一致,执行以下命令升级到最新版本:
pip install --upgrade wandb
内容的提问来源于stack exchange,提问作者panda
相关产品推荐
相关产品推荐

