如何用 Alluxio 加速云上深度学习训练?
欢迎来到【微直播间】,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智库】:
评论