Cloud ML Engine超参数调优任务报错Too many metrics如何解决?
嘿,这个报错我之前帮不少开发者搞定过,核心原因很明确:Cloud ML Engine对超参数调优任务的指标输出数量有严格限制——每个调优Job最多只能有1个主调优指标,再加最多5个辅助观察指标。如果你的训练代码输出的指标总数超过这个上限,就会触发这个错误。
下面是具体的解决步骤:
清理冗余的指标输出
先去你的训练代码里排查所有输出指标的逻辑:不管是用tf.summary.scalar、自定义的JSON写入,还是其他日志工具(比如MLflow),把那些不需要用来指导超参数调优的指标全部删掉。只保留你最关心的1个核心指标(比如准确率、损失值),最多再加5个用来辅助观察的次要指标(比如验证集精度、训练耗时)。检查超参数调优配置的正确性
打开你的调优任务配置文件(比如config.yaml),或者检查提交Job时的命令行参数,确认hyperparameter_tuning_config部分只指定了合法的指标:hyperparameter_tuning_config: goal: MAXIMIZE # 或者MINIMIZE,取决于你的指标类型 hyperparameter_metric_tag: validation_accuracy # 这里是你的主调优指标 params: - parameterName: learning_rate type: DOUBLE minValue: 0.001 maxValue: 0.1 scaleType: UNIT_LOG_SCALE确保
hyperparameter_metric_tag对应的指标是你代码里确实在输出的,而且配置里没有额外添加超出数量限制的指标。排查重复输出的指标
有时候代码里会不小心重复写入同一个指标(比如在每个训练batch都输出一次,而不是只在epoch结束时输出),或者在不同模块里重复定义了相同的指标输出逻辑。这种情况下,虽然指标名称相同,但重复的输出会被系统判定为多个指标条目,进而触发上限。所以要梳理代码逻辑,确保每个指标只在合适的时机输出一次。规范自定义指标的输出格式
如果你是用自定义方式输出指标(而非TensorFlow的summary机制),要严格遵循Cloud ML Engine的要求:每个指标对应一个单独的JSON对象,比如:{"metric": "training_loss", "value": 0.32, "step": 500}不要在一个JSON里同时写入多个指标,也不要重复输出同一个指标的多条记录(除非是不同训练步骤的数值,但如果指标总数本身超了还是会报错)
另外,如果你确实需要监控更多指标,可以把那些不参与超参数调优的指标转存到Cloud Monitoring这类工具里,不要放到超参数调优的指标输出流中。
内容的提问来源于stack exchange,提问作者Lak

