2. 隐私计算任务的生命周期

隐私计算任务与普通计算任务最大的区别在于:任务不仅要“算得对”,还要“算得合规”。一个任务从被写下到被销毁,中间要经过多方协作、资源分配、隐私约束校验和结果审计。理解这条生命周期,是后续做任务编排与调度的前提——调度器本质上就是在生命周期的每个阶段做决策:什么时候放行、放到哪个节点、什么时候暂停、什么时候回收。

本节把生命周期拆成六个阶段:任务定义、提交、解析、执行、监控、回收。它们不是六个孤立步骤,而是一条带状态迁移的链路:前一阶段的产物是后一阶段的输入,任一阶段失败都会触发回退或终止。

任务定义:把“想算什么”写成机器可读的契约

任务定义阶段要产出的是任务描述文件(Task Spec)。它至少包含四类信息:参与方与角色、数据引用、计算逻辑、隐私约束。以两方纵向联邦学习为例,一个任务定义可能长这样:

task_id: fl_job_20240612_001
parties:
  - role: guest      # 发起方,持有标签
    node: node_A
    data: {dataset: "credit_label_v3", key: "uid"}
  - role: host       # 数据提供方
    node: node_B
    data: {dataset: "behavior_feat_v7", key: "uid"}
algorithm:
  type: vertical_lr
  epochs: 10
  batch_size: 256
  learning_rate: 0.01
privacy:
  dp: {enabled: true, epsilon: 1.0, delta: 1e-5}
  secure_protocol: paillier
  output: {only_guest: true}
sla:
  deadline: "2024-06-12T18:00:00+08:00"
  max_retry: 2

这里的关键是:隐私约束必须和计算逻辑写在同一份契约里。如果 epsilon、安全协议、结果可见范围只存在于口头约定或运维笔记中,调度器就无法在解析阶段做校验,也无法在执行阶段强制生效。任务定义阶段还要明确数据引用的粒度——是整张表、某个特征子集,还是带过滤条件的视图,这直接决定后续权限校验的复杂度。

提交:从客户端到调度器的可信入口

提交阶段解决“谁有权发起、任务是否完整”的问题。客户端把 Task Spec 连同发起方身份凭证、签名一起发送给调度器入口。调度器入口通常做三件事:身份认证(确认发起方是注册参与方)、格式校验(字段是否齐全、类型是否正确)、幂等检查(同一 task_id 是否重复提交)。

提交成功后,任务进入 SUBMITTED 状态,并获得一个全局唯一的任务句柄。此时任务还没有占用任何计算资源,只是被登记在待处理队列中。一个常见的设计是:提交接口只做轻量校验,把重校验留给解析阶段,避免入口成为瓶颈。

解析:把契约翻译成可执行的调度计划

解析阶段是生命周期中最容易被低估、却最影响成败的一环。它要做的是把声明式的 Task Spec 翻译成调度器能执行的计划,同时完成所有“能不能做”的判断。典型工作包括:

  • 依赖解析:确定参与方节点、数据位置、所需算子库版本,检查各节点是否具备对应能力。
  • 权限与合规校验:核对数据使用授权是否覆盖本次任务的目的、范围、有效期;检查隐私预算是否超限。
  • 资源预估:根据数据量、epoch、batch_size 估算内存、显存、网络带宽需求,判断是否可调度。
  • 计划生成:把算法拆成算子图(DAG),标注每个算子的执行位置(guest 本地、host 本地、或安全协议交互)。

解析失败的任务不会进入执行,而是进入 REJECTED 状态并附带原因码,例如 PRIVACY_BUDGET_EXCEEDED、DATA_AUTH_EXPIRED、NODE_CAPABILITY_MISSING。这些原因码是后续排障和审计的重要依据。

执行:多方协同下的算子调度

执行阶段把解析出的算子图真正跑起来。隐私计算任务的执行有两个特点:一是跨节点协同,guest 和 host 上的算子需要按协议交替执行;二是中间结果受保护,梯度、特征分箱等中间量要么加密传输,要么加噪后再交换。

以纵向逻辑回归为例,一轮迭代中 guest 计算 u = w·x 的本地部分,host 计算另一部分,双方通过 Paillier 同态加密交换中间值,guest 解密后更新梯度,再把加密后的梯度回传。调度器需要保证:同一轮内双方算子按依赖顺序触发,网络超时能重试,某方失败时整轮回滚而不是产生不一致的中间状态。

监控:看状态、看进度、看隐私预算

监控不是简单地看“跑没跑完”,而是要同时盯住三类信号:

监控维度典型指标异常判断
任务状态当前阶段、已完成 epoch、重试次数长时间停留在同一阶段
资源与性能CPU/内存占用、通信量、单轮耗时单轮耗时突增、通信量异常放大
隐私与合规累计 epsilon 消耗、协议调用次数预算接近上限、出现未授权数据访问

监控数据既用于实时告警,也用于事后审计。一个实用做法是:把每个任务的隐私预算消耗记录成独立账本,任务结束时结算,超限则拒绝后续同类任务。

回收:释放资源,也释放“数据痕迹”

任务结束(成功、失败或被取消)后进入回收阶段。回收不只是释放 CPU 和内存,还包括:清理各节点上的临时中间文件、销毁会话密钥、注销任务句柄、把任务元数据和审计日志归档。对于涉及敏感中间结果的任务,回收还要确认临时数据已被安全擦除,而不是简单删除文件句柄。

回收完成后,任务进入终态:SUCCEEDED、FAILED 或 CANCELLED。终态任务不再占用调度资源,但其审计记录应保留,供合规检查追溯。

隐私计算任务生命周期状态迁移 任务定义 Task Spec 提交 SUBMITTED 解析 校验 / 计划生成 执行 RUNNING 监控 状态 / 预算 回收 释放资源 / 清理痕迹 / 归档 REJECTED 原因码 + 审计记录 校验失败 终态 SUCCEEDED / FAILED / CANCELLED 阶段产物与关键判断 定义 → Task Spec(含隐私约束) 提交 → 身份认证 + 幂等检查 解析 → 算子 DAG + 资源预估 执行 → 跨节点协同 + 加密交换 监控 → 状态 / 性能 / 隐私预算 回收 → 资源释放 + 痕迹清理 正常流转 异常分支 监控触发回收