共计 3973 个字符,预计需要花费 10 分钟才能阅读完成。
欢送来到【微直播间】,2min 纵览大咖观点
随着企业数据量的一直减少,为了进步深度学习训练的准确性、加快速度并且降低成本,许多企业开始逐渐在云上施行分布式训练的计划,本期内容将联合阿里、微软等理论利用案例,分享如何通过 Alluxio 减速云上深度学习。
内容次要围绕两个局部开展:
内容概要:
Alluxio 及其 POSIX API 简介
Alluxio 是一个 java 开源我的项目,是云上的对于数据分析以及深度学习训练的一个数据抽象层。
应用 Alluxio,能够对数据利用以及数据源进行无缝连贯。
Alluxio 的一个很重要性能是可能对数据进行读写缓存,另一方面也能够对元数据进行本地缓存。
Alluxio 能够把来自不同的远端存储系统,以及分布式文件系统的数据都挂载到 Alluxio 对立的命名空间之内。通过 Alluxio POSIX API,把这些数据变成相似于本地文件的模式,提供给各种训练任务。
应用 Alluxio 减速云上训练
Level 1 读取缓存与减速:间接通过 Alluxio 来减速对底层存储系统中的数据拜访。
Level 2 数据预处理和训练:之所以有二级玩法,次要因为一级玩法有一些先决条件,要么数据曾经解决好就放在存储系统中,要么训练脚本曾经蕴含了数据预处理的步骤,数据预处理与训练同时进行,而咱们发现在很多用户场景中,并不具备这些条件。
Level 3 数据抽象层:把 Alluxio 作为整个数据的形象层。以上仅为大咖演讲概览,残缺内容点击视频观看:
附件:大咖分享文字版残缺内容可见下文
Alluxio 及其 POSIX API 简介
Alluxio 是一个 java 开源我的项目,是云上的对于数据分析以及深度学习训练的一个数据抽象层。在 Alluxio 之上能够对接不同的数据利用,包含 Spark、Flink 这种 ETL 工具,Presto 这种 query 工具,以及 TensorFlow、PyTorch 等深度学习框架。在 Alluxio 上面也能够连贯不同数据源,比方阿里云、腾讯云、HDFS 等。
应用 Alluxio,能够对数据利用以及数据源进行无缝连贯,Alluxio 负责解决与不同数据源以及不同零碎的对接。
Alluxio 的一个很重要性能是可能对数据进行读写缓存。大家可能很多数据是在云存储上,或者是在远端的 HDFS 和 Ceph 集群上,如果每一次的数据利用都要去远端一直反复地拿同样的数据,那么整个拿数据的流程是十分耗时的,而且可能会导致咱们整体训练或数据处理效率不高。通过 Alluxio,咱们能够把一些热数据在凑近数据利用的集群进行缓存,从而晋升反复数据获取的性能。
另一方面,咱们也能够对元数据进行本地缓存。每一次获取元数据都要通过网络去获取是比较慢的。如果通过 Alluxio,能够间接从本地集群获取元数据,延时会大大缩短。同时,模型训练的元数据需要是十分低压的,咱们在与蚂蚁金服的试验中,能够看到成千上万 QPS,如果全副压力都压到存储系统中,存储系统可能会不稳固,或进行肯定的限流解决,导致一些读取谬误。通过 Alluxio 能够很好地分担这部分元数据的压力。
接下来重点解说一下 Alluxio 的 POSIX API。深度学习训练框架 PyTorch、TensorFlow、Caffe,它们的原生数据源都是本地文件系统。企业数据量日益扩充,导致咱们须要去应用分布式数据源。Alluxio 能够把来自不同的远端存储系统,以及分布式文件系统的数据都挂载到 Alluxio 对立的命名空间之内。通过 Alluxio POSIX API,把这些数据变成相似于本地文件的模式,提供给各种训练任务。
上图直观地展示了 Alluxio POSIX API 把远端的分布式数据变成了本地文件夹的模式。
应用 Alluxio 减速云上训练
上面来具体解说如何应用 Alluxio 来减速云上训练。
Level 1 读取缓存与减速
一级玩法比较简单,就是间接通过 Alluxio 来减速对底层存储系统中的数据拜访。
如上图示例,咱们有一些数据存储在咱们的存储系统中,它可能是曾经通过数据预处理的数据,也可能是一些原始数据。咱们的训练在云上的 K8s 集群上,与数据源之间存在肯定的天文差别,获取数据存在延时。咱们的训练须要反复去获取同样的数据源,在这种状况下,应用 Alluxio 集群,在凑近训练的集群内进行数据的缓存能够极大地晋升咱们获取数据的性能。
能够用简略的命令来设置数据源,以及一些平安参数,让 Alluxio 能够去拜访这些数据源。提供了数据源地址以及平安参数之后,就能够把它挂载到 Alluxio 命名空间内的一个文件夹目录上面。挂载后,能够用一个命令来把所有的数据都一键地分布式加载到 Alluxio 当中,这样所有数据都会进行分布式的缓存,为咱们的训练任务提供本地数据性能。
上图是阿里巴巴进行的一个实测,如果他们的训练通过 oss Fuse 间接去拜访阿里云存储,整个性能可能是几百兆每秒,而通过 Alluxio 进行缓存后,能够达到千兆每秒。
在 Microsoft,他们的场景是:训练数据全副存在 Microsoft Azure 外面,有超过 400 个工作须要从 Azure 读数据,并写回到 Azure 中。这 400 个工作会波及到上千个节点,而他们的训练数据又是比拟对立的。在应用 Alluxio 之前,他们的计划是把一份数据从 Azure 中不停地拷贝到上千台机器上。整个过程耗时大,并且因为任务量太大了,经常会导致 Azure 对他们的数据申请进行限流解决,从而导致下载失败,还要人工去复原下载。通过应用 Alluxio 之后,Alluxio 能够从 Azure 拿取一份数据,而后同样的一份数据能够供应不同的训练任务以及不同的机器,这样 load 一次数据,就能够进行屡次读取。
在应用 Alluxio 之后,训练任务无需期待数据齐全下载到本地就能够开始训练了。训练完结之后,也能够通过 Alluxio 间接写回到 Azure。整个流程十分不便,并且 gpu 的使用率比较稳定。
Level 2 数据预处理和训练
接下来看二级玩法。之所以会有二级玩法,次要是因为一级玩法有一些先决条件,要么数据曾经解决好就放在你的存储系统中,要么你的训练脚本曾经蕴含了数据预处理的步骤,数据预处理与训练同时进行,然而咱们发现在很多用户场景中,并不具备这些条件。
在很多用户的场景里,他们须要用其它形式来先对数据进行预处理,而后这部分预处理后的数据能力供应训练。比方会用 Spark、Flink 等大数据 ETL 工具来进行数据预处理,解决好的数据写到 Alluxio,之后由 Alluxio 供应给训练集群。同时,对这部分数据能够进行备份、减速,来更快地提供给训练集群。
咱们通过一个具体案例来理解这个流程。在 BOSS 直聘,他们有两个工作,首先是用 Spark/Flink 来对数据进行预处理,之后再对这部分预处理好的数据进行模型训练。所有的两头后果和最初解决好的数据,都间接长久化到 Ceph 上,再由 Ceph 为模型训练提供数据。把两头处理结果也放到 Ceph 中,会给 Ceph 减少很多的压力。低压的模型训练给 Ceph 造成很大压力。当 ETL 工作以及训练多的时候,Ceph 十分不稳固,整体性能受到影响。他们的解决办法就是把 Alluxio 加到 Spark/Flink 和模型训练之间。
Spark/Flink 把两头后果写到 Alluxio 之中,由 Alluxio 来提供给模型训练。Alluxio 在背地异步地把这部分数据长久化到 Ceph 中,以保障这些预处理好的数据不会失落。所以无论咱们的数据源是在本地还是远端,即便数据长久化的速度比较慢,也不影响咱们的训练流程。并且 Alluxio 能够是一些独自的集群,如果 ETL 或 training 工作多的时候,能够起更多的 Alluxio cluster 来分担这些工作,也能够对不同的 Alluxio 集群进行资源分配、读写限额、权限管制等。
这个流程能够晋升存储系统的稳定性,同时减速从数据预处理到训练的整个流程,并且能够用更多的 Alluxio 集群来应答更多的 ETL 或训练需要。
咱们发现大家会有不同的数据预处理形式。有些用户用 C ++、python 程序来进行数据清理、转换等数据预处理。他们应用 Alluxio 把原始数据从底层存储系统中加载到 Alluxio 的缓存内,由 Alluxio 提供这部分数据预处理的框架,解决好的后果再写回到 Alluxio 当中,模型训练就能够用这部分预处理好的数据进行训练。
Level 3 数据抽象层
Alluxio 的三级玩法,就是把 Alluxio 作为整个数据的形象层。
整个训练集群,不论它须要的数据源来自何方,来自一些存储系统,由大数据 ETL 解决好的数据,或者是 C ++、python 解决好的数据,都能够通过 Alluxio 进行读缓存,供应给训练。
另一方面,所有数据预处理的两头数据,以及训练的两头数据,都能够通过 Alluxio 进行临时的写缓存。对于数据预处理和训练的后果,咱们也能够通过 Alluxio 长久化到不同的存储系统之中。
不论大家有什么样的数据利用,都能够通过 Alluxio 来对不同的数据源中的数据进行读写操作。
比方陌陌,有很多 Alluxio 集群,数千个节点,存储超过 100TB 的数据,服务于搜寻以及训练任务,他们还在一直地开发新的利用场景。
陌陌把 Alluxio 用作一个二十亿的小文件的训练。
他们应用 Alluxio 来减速举荐零碎模型的加载,以及 ANN 零碎 index 的加载。
总结一下,Alluxio 可能在以下这些场景对企业有所助益:想要进行分布式训练;有大量的数据,可能无奈在本地磁盘残缺地存下来,或者有大量的小文件 / 小图片;想要通过网络 I / O 间接去读取数据,但网络 I / O 性能无奈满足 GPU 需要;保障存储系统的稳定性,防止超出限额的状况;在多个不同的训练任务中进行数据分享。
想要理解更多对于 Alluxio 的干货文章、热门流动、专家分享,可点击进入【Alluxio 智库】: