You need to enable JavaScript to run this app. 如何获取Rasa模型训练时长及训练进度回调方法
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Rasa模型训练时长及训练进度回调方法

Rasa训练进度/时长预估实现方案

方案1:基于Rasa内置训练回调扩展

Rasa官方提供了TrainingCallback基类,可以通过继承重写训练各阶段的钩子函数拿到实时进度,是精度最高的实现方式:

  • 重写on_training_start钩子:训练启动时触发,可记录训练开始时间、配置的总训练轮次,初始化进度为0
  • 重写on_nlu_training_start/on_core_training_start钩子:分别在NLU模块、对话核心模块训练启动时触发,用于拆分阶段进度
  • 重写on_epoch_end钩子:每一轮训练迭代结束时触发,可通过已完成轮次/总轮次直接计算训练百分比,同时可以基于已耗时长动态推算剩余时间
  • 所有进度数据按训练任务ID存入缓存(内存字典/Redis),供进度查询接口调用

示例回调实现代码:

import time
from rasa.shared.core.training import TrainingCallback
from typing import Dict, Any

class CustomProgressCallback(TrainingCallback):
    def __init__(self, task_id: str, cache_store: Dict):
        self.task_id = task_id
        self.total_epochs = 0
        self.current_epoch = 0
        self.cache = cache_store

    def on_training_start(self, total_epochs: int, **kwargs: Any) -> None:
        self.total_epochs = total_epochs
        self.cache[f"train:{self.task_id}:progress"] = 0
        self.cache[f"train:{self.task_id}:start_time"] = time.time()

    def on_epoch_end(self, epoch: int, **kwargs: Any) -> None:
        self.current_epoch = epoch + 1
        progress = (self.current_epoch / self.total_epochs) * 100
        self.cache[f"train:{self.task_id}:progress"] = round(progress, 2)
        # 动态计算预估剩余时长
        elapsed = time.time() - self.cache[f"train:{self.task_id}:start_time"]
        est_remaining = (elapsed / progress) * (100 - progress) if progress > 0 else 0
        self.cache[f"train:{self.task_id}:est_remaining"] = round(est_remaining, 2)

训练时将自定义回调传入Trainer即可生效:

from rasa.nlu.model import Trainer

# 初始化时传入回调实例
trainer = Trainer(your_config, callbacks=[CustomProgressCallback(task_id=生成的唯一任务ID, cache_store=你的缓存实例)])

方案2:基于日志解析的无侵入实现

如果不想修改现有训练代码,可以捕获Rasa训练过程的标准输出日志,通过正则匹配提取进度信息:

  • Rasa训练时会输出Epoch X/XX、NLU training completed、Core training completed这类固定格式的日志,匹配后即可计算进度
  • 优点:不需要修改原有训练逻辑,适配所有版本Rasa
  • 缺点:进度精度低于自定义回调,Rasa版本升级导致日志格式变化时需要调整匹配规则

时长预估的实现逻辑

  • 初始预估:提前收集同环境下同量级训练数据的历史耗时,比如每1000条NLU样本训练耗时X秒,每100条故事/规则训练耗时Y秒,用户触发训练时先统计本次训练的数据量,乘以基准值给出初始预估时长
  • 动态修正:训练过程中根据已完成阶段的实际耗时,动态调整剩余预估时间,精度会随着训练推进越来越准

接口侧适配

  • 训练触发接口:收到请求后生成唯一的训练任务ID,立即返回任务ID给前端,异步启动训练任务避免接口超时
  • 进度查询接口:支持前端轮询或者WebSocket主动推送,根据任务ID从缓存中读取当前进度、已耗时长、预估剩余时间返回,前端即可渲染进度条

生产环境建议使用Redis等外部存储缓存训练进度,避免服务重启导致进度数据丢失,多实例部署的情况下也可以实现进度数据共享

内容的提问来源于stack exchange,提问作者blind_shark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 02:45:08