
Wandb sweeps integraition: custom objective
快速结论:当使用 Hugging Face Transformers Trainer 配合 Wandb Sweeps 进行超参搜索,且自定义 compute_objective 返回多个指标的组合时,Wandb Sweeps 不会自动使用该自定义目标函数进行优化。Sweeps 实际优化的是 hyperparameter_search 中传入的 metric 参数对应的指标。需要手动将自定义目标值记录到 Wandb 中,并在 Sweep Configuration 中指定该指标名称。
问题场景
用户在修改 run_summarization.py 脚本时,使用 Trainer.hyperparameter_search 方法配合 backend="wandb" 进行超参搜索。用户定义了 compute_objective=hparam_objective 返回 metrics["eval_rougeLsum"] + metrics["eval_sari"],意图最大化两个指标的和。但在 Wandb 界面中看到的 Sweep Configuration 中 metric.name 为 eval/sari,用户不确定 Wandb 实际优化的是哪个目标。
报错原文
# 用户提供的 Wandb Sweep Configuration 显示
method: bayes
metric:
goal: maximize
name: eval/sari # ← 用户传入的 metric 参数,而非自定义的目标
parameters:
num_train_epochs:
distribution: int_uniform
max: 30
min: 2
run_cap: 16
# 用户困惑点
My worry here is the disconnect between the generated sweep config and the custom objective function.
What is wandb optimizing now? My custom objective function (sari+rougeLsum) or metric that is passed to hyperparameter_search for direction?
原因分析
Wandb Wandb Sweeps 不支持多目标优化。用户在 hyperparameter_search 中传入的 metric 参数决定了 Sweep Configuration 中的优化目标。虽然用户定义了 compute_objective 在 Hugging Face Trainer 内部用于选择最佳 Trial,但 Wandb Sweeps 本身会根据 metric 参数在 Sweep 控制台中优化相应目标。用户传入的 metric="eval/sari" 意味着 Wandb Sweeps 独立于 compute_objective 优化 eval/sari。
环境排查
transformers版本: 4.29.2- Python 版本: ≥3.10
- PyTorch 版本: 2.0.1+cu117 (CUDA 11.7)
- Huggingface Hub 版本: 0.14.1
- Wandb 版本: 需确认(Issue 中未明确)
- 注意:
Safetensors not installed不影响此问题
解决步骤
- 手动记录自定义目标指标到 Wandb:在训练脚本中(例如在
compute_metrics回调中)使用wandb.log({"custom_metric": metrics["eval_rougeLsum"] + metrics["eval_sari"]})。 - 调整 Wandb Sweep Configuration:在
wandb_hp_space中将metric.name设置为上一步中记录的自定义指标名称,例如"name": "custom_metric"。 - 确保方向一致:在
wandb_hp_space的metric.goal中设置"maximize"或"minimize",与hyperparameter_search的direction参数匹配。 - 可选方案:如果 Wandb Sweeps 版本支持并行坐标图(parallel coordinate plot),可以手动分析两个指标(如
eval/rougeLsum和eval/sari)在 Sweep 中的变化趋势来选择折中方案(Scenario 2)。 - 注意:
hyperparameter_search的metric参数主要用于 Wandb Sweep 可视化图表中的列名,但 Sweeps 优化器会直接使用该指标的值。因此自定义目标函数的逻辑需要在 Wandb 端手动同步。
验证方法
运行 Sweep 后,在 Wandb UI 中查看 Sweep Dashboard。确认 metric 图表显示的是自定义的 custom_metric(或其他自定义名称)而非单个 eval/sari 或 eval/loss。同时检查 Sweep Configuration 页面中 metric.name 是否已正确更新。
参考来源
huggingface/transformers Issue #23647: Wandb sweeps integraition: custom objective



