@@ -1116,12 +1116,14 @@ def predict_single_model(model_name, model_info, params, experiment_name,
11161116
11171117 # 检查模型是否存在于源记录中
11181118 source_models = source_records .get ('models' , {})
1119- if model_name not in source_models :
1119+ resolved_key = resolve_model_key (model_name , source_models , default_mode = 'static' )
1120+
1121+ if not resolved_key :
11201122 result ['error' ] = f"模型 '{ model_name } ' 不在源训练记录中,无法加载已有模型"
11211123 print (f"!!! Error: { result ['error' ]} " )
11221124 return result
11231125
1124- source_record_id = source_models [model_name ]
1126+ source_record_id = source_models [resolved_key ]
11251127 source_experiment = source_records .get ('experiment_name' , 'Weekly_Production_Train' )
11261128
11271129 from qlib .utils import init_instance_by_config
@@ -1134,11 +1136,31 @@ def predict_single_model(model_name, model_info, params, experiment_name,
11341136 try :
11351137 # 1. 从源 recorder 加载模型
11361138 print (f"[{ model_name } ] Loading model from source recorder..." )
1137- source_recorder = R .get_recorder (
1138- recorder_id = source_record_id ,
1139- experiment_name = source_experiment
1140- )
1141- model = source_recorder .load_object ("model.pkl" )
1139+
1140+ # 稳健加载:如果在当前 recorder 里没找到 model.pkl,则根据 source_record_id tag 向上溯源
1141+ current_id = source_record_id
1142+ current_exp = source_experiment
1143+ model = None
1144+ for _ in range (10 ):
1145+ source_recorder = R .get_recorder (
1146+ recorder_id = current_id ,
1147+ experiment_name = current_exp
1148+ )
1149+ try :
1150+ model = source_recorder .load_object ("model.pkl" )
1151+ break
1152+ except Exception :
1153+ tags = source_recorder .list_tags ()
1154+ if 'source_record_id' in tags and 'source_experiment' in tags :
1155+ print (f" [Fallback] model.pkl 不在 { current_id } 中,正在向上溯源到 { tags ['source_record_id' ]} ..." )
1156+ current_id = tags ['source_record_id' ]
1157+ current_exp = tags ['source_experiment' ]
1158+ else :
1159+ raise ValueError (f"model.pkl not found in { current_id } and no parent tags available." )
1160+
1161+ if model is None :
1162+ raise ValueError (f"Exceeded max traceback depth of 10 for { model_name } ." )
1163+
11421164 print (f"[{ model_name } ] Model loaded successfully" )
11431165
11441166 # 2. 构建新的 dataset(使用新日期范围)
@@ -1176,6 +1198,10 @@ def predict_single_model(model_name, model_info, params, experiment_name,
11761198 r_obj = init_instance_by_config (r_cfg , recorder = recorder )
11771199 r_obj .generate ()
11781200
1201+ # 重点修复:必须把模型也存入新的 recorder 里面,
1202+ # 否则下一个周期如果继续做仅预测,会因为上个仅预测的记录中没有 model.pkl 而失败
1203+ recorder .save_objects (** {"model.pkl" : model })
1204+
11791205 # 获取 IC 指标
11801206 performance = {}
11811207 try :
0 commit comments