云原生AIFluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍
Posted LFAPAC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生AIFluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍相关的知识,希望对你有一定的参考价值。
导读:深度学习平台在微博社交业务扮演着重要的角色。计算存储分离架构下,微博深度学习平台在数据访问与调度方面存在性能低效的问题。本文将介绍微博内部设计实现的一套全新的基于 Fluid(内含 JindoRuntime)的新架构方案,显著提升了海量小文件场景模型训练的性能和稳定性,多机多卡分布式训练场景可将模型训练的速度提升 18 倍。
背景
大规模深度学习模型训练挑战
-
计算存储分离架构导致数据访问高延时,导致训练慢:业务团队使用的深度学习任务(图像或语音模型)会访问海量小文件。实验表明,HDFS 读取海量小文件场景与本地读取对比性能相差近十倍甚至百倍。
-
Kubernetes 调度器数据缓存无感知,同一数据源多次运行访问依旧慢 :相同模型、不同超参的;微调模型、相同输入的;AutoML 等深度学习任务运行会不断重复访问同一数据,产生可以复用的数据缓存。但是由于原生的 Kubernetes 调度器无法感知缓存,导致应用调度的结果不佳,缓存无法重用,性能得不到提升。
-
多数深度学习框架并不支持 HDFS 接口,导致开发难 :比如 PyTorch,MxNet 等框架只支持 POSIX 协议接口,HDFS 接口需要额外的对接开发。因此需要同时支持模型开发阶段的 POSIX 接口以及模型训练阶段的 HDFS 接口,引入模型代码适配不同存储的复杂性。
-
HDFS 成为数据并发访问的瓶颈点,稳定性挑战大 :微博机器学习平台上百台 GPU 机器同时训练都会并发访问 HDFS 集群,同时深度学习训练的 IO 压力比较大,HDFS 服务成为了性能单点,这对 HDFS 的性能和稳定性提出了巨大的挑战。一旦某个任务拖慢了 HDFS 系统,其他的训练任务也会受到影响。而且,一旦 HDFS 无法工作,整个训练集群也会受到影响。
Fluid + JindoRuntime:为微博深度学习平台提供高效支撑
-
计算能够充分利用本地化访问数据,这样数据就不需通过网络反复读取,加速深度学习模型训练的速度和提升集群的 GPU 使用率。
-
降低 HDFS 负载压力,通过应用对于部分数据的本地读取,减小数据访问延时和提升 HDFS 的可用性。
-
充分发挥热点数据集的缓存节点优势,在对用户无感知的前提下,智能的将任务调度到数据缓存节点上。让常用的模型训练程序越来越快。
-
通过 POSIX 接口读取数据,这样无需在模型开发和训练阶段使用不同的数据访问接口,降低开发深度学习模型程序的成本。
1. 架构组件介绍
2. 使用基于 JindoRuntime 的 Fluid 的原因
-
Fluid 可以将数据集编排在 Kubernetes 集群中,实现数据和计算的同置,并且提供基于 Persistent Volume Claim 接口,实现 Kubernetes 上应用的无缝对接。同时 JindoRuntime 提供对 HDFS 上数据的访问和缓存加速能力,并且可以利用 FUSE 的 POSIX 文件系统接口实现可以像本地磁盘一样轻松使用 HDFS 上的海量文件,pytorch 等深度学习训练工具可利用 POSIX 文件接口读取训练数据。
-
针对海量小文件的远程数据访问性能问题,JindoRuntime 对小文件的数据组织管理和访问性能进行了大量针对性的优化,能够提供高效的小文件访问性能,远高于直接对 HDFS 的数据访问性能。
-
提供元数据和数据分布式分层缓存,以及高效小文件检索。
-
提供数据预热机制,避免在训练时刻拉取数据造成的数据访问竞争。
-
Slab allocation 方式组织文件数据,高效利用缓存空间。
-
通过 Fluid 的数据感知调度能力,用户无需知道缓存节点信息就可以将任务放置到有缓存数据的节点,实现数据访问性能的优势最大化。
-
对于大文件和小文件提供不同的缓存策略和存储方式,对于小文件 AI 训练场景具有很好的自适应性,无需用户配置。
3. 落地实践
-
选择合适的缓存节点 :使用 JindoRuntime 可以获得更好的数据本地性能,在实际生产中我们也发现不是所有的节点都来做缓存性能就比较好。原因是有些节点的磁盘和网络 IO 性能不是很好,这个时候需要我们能够把缓存节点尽量选择一些大容量磁盘和网络较好的节点上去。Fluid 支持 dataset 的可调度性,换言之就是缓存节点的可调度性,我们通过指定 dataset 的 nodeAffinity 来进行数据集缓存节点的调度,从而保证缓存节点可高效的提供缓存服务。
-
指定 Master 调度策略 :JindoRuntime 由 master/worker/fuse 三部分组成,master 负责集群的大脑,负责元数据和集群缓存的管理,所以 master 节点得具有很强的可靠性和故障恢复速度。在生产过程中我们发现在不使用多 master 的条件下,单个 master 也具有很强的稳定性和故障恢复速度,影响 master 节点稳定性的重要因素还是宿主机的稳定性,比如宿主机满磁盘、通信故障等,基于此我们对 mater 节点使用 nodeselector 来选择性能较好的宿主机作为 master 容器的环境,进一步保证 master 环境的稳定性。
-
定时数据预热 :在进行训练前的一个重要的步骤是进行元数据和数据的预热,Fluid 提供了 CRD 的形式进行元数据和数据的缓存,在训练前将训练文件的元数据和数据缓存到本地,可大大加速训练速度。但是存储在 HDFS 上的训练文件是每天一次更新,于是需要进行周期性定时的进行数据预热流程,基于 dataload 的 CRD,我们使用 cronJob 的形式进行周期性调度,使得在每次训练前都能够完成元数据和数据的准备,从而进行高效训练。当然 JindoRuntime 本身也支持增量同步的功能,所以每次只需要更新变化的文件即可,也大大加快了数据预热的速度。
4. 性能测试方案
5. 性能测试结果
结合 Fluid+JindoRuntime 方案,在数据预热的前提下,我们取得了非常明显的训练速度提升,从下图可以看到:在 3 机 12 卡的场景下,我们发现基于 HDFS 接口读取数据的实验往往会因为网络通信等问题中断,导致实验不能跑完,增加异常处理后,workers 之间的等待时间加长,导致增加卡数并不能增加训练速度,反而会拖慢。可以观察到 1 机 8 卡和 3 机 12 卡的场景总体训练速度基本持平,计算资源的扩容。而通过新的方案,我们发现相比于 HDFS 接口,1 机 4 卡可以得到 5 倍的加速,2 机 8 卡可以得到 9 倍的加速,3 机 12 卡可以得到 18 倍的加速。
总结:从两周到 16 小时的训练速度跃升
展望
-
支持定时任务支持动态扩缩容 -
数据预热性能的提升和元数据备份机制的提供,实现快速重建数据集的能力 -
提供性能监控控制台 -
支持 Runtime 元数据的高可用和镜像升级 -
支持规模化 K8s 集群中多数据集的全生命周期管理
[1] Fluid:
https://github.com/fluid-cloudnative/fluid
[2] JindoFS:
https://github.com/aliyun/alibabacloud-jindofs
文章转载自阿里巴巴云原生。。
LF Research诚意邀您参与:
联系关于Linux基金会
Linux基金会是非营利性组织,是技术生态系统的重要组成部分。
Linux基金会通过提供财务和智力资源、基础设施、服务、活动以及培训来支持创建永续开源生态系统。在共享技术的创建中,Linux基金会及其项目通过共同努力形成了非凡成功的投资。请长按以下二维码进行关注。
以上是关于云原生AIFluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍的主要内容,如果未能解决你的问题,请参考以下文章