2. 金融训练任务基础

在金融训练场景中,一个“任务”并不是简单的脚本调用,而是把数据、模型、算力、合规约束和业务目标封装成可调度、可观测、可重试的最小执行单元。理解任务的定义方式、类型划分、依赖关系与生命周期,是后续编排与失败重试设计的地基。本节从工程视角拆解这些基础概念,并给出金融场景中的典型任务示例。

一、任务定义:从脚本到可调度单元

金融训练任务的定义通常包含五个要素:输入数据源、计算逻辑、资源规格、输出产物、调度与重试策略。与普通脚本不同,任务定义必须显式声明这些要素,才能被编排系统识别、调度和恢复。

  • 输入数据源:行情快照、财报、征信、交易流水、特征表等,需标注分区、时间窗口与版本。
  • 计算逻辑:特征工程、模型训练、回测、评分卡拟合、风险指标计算等。
  • 资源规格:CPU/GPU 数量、内存、显存、优先级、超时时间。
  • 输出产物:模型文件、特征表、评估报告、指标快照,需带版本与校验值。
  • 调度与重试策略:触发方式、依赖条件、最大重试次数、退避策略、失败告警。

一个典型的任务定义可以用如下配置片段表达:

task:
  name: credit_score_train
  type: model_training
  inputs:
    - dataset: feature_store/credit_v3
      partition: "2024-06-01"
  resources:
    cpu: 8
    memory: 32Gi
    gpu: 1
  outputs:
    - path: models/credit_score/v3
  retry:
    max_attempts: 3
    backoff: exponential
    base_seconds: 30
  timeout_seconds: 7200
任务定义越显式,编排系统在失败重试时越能准确判断“重跑什么、从哪跑、是否幂等”。隐式依赖和隐式输出是重试事故的主要来源。

二、任务类型:金融训练中的常见分类

金融训练任务可按计算性质与业务用途分类。不同类型对重试的敏感度差异很大:幂等任务可安全重跑,非幂等任务需要额外保护。

任务类型 典型用途 幂等性 重试敏感度
数据抽取任务 拉取行情、财报、征信数据 通常幂等 低,可重跑
特征工程任务 生成特征表、标签表 分区覆盖可幂等 中,需保证分区一致
模型训练任务 评分卡、风控模型、量化模型 依赖随机种子 高,需固定种子与版本
回测任务 策略历史表现验证 通常幂等 中,需锁定数据版本
评估与报告任务 指标计算、合规报告 幂等 低,可重跑
模型发布任务 上线、灰度、注册 非幂等 极高,需人工确认

从重试设计角度看,任务类型决定了重试边界:数据类任务可自动重试,训练类任务需固定随机种子,发布类任务必须引入审批与幂等令牌。

三、任务依赖:DAG 与数据版本约束

金融训练任务很少孤立存在。特征任务依赖数据抽取,训练任务依赖特征任务,评估任务依赖训练任务,发布任务依赖评估任务。这些依赖构成有向无环图(DAG)。

依赖关系分为两类:控制依赖(前序任务成功才触发后序)和数据依赖(后序任务读取前序产物的特定分区或版本)。在金融场景中,数据依赖往往比控制依赖更关键,因为同一任务可能读取多个数据版本。

数据抽取 行情/财报/征信 特征工程 feature_store v3 标签构建 label_table v2 模型训练 seed=42 评估报告 AUC/KS 模型发布 灰度/注册 分区依赖 版本依赖 特征版本 标签版本 指标门禁 审批门禁

依赖设计中的关键约束是:后序任务必须锁定前序产物的版本。如果特征表被覆盖而训练任务仍读取旧版本,重试时可能得到不一致结果。因此金融训练任务通常要求产物带版本号与校验值,并在依赖声明中显式引用。

四、任务生命周期:状态迁移与重试切入点

任务从创建到结束会经历多个状态。理解状态迁移,才能判断失败重试应该从哪个状态切入。

  1. PENDING:已创建,等待依赖满足。
  2. QUEUED:依赖满足,等待资源分配。
  3. RUNNING:正在执行,可能处于数据读取、训练、写回等阶段。
  4. SUCCEEDED:成功完成,产物已提交。
  5. FAILED:执行失败,可进入重试判断。
  6. RETRYING:满足重试条件,重新排队。
  7. CANCELLED:被人工或策略取消。
重试不是简单地把 FAILED 改回 QUEUED。必须判断失败原因是否可重试、产物是否已部分写入、依赖版本是否仍然有效。否则重试可能造成数据污染或重复发布。

一个常见的失败日志片段如下,用于判断重试切入点:

[2024-06-01 03:12:44] task=credit_score_train state=RUNNING
[2024-06-01 03:45:10] ERROR: GPU OOM at epoch 12
[2024-06-01 03:45:11] task=credit_score_train state=FAILED
[2024-06-01 03:45:12] retry_policy: max_attempts=3, attempt=1
[2024-06-01 03:45:12] task=credit_score_train state=RETRYING

该日志表明失败原因是资源不足,属于可重试类型,但重试前应调整资源规格或降低 batch size,而不是原样重跑。

五、金融场景典型任务示例与复盘要点

以信贷评分卡训练为例,完整任务链包括:数据抽取 → 特征工程 → 标签构建 → 模型训练 → 评估报告 → 模型发布。每个环节都有典型失败模式:

  • 数据抽取:上游接口超时,可自动重试,但需去重。
  • 特征工程:分区缺失,需检查分区是否已生成,避免空跑。
  • 模型训练:GPU OOM 或随机种子未固定,重试前需调整资源或固定种子。
  • 评估报告:指标未达门禁,不应重试,而应触发人工复核。
  • 模型发布:非幂等,重试必须使用幂等令牌并人工确认。
复盘要点:把“失败原因”与“重试策略”一一映射。资源类失败调整规格后重试;数据类失败检查分区后重试;指标类失败不重试;发布类失败走审批。这样才能让重试真正提升训练流水线的稳定性,而不是制造新的风险。

掌握任务定义、类型、依赖与生命周期后,后续的编排设计与失败重试策略才有明确的落点。金融训练任务的特殊性在于:数据有版本、模型有种子、发布有门禁,任何重试都必须尊重这些约束。