From a9a0e517694c02a42adcab52133342686307cd5c Mon Sep 17 00:00:00 2001 From: xz2000 Date: Wed, 16 Jul 2025 15:34:48 +0800 Subject: [PATCH] =?UTF-8?q?#=20=E4=BF=AE=E6=94=B9=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=97=A5=E5=BF=97=20(=E6=97=A5=E6=9C=9F:=202025-07-16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 1. 核心 Bug 修复 ### 文件: `server/core/predictor.py` - **问题**: 在 `train_model` 方法中调用内部辅助函数 `_prepare_training_params` 时,没有正确传递 `product_ids` 和 `store_ids` 参数,导致在 `_prepare_training_params` 内部发生 `NameError`。 - **修复**: - 修正了 `train_model` 方法内部对 `_prepare_training_params` 的调用,确保 `product_ids` 和 `store_ids` 被显式传递。 - 此前已修复 `train_model` 的函数签名,使其能正确接收 `store_ids`。 - **结果**: 彻底解决了训练流程中的参数传递问题,根除了由此引发的 `NameError`。 ## 2. 代码清理与重构 ### 文件: `server/api.py` - **内容**: 移除了在 `start_training` API 端点中遗留的旧版、基于线程(`threading.Thread`)的训练逻辑。 - **原因**: 该代码块已被新的、基于多进程(`multiprocessing`)的 `TrainingProcessManager` 完全取代。旧代码中包含了大量用于调试的 `thread_safe_print` 日志,已无用处。 - **结果**: `start_training` 端点的逻辑变得更加清晰,只负责参数校验和向 `TrainingProcessManager` 提交任务。 ### 文件: `server/utils/training_process_manager.py` - **内容**: 在 `TrainingWorker` 的 `run_training_task` 方法中,移除了一个用于模拟训练进度的 `for` 循环。 - **原因**: 该循环包含 `time.sleep(1)`,仅用于在没有实际训练逻辑时模拟进度更新,现在实际的训练器会通过回调函数报告真实进度,因此该模拟代码不再需要。 - **结果**: `TrainingWorker` 现在直接调用实际的训练器,不再有模拟延迟,代码更贴近生产环境。 ## 3. 启动依赖 - **Python**: 3.x - **主要库**: - Flask - Flask-SocketIO - Flasgger - pandas - numpy - torch - scikit-learn - matplotlib - **启动命令**: `python server/api.py` --- UI/src/views/training/GlobalTrainingView.vue | 14 +- UI/src/views/training/StoreTrainingView.vue | 16 +- server/api.py | 457 +++------- server/core/predictor.py | 139 ++- server/trainers/kan_trainer.py | 66 +- server/trainers/mlstm_trainer.py | 91 +- server/trainers/tcn_trainer.py | 56 +- server/trainers/transformer_trainer.py | 56 +- server/utils/model_manager.py | 142 +-- server/utils/multi_store_data_utils.py | 152 ++-- server/utils/training_process_manager.py | 68 +- xz修改记录日志和启动依赖.md | 892 +------------------ xz训练模型保存规则.md | 89 +- 13 files changed, 715 insertions(+), 1523 deletions(-) diff --git a/UI/src/views/training/GlobalTrainingView.vue b/UI/src/views/training/GlobalTrainingView.vue index fd398f4..ed255bb 100644 --- a/UI/src/views/training/GlobalTrainingView.vue +++ b/UI/src/views/training/GlobalTrainingView.vue @@ -609,15 +609,17 @@ const startTraining = async () => { epochs: form.epochs, training_mode: 'global', // 标识这是全局训练模式 training_scope: form.training_scope, - aggregation_method: form.aggregation_method + aggregation_method: form.aggregation_method, + store_ids: form.store_ids || [], // 确保始终发送数组 + product_ids: form.product_ids || [] // 确保始终发送数组 }; - if (form.store_ids.length > 0) { - payload.store_ids = form.store_ids; + // 关键修复:即使是列表,也传递第一个作为代表ID + if (payload.store_ids.length > 0) { + payload.store_id = payload.store_ids[0]; } - - if (form.product_ids.length > 0) { - payload.product_ids = form.product_ids; + if (payload.product_ids.length > 0) { + payload.product_id = payload.product_ids[0]; } if (form.training_type === "retrain") { diff --git a/UI/src/views/training/StoreTrainingView.vue b/UI/src/views/training/StoreTrainingView.vue index 29558a6..7791151 100644 --- a/UI/src/views/training/StoreTrainingView.vue +++ b/UI/src/views/training/StoreTrainingView.vue @@ -228,7 +228,11 @@ prop="version" label="版本" width="80" - /> + > + +