Vertex AI流水线创建模型时的Timestamp JSON序列化错误问题
解决Vertex AI中流水线Timestamp序列化报错问题
尽管你的数据集仅包含浮点和整数特征,但报错说明模型流水线中存在Timestamp类型对象,导致Vertex AI在处理模型元数据时无法完成JSON序列化(Notebook环境不会触发这类元数据序列化检查,因此本地运行正常)。以下是针对性的解决方法:
方法1:排查并清理预处理流水线的元数据
本地加载已保存的模型,检查预处理组件中是否混入Timestamp类型的字段:
import joblib from datetime import datetime final_model = joblib.load("final_model.pkl") preprocessor = final_model.named_steps['preprocessor'] # 递归遍历属性,定位Timestamp对象 def find_timestamp(obj, path=""): if hasattr(obj, '__dict__'): for k, v in obj.__dict__.items(): current_path = f"{path}.{k}" if path else k if isinstance(v, datetime): print(f"发现Timestamp对象:{current_path} = {v}") elif isinstance(v, (list, tuple, dict)): find_timestamp(v, current_path) find_timestamp(preprocessor)
如果找到Timestamp字段,将其转换为字符串后重新保存模型:
# 示例:将_fit_time字段转为字符串 preprocessor._fit_time = preprocessor._fit_time.strftime("%Y-%m-%d %H:%M:%S") joblib.dump(final_model, "final_model_cleaned.pkl")
方法2:拆分保存预处理组件与模型,规避整体序列化问题
将流水线拆分为预处理部分和XGBoost模型分别保存,部署时再重新组合:
# 拆分保存 joblib.dump(final_model.named_steps['preprocessor'], "preprocessor.pkl") final_model.named_steps['classifier'].save_model("xgboost_model.json") # 预测时重新组合流水线 import xgboost as xgb from sklearn.pipeline import Pipeline preprocessor = joblib.load("preprocessor.pkl") classifier = xgb.XGBClassifier() classifier.load_model("xgboost_model.json") pipeline = Pipeline(steps=[("preprocessor", preprocessor), ("classifier", classifier)])
方法3:自定义JSON编码器处理Timestamp(需修改Vertex AI部署脚本)
如果必须保留含Timestamp的元数据,可在Vertex AI的推理脚本中添加自定义编码器:
import json from datetime import datetime class TimestampEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.isoformat() return super().default(obj) # 序列化元数据时使用该编码器 metadata_json = json.dumps(model_metadata, cls=TimestampEncoder)
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

