You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Paddle/doc/design/cluster_train/checkpointing.md

3.9 KiB

模型参数检查点Checkpointing

模型数据检查点的实现可以有效的避免parameter server的单点或多点同时故障。模型参数检查点通过定期向磁盘上保存一份存储在parameter server内存中的模型数据的完整镜像来保证训练过程可以从中间状态重新启动。在一个不可中断并缺少备份的训练任务中可以通过阶段性的保存每个parameter server的数据快照snapshot分布式存储服务 达到容灾的目的比如每隔10分钟最新的快照并删除更早的快照。在出现单点故障时只需要恢复这台节点或者将这台节点迁移到另一个节点并启动即可恢复训练任务。

快照保存的设计如下:

说明:

  • parameter server在集群中启动后自动挂载分布式存储目录并把快照保存到这个目录下。
  • 每个parameter server的检查点各自独立保存暂时不考虑多个parameter server同步的保存一个特定时间点的全局检查点因为这样做也没法保证消除随机性。

检查点保存程序流程:

  1. 如果满足条件"每隔10分钟"时parameter server会获取parameters内存的read_lock启动一个新的线程开始保存检查点。如果已经正在执行保存检查点的线程则忽略。由于对parameters的更新需要获取parameters内存的write_lock所以在写入快照的过程中parameter server会暂停参数更新并等待。
  2. parameter server生成一个UUID向指定的目录中一个新的文件文件名为此UUID写入快照数据。在快照写入完成后计算这个文件的MD5 sum。然后在etcd的/checkpoints/[pserver_id]中写入json内容{"uuid": [UUID], "md5", "MD5 sum", "timestamp": xxxx}
  3. 删除磁盘目录中不是当前uuid的快照文件。
  4. 释放对paramters内存的锁定停止保存检查点的线程。

这里需要用户额外注意在您的实际环境中训练任务的运行可能会占满trainer和parameter server之间的网络带宽如果parameter server此时还需要通过网络访问分布式存储以保存快照可能会造成网络拥塞而出现阶段性的运行停滞。

从快照恢复

在parameter server第一次启动或任意时间parameter server故障后被Kubernetes重新启动则需要回滚到上一个检查点

  1. 从etcd中读取节点/checkpoints/[pserver_id]获取最新的检查点的文件uuid
  2. 从磁盘文件中加载uuid文件名的检查点快照文件并加载其中的参数
  3. 如果上面两步出现错误,则使用启动参数定义的初始化方法初始化参数
  4. 开始提供服务

TODO List

推测执行/加速执行TODO

在异构集群中如果存在某些trainer执行速度过慢会影响整体集群的速度如图中Trainer 1此时master将负责启动一个新的TrainerAccelerate Trainer 2使用同样的训练数据block。哪个trainer先完成block的训练则把另一个慢速的kill掉。

动态扩容/缩容

目前只考虑动态扩容trainer数量可以减小系统复杂性。

术语

  • model: 指深度学习训练之后得到的所有参数,使用这个神经网络可以完成对新数据的预测
  • parameters: 神经网络中的参数包括权重w和偏置b。一个神经网络的模型由大量的参数组成
  • shard: 分片,通常指将一个整体拆分成多份的其中的一份。
  • model shard: 将一个神经网络参数拆分成多份每个shard分别存储在其中一台parameter server之上
  • parameter block: 多个parameter block构成一个model shard
  • 单点故障: 任意时刻只可能同时有一台服务器故障。由于集群中同时存在两台机器故障的概率极低((平均故障率*平均故障修复时间)^2只对特殊在线系统考虑两台以上同时故障的容灾。