4. 联邦学习客户端工程
在联邦学习系统中,服务端负责全局模型聚合与调度,而真正产生梯度、消耗算力、暴露隐私风险的部分几乎全部发生在客户端。客户端工程因此不是“把训练脚本塞进手机”这么简单,它需要同时解决四类问题:运行时如何被安全地拉起与隔离、本地训练循环如何与全局轮次对齐、数据加载如何在不破坏隐私的前提下高效供给、以及在内存、电量、网络都受限时如何保证任务可恢复。本节围绕这四类问题展开,并给出可落地的实现结构。
一、客户端运行时的职责边界
客户端运行时是宿主环境与训练逻辑之间的中间层。它向上承接服务端下发的任务描述(轮次号、模型版本、超参数、数据选择策略),向下调用本地数据管道与训练框架,向外负责资源探测、心跳上报、结果加密与上传。一个典型的运行时由五个模块组成:任务接收器、资源探针、数据管道、训练执行器、结果封装器。任务接收器校验任务签名与版本,资源探针读取可用内存、电量、网络类型与充电状态,数据管道按样本 ID 拉取本地分片,训练执行器运行本地 epoch,结果封装器对更新量做量化、加噪或加密后再上传。
运行时必须做“准入判断”:若电量低于阈值、处于计费网络、内存不足或设备温度过高,应拒绝本轮任务并上报原因,而不是强行训练导致进程被杀。准入判断的输入是资源探针的实时读数,输出是 accept / defer / reject 三态决策,defer 表示本轮跳过但保留后续参与资格。
二、本地训练循环与全局轮次对齐
本地训练循环的核心约束是“轮次一致性”:客户端在第 r 轮拿到的全局模型必须与它上传的更新量属于同一版本。实现上,运行时在 TaskSpec 中记录 global_round 与 model_version,训练执行器加载模型后立即校验版本哈希,不一致则拒绝执行并请求重新下发。本地循环通常写成:
for epoch in range(E):
for batch in data_loader:
logits = model(batch.x)
loss = criterion(logits, batch.y)
loss.backward()
optimizer.step()
optimizer.zero_grad()
if step % checkpoint_interval == 0:
save_checkpoint(model, optimizer, epoch, step, round_id)
其中 E 是本地 epoch 数,checkpoint_interval 是检查点间隔。E 越大,本地计算越充分,但客户端漂移越严重;工程上常取 E=1~3,并在服务端用学习率衰减或 FedProx 近端项抑制漂移。训练执行器还需处理梯度裁剪,防止个别客户端梯度爆炸污染全局模型。
三、数据加载的隐私与效率平衡
客户端数据加载不能简单使用全局 DataLoader,因为样本只存在于本地。数据管道需要维护本地样本索引表,记录样本 ID、标签分布与可用状态。每轮训练前,管道按服务端下发的样本选择策略(如按类别分层抽样)生成本轮 batch 序列,并保证同一轮内样本不重复。若本地数据量小于 batch size,应做有放回采样或降低 batch size,而不是直接报错退出。
隐私方面,数据管道不应把原始样本写入日志或检查点。检查点只保存模型参数、优化器状态与训练进度元数据,不保存输入张量。若使用差分隐私,噪声注入应发生在梯度或更新量层面,而不是数据加载层,避免破坏训练稳定性。
四、资源约束下的准入与降级策略
资源约束不是单一阈值,而是一组可组合的条件。以下是一份可直接参考的准入判断示例,参数为教学假设值,实际部署需按设备画像调整:
| 条件 | 阈值(示例) | 不满足时动作 |
|---|---|---|
| 电量 | ≥ 30% 或充电中 | defer,等待充电 |
| 可用内存 | ≥ 模型大小 × 2.5 | reject,上报内存不足 |
| 网络类型 | Wi-Fi 或不计费网络 | defer,等待 Wi-Fi |
| 设备温度 | 低于 42°C | defer,冷却后重试 |
| 本地数据量 | ≥ batch_size | reject,样本不足 |
当多个条件同时不满足时,运行时按“reject 优先于 defer”的顺序决策:只要存在 reject 条件,本轮直接拒绝;否则若存在 defer 条件,则延迟参与。这样可避免客户端反复被拉起又失败,浪费电量与调度配额。
五、断点续传的实现要点
移动端训练进程可能被系统回收,断点续传是可用性的底线。检查点应包含:模型参数、优化器动量、当前 epoch 与 step、本轮 global_round、模型版本哈希、已消费样本 ID 集合。恢复时先比对 global_round 与 model_version,若服务端已进入下一轮,则旧检查点作废,重新拉取全局模型;若版本一致,则从 step 偏移继续,并跳过已消费样本,保证同一轮内不重复训练。
综合来看,客户端工程的关键在于把“训练”放进一个受控的运行时里:准入判断决定是否开始,数据管道决定喂什么,训练循环决定怎么算,检查点决定断了怎么办。四者协同,才能在真实设备上稳定完成联邦学习的每一轮参与。