由于云计算平台的易扩展性等特点,越来越多的机器学习任务跑在 Kubernetes 集群里。然而在 Kubernetes 的架构体系中,计算和存储是分离的,模型训练作业需要访问远程存储来获取训练样本,这就给数据密集型的机器学习作业带来较高的网络 IO 开销。 受 Fluid 项目的启发,我们在 PaddleCloud 项目中添加了样本缓存组件,旨在通过将样本数据缓存在 Kubernetes 集群本地来加速云上飞桨分布式训练作业。
-
数据集及其管理操作的自定义资源抽象。
将样本数据集及其管理操作抽象成Kubernetes的自定义资源,屏蔽数据操作的底层细节,减轻用户心智负担。用户可以很方便地通过操作自定义资源对象来管理数据,包括数据同步、数据预热、清理缓存、淘汰历史数据等,同时也支持定时任务。
-
基于JuiceFS加速远程数据访问。
JuiceFS是一款面向云环境设计的高性能共享文件系统,其在数据组织管理和访问性能上进行了大量针对性的优化。基于JuiceFS实现样本数据缓存引擎,能够提供高效的文件访问性能。
-
充分利用本地存储,缓存加速模型训练。
缓存组件能够充分利用计算集群本地存储,比如内存和磁盘,来缓存热点样本数据集,并配合缓存亲和性调度,在用户无感知的情况下,智能地将作业调度到有缓存的节点上。这样就不用反复访问远程存储,从而加速模型训练速度,一定程度上也能提升GPU资源的利用率。
-
统一数据接口,支持多种存储后端。
样本缓存组件支持多种存储后端,并且能提供统一的POSIX协议接口,用户无需在模型开发和训练阶段使用不同的数据访问接口,降低模型开发成本。同时样本缓存组件也要能够支持从多个不同的存储源导入数据,适配用户现有的数据存储状态。
上图是样本缓存组件以及训练组件的整体架构,其构建在 Kubernetes 上,包含如下三个主要部分:
一是自定义 API 资源(Custom Resource)。PaddleCloud中定义了三个 CRD ,用户可编写和修改对应的 YAML 来管理训练作业和样本数据集。
- PaddleJob是 Paddle 分布式训练作业的抽象,它将 Parameter Server 和 Collective 两种分布式深度学习架构模式统一到一个 CRD 中,用户通过该创建 PaddleJob 可以很方便地在 Kubernetes 集群运行分布式训练作业。
- SampleSet是样本数据集的抽象,数据可以来自远程对象存储、HDFS 或 Ceph 等分布式文件系统,并且可以指定缓存数据的分区数、使用的缓存引擎、 多级缓存目录、缓存节点等配置。
- SampleJob定义了些样本数据集的管理作业,包括数据同步、数据预热、清除缓存、淘汰历史旧数据等操作,支持用户设置各个数据操作命令的参数, 同时还指定以定时任务的方式运行数据管理作业。
二是自定义控制器(Controller Manager)。控制器在 Kubernetes 的 Operator 框架中是用来监听 API 对象的变化(比如创建、修改、删除等),然后以此来决定实际要执行的具体工作。
- PaddleJob Controller负责管理 PaddleJob 的生命周期,比如创建参数服务器和训练节点的 Pod,并维护工作节点的副本数等。
- SampleSet Controller负责管理 SampleSet 的生命周期,其中包括创建 PV/PVC 等资源对象、创建缓存运行时服务、给缓存节点打标签等工作。
- SampleJob Controller负责管理 SampleJob 的生命周期,通过请求缓存运行时服务的接口,触发缓存引擎异步执行数据管理操作,并获取执行结果。
三是缓存引擎(Cache Engine)。缓存引擎由缓存运行时服务(Cache Runtime Server)和JuiceFS存储插件( JuiceFS CSI Driver )两部分组成,提供了样本数据存储、缓存、管理的功能。
- Cache Runtime Server负责样本数据的管理工作,接收来自 SampleSet Controller 和 SampleJob Controller 的数据操作请求,调用 JuiceFS 的命令完成相关操作执行。
- JuiceFS CSI Driver是JuiceFS社区提供的CSI插件,负责样本数据的存储与缓存工作,将样本数据缓存到集群本地并将数据挂载进PaddleJob的训练节点。
查看文档 样本缓存组件快速上手 来体验下吧。
关于性能测试相关的文档请参考:性能测试
想了解更多关于自定义资源的详细,请查看文档 API docs。