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。终态任务不再占用调度资源,但其审计记录应保留,供合规检查追溯。