【云原生AI】Fluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍(2)

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇
  • 经验技巧1 如何巧妙地回答面试官的问题
  • 经验技巧2 如何回答技术性的问题
  • 经验技巧3 如何回答非技术性问题
  • 经验技巧4 如何回答快速估算类问题
  • 经验技巧5 如何回答算法设计问题
  • 经验技巧6 如何回答系统设计题
  • 经验技巧7 如何解决求职中的时间冲突问题
  • 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
  • 经验技巧9 在被企业拒绝后是否可以再申请
  • 经验技巧10 如何应对自己不会回答的问题
  • 经验技巧11 如何应对面试官的“激将法”语言
  • 经验技巧12 如何处理与面试官持不同观点这个问题
  • 经验技巧13 什么是职场暗语

面试真题篇
  • 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
  • 真题详解2 某知名社交平台软件工程师笔试题
  • 真题详解3 某知名安全软件服务提供商软件工程师笔试题
  • 真题详解4 某知名互联网金融企业软件工程师笔试题
  • 真题详解5 某知名搜索引擎提供商软件工程师笔试题
  • 真题详解6 某初创公司软件工程师笔试题
  • 真题详解7 某知名游戏软件开发公司软件工程师笔试题
  • 真题详解8 某知名电子商务公司软件工程师笔试题
  • 真题详解9 某顶级生活消费类网站软件工程师笔试题
  • 真题详解10 某知名门户网站软件工程师笔试题
  • 真题详解11 某知名互联网金融企业软件工程师笔试题
  • 真题详解12 国内某知名网络设备提供商软件工程师笔试题
  • 真题详解13 国内某顶级手机制造商软件工程师笔试题
  • 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
  • 真题详解15 某著名社交类上市公司软件工程师笔试题
  • 真题详解16 某知名互联网公司软件工程师笔试题
  • 真题详解17 某知名网络安全公司校园招聘技术类笔试题
  • 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

资料整理不易,点个关注再走吧

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在这里插入图片描述

作者 |

吴彤 微博深度学习平台工程师

郝丽 微博深度学习平台工程师

导读:深度学习平台在微博社交业务扮演着重要的角色。计算存储分离架构下,微博深度学习平台在数据访问与调度方面存在性能低效的问题。本文将介绍微博内部设计实现的一套全新的基于 Fluid(内含 JindoRuntime)的新架构方案,显著提升了海量小文件场景模型训练的性能和稳定性,多机多卡分布式训练场景可将模型训练的速度提升 18 倍。

背景​

新浪微博是中国最大的社交媒体平台,每天上亿条内容产生并在万亿级关系的社交网络上进行传播。下图是微博的业务生态图,通过优质用户生产、传播优质内容,普通用户消费这些内容,进而关注自己喜欢的博主,建立联系,形成闭环生态。

在这里插入图片描述

微博机器学习平台的主要作用是让整个过程流转得更高效流畅:通过理解优质内容,构建用户画像,把用户感兴趣的优质内容推给用户,让他们和内容生产者互动,进而刺激生产者生产更多更好的内容, 实现信息消费者和信息生产者的双赢。而随着多媒体内容变成主流,深度学习技术就变得更为重要。从多媒体的内容理解,到 CTR 任务的优化,都离不开深度学习技术的支持。

大规模深度学习模型训练挑战

随着深度学习在微博业务场景中的广泛使用,微博深度学习平台扮演了非常核心的角色。该平台采用了存储与计算分离的架构,使得计算资源得以与存储资源解耦,从而实现了灵活的资源配比以及便捷的存储扩展,并且降低了存储成本。

在这里插入图片描述

然而,这种架构也带来了一些挑战,其中比较关键的问题体现在数据访问性能和稳定性方面:

计算存储分离架构导致数据访问高延时,导致训练慢:业务团队使用的深度学习任务(图像或语音模型)会访问海量小文件。实验表明,HDFS 读取海量小文件场景与本地读取对比性能相差近十倍甚至百倍。

Kubernetes 调度器数据缓存无感知,同一数据源多次运行访问依旧慢:相同模型、不同超参的;微调模型、相同输入的;AutoML 等深度学习任务运行会不断重复访问同一数据,产生可以复用的数据缓存。但是由于原生的 Kubernetes 调度器无法感知缓存,导致应用调度的结果不佳,缓存无法重用,性能得不到提升。

多数深度学习框架并不支持 HDFS 接口,导致开发难:比如 PyTorch,MxNet 等框架只支持 POSIX 协议接口,HDFS 接口需要额外的对接开发。因此需要同时支持模型开发阶段的 POSIX 接口以及模型训练阶段的 HDFS 接口,引入模型代码适配不同存储的复杂性。

HDFS 成为数据并发访问的瓶颈点,稳定性挑战大:微博机器学习平台上百台 GPU 机器同时训练都会并发访问 HDFS 集群,同时深度学习训练的 IO 压力比较大,HDFS 服务成为了性能单点,这对 HDFS 的性能和稳定性提出了巨大的挑战。一旦某个任务拖慢了 HDFS 系统,其他的训练任务也会受到影响。而且,一旦 HDFS 无法工作,整个训练集群也会受到影响。

通过对微博深度学习平台的监控分析,我们发现:一方面由于 IO 性能问题导致 GPU 等昂贵计算资源不能被充分利用;另一方面,我们也发现集群中的内存和本地硬盘的水位很低,余量较多并且稳定,这是由于多数的深度学习任务并不使用本地磁盘,同时内存使用率也不高。因此我们考虑如果能够充分利用集群自身的内存和磁盘资源加速数据访问会是一种更好的方案。

Fluid + JindoRuntime:为微博深度学习平台提供高效支撑

为了能更好满足大规模深度学习模型训练的计算需求,需要取得更好的数据本地性效果。因此,我们希望达到以下目标:

计算能够充分利用本地化访问数据,这样数据就不需通过网络反复读取,加速深度学习模型训练的速度和提升集群的 GPU 使用率。

降低 HDFS 负载压力,通过应用对于部分数据的本地读取,减小数据访问延时和提升 HDFS 的可用性。

充分发挥热点数据集的缓存节点优势,在对用户无感知的前提下,智能的将任务调度到数据缓存节点上。让常用的模型训练程序越来越快。

通过 POSIX 接口读取数据,这样无需在模型开发和训练阶段使用不同的数据访问接口,降低开发深度学习模型程序的成本。

为了达到上述目标,我们迫切希望找到 Kubernetes 上具有分布式缓存加速能力的软件。很幸运,我们发现 CNCF Sandbox 项目 Fluid 正好可以满足我们的诉求。于是,我们设计了基于 Fluid 的新架构方案,经过验证比较,我们选择 JindoRuntime 作为加速运行时。

在这里插入图片描述

  1. 架构组件介绍

1)Fluid

Fluid[1] 是一个运行在 Kubernetes 上可扩展的分布式数据编排和加速系统,它通过数据的编排和使用数据的应用调度,解决云原生编排框架运行此类应用面临数据访问延时高、多数据源联合分析难、应用使用数据过程复杂等痛点。

2)JindoRuntime

JindoRuntimed[2] 是 Fluid 一种分布式缓存 Runtime 的实现,基于 JindoFS 分布式缓存加速引擎。JindoFS 是阿里云 EMR 团队自研大数据存储优化引擎,完全兼容 Hadoop 文件系统接口,给客户带来更加灵活、高效的计算存储方案。JindoRuntime 使用 JindoFS 的 Cache 模式进行远端文件的访问和缓存,支持 OSS、HDFS、标准 S3 协议等多种存储产品的访问和缓存加速。在 Fluid 上使用和部署 JindoRuntime 流程简单、兼容原生 K8s 环境、可以开箱即用。深度结合对象存储特性,使用 Navite 框架优化性能,并支持免密、checksum 校验等云上数据安全功能。

  1. 使用基于 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 环境的稳定性。

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值