如何在Vertex AI的aiplatform.log_metrics中记录nan/inf指标?
Vertex AI log_metrics记录NaN/Inf值的解决方案
Vertex AI的aiplatform.log_metrics接口默认不支持直接记录NaN或Inf值,以下是几种可行的处理方案:
方案一:替换为特殊标识值并补充说明
将NaN/Inf替换为业务侧约定的特殊数值,同时通过metric_descriptions参数说明替换规则,确保后续查看指标时能明确原始含义:
from google.cloud import aiplatform # 原始指标数据(含NaN/Inf) raw_metrics = { "validation_accuracy": float("nan"), "training_loss": float("inf") } # 处理指标值 processed_metrics = {} for metric_name, value in raw_metrics.items(): if value != value: # 判断NaN processed_metrics[metric_name] = -9999 elif value == float("inf"): processed_metrics[metric_name] = 999999 elif value == float("-inf"): processed_metrics[metric_name] = -999999 else: processed_metrics[metric_name] = value # 记录处理后的指标及说明 aiplatform.log_metrics( metrics=processed_metrics, metric_descriptions={ "validation_accuracy": "原始值为NaN时用-9999表示", "training_loss": "原始值为Inf时用999999表示,-Inf时用-999999表示" } )
方案二:将原始值记录到实验参数日志
如果需要保留原始的NaN/Inf值,可以借助Vertex AI实验的参数日志功能,直接记录原始数据:
from google.cloud import aiplatform # 获取当前实验运行实例 current_run = aiplatform.get_current_run() # 记录含NaN/Inf的原始指标到参数日志 current_run.log_params({ "raw_validation_accuracy": float("nan"), "raw_training_loss": float("inf") })
这种方式下,参数日志支持存储NaN/Inf,后续可在实验详情页查看原始数值。
方案三:封装工具函数兼顾指标面板与原始值记录
自己封装一个工具函数,同时完成指标值处理(用于log_metrics)和原始值记录(用于参数日志),兼顾可视化与数据完整性:
from google.cloud import aiplatform def log_metrics_with_nan_inf(metrics): processed_metrics = {} raw_records = {} for name, val in metrics.items(): raw_records[f"raw_{name}"] = val # 处理指标值 if val != val: processed_metrics[name] = -9999 elif val == float("inf"): processed_metrics[name] = 999999 elif val == float("-inf"): processed_metrics[name] = -999999 else: processed_metrics[name] = val # 记录到指标面板 aiplatform.log_metrics(metrics=processed_metrics) # 记录原始值到实验参数 aiplatform.get_current_run().log_params(raw_records) # 使用封装函数 log_metrics_with_nan_inf({ "validation_accuracy": float("nan"), "training_loss": float("inf"), "precision": 0.87 })
内容的提问来源于stack exchange,提问作者Katie O'Leary
相关产品推荐
相关产品推荐

