如何用Alluxio加速云上深度学习训练?

news2024/11/19 20:20:20

欢迎来到【微直播间】,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智库】:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

容器安装mysql

1.自己配置仓库和挂载 仓库内容如下 挂载 2.安装工具包 yum install -y yum-utils 3.从阿里云添加docker仓库 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 我们就能查看到 4.cd回主目录开始一系列安装 yum install d…

软件测评师教程之软件测试基础<一>更新中...

目录一.软件测试分类(1)按照开发阶段划分(2)按照测试实施组织划分(3)按照测试技术划分二.软件测试过程模型(1)V模型(2)W模型(3)H模型(4)X模型(5)前置测试模型(6)测试模型的使用三.软件测试策略(1)测试信息流(2)分析设计阶段1.需求说明书评测2.概要设计说明书评测3.详细设计说明…

手绘图说电子元器件-控制与保护器件

控制与保护器件主要包括继电器、开关、接插件和保险器件等,是电子电路中经常使用的器件。 继电器 继电器是一种常用的控制器件,它可以用较小的电流来控制较大的电流,用低电压来控制高电压,用直流电来控制交流电等,并且可实现控制电路与被控电路之间的完全隔离。 继电…

IPV6探测

目录本机是否支持IPv6如何确认一个网站是否开启 IPv6在线工具:IP查询在线工具:IPv6连接测试在线工具:国家IPv6发展监测平台本地工具局域网设备探测pingMSFThc-Ipv6Ipv6-Toolkit端口探测MSFNmap【存在问题】参考领导提了个问题,怎么…

Mybatis 解析mapper过程

Mapper配置的四种方式 配置方法一共有四种, 分别对应四种解析方式,从解析源码可以看出来 private void mapperElement(XNode parent) throws Exception { //添加接口映射器if (parent ! null) {for (XNode child : parent.getChildren()) { //获取所有…

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872简介 HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THDN,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。 HT6872的最大特点是…

C++:设计一个保留字(或关键字)的统计程序,从源数据文件(C或C++语言程序)中,读取字符或字符串,与保留字文件中的保留字进行匹配比较,并统计计数。

2.1题目: 设计一个保留字(或关键字)的统计程序 l建立保留字文件; l从源数据文件(C或C语言程序)中,读取字符或字符串,与保留字文件中的保留字进行匹配比较,并统计计数。…

python数据分析(1)numpy基础

iamseancheney/python_for_data_analysis_2nd_chinese_version: 《利用Python进行数据分析第2版》 (github.com) NumPy的ndarray:一种多维数组对象 1.性质 NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速…

73.qt quick-通用可拖拽表盘示例

截图如下所示: 效果如下所示: 源码已上传至专栏群(第一章底部获取)中,感兴趣的自行下载 demo使用介绍 控件自定义属性已经封装出来了,如下图所示: main.qml如下所示: import QtQuick 2.14 import QtQuick.Window 2.14 import QtQuick.Extras 1.4 import QtQuick.Layouts 1.1…

微信小程序-会议OA项目03

目录 1.Flex布局简介 1.1 什么是flex布局 1.2 flex属性 2.轮播图--组件的使用 3.会议OA项目-首页 1.Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性 1.1 什么是flex布局 1) Flex是Flexible Box的缩写&…

攻防世界-fileclude

题目 访问题目场景 阅读php代码 <?php include("flag.php"); highlight_file(__FILE__); if(isset($_GET["file1"]) && isset($_GET["file2"])) {$file1 $_GET["file1"];$file2 $_GET["file2"];if(!empty($f…

法国半导体制造企业RIBER部署MBE技术以支持量子计算

图片来源&#xff1a;网络 法国半导体制造企业RIBER在2022年进一步提升了其在量子处理器耗材市场的发展水平。 早在2021年6月&#xff0c;RIBER已开始部署系统&#xff0c;它在法国图卢兹与 法国国家科学研究中心系统分析与架构实验室&#xff08;LAAS-CNRS&#xff09;创办联合…

Google Guice 1:如何实现依赖注入?

1. 待完善的邮箱程序 1.1 手动注入依赖 前一篇博文《谈谈自己对依赖注入的理解》&#xff0c;笔者只是基于依赖注入的思想&#xff0c;为EmailClient预留了依赖注入的入口 到目前为止&#xff0c;我们只是让dependent class预留了依赖注入的入口&#xff0c;要想实现依赖的自动…

TOPLAS‘07: Effective Field-Sensitive Pointer Analysis for C 字段敏感C程序指针分析

文章目录1. 集合约束式的指针分析1.1 基本介绍1.2 求解约束1.2.1 图传播1.2.2 迭代顺序1.2.3 节点替换 (Variable Subsititution)1.2.4 传递化简 (Transitive Reduction)1.2.5 集合的表示1.2.6 差分传播1.2.7 相同解的集合2. 扩展约束模型2.1 简介2.2 处理函数指针2.3 处理字段…

NNOM第一个模型实例

目录 一、keras开发环境搭建 二、安装visual studio 2019 1. 下载安装 2. 配置使用MSVC编译器 三、编译第一个NNOM的demo 1. 下载源码 2. 安装依赖库 3. 编译auto_test 四、移植 1. 新建新的VS项目 2. 拷贝相关源码 3. 配置工程 4. 编译并运行 一、keras开发环境搭…

Java并发——线程池

线程池 一、线程池的作用 线程的创建和销毁需要占用CPU资源&#xff0c;若频繁的进行创建和销毁会产生很大的开销&#xff0c;影响性能和系统稳定性。 线程池的优点&#xff1a; 线程池可以保存创建好的线程随用随取&#xff0c;降低资源消耗&#xff08;重复利用线程池中的…

一文读懂堡垒机对企业信息安全起到的重要作用

堡垒机的发展历程大致可分为以下三个阶段&#xff1a;      第一代堡垒机&#xff1a;堡垒机最初的理念起源于跳板机&#xff0c;但跳板机无法实现对运维人员操作行为进行控制和审计&#xff0c;一旦出现违规操作导致操作事故&#xff0c;很难快速定位原因和责任人。    …

Java分析-对象头

前言 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding) HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁…

移动是否是商业bi的前景?

一 前言 五年前就有人预言商业智能BI移动化会成为必然趋势&#xff0c;如今5年时间已过&#xff0c;移动BI的普及程度并不如预期。原因主要是数据分析的交互性一直是很高的要求&#xff0c;手机屏幕的限制一直抑制了商业智能BI在移动端得到更好发挥的障碍。 比如数据看板或可…

[笔记] - springboot-jpa 使用sqlite 踩坑

前言&#xff08;可略过&#xff09; 最近准备写一些小项目来验证一下脑袋中的项目 因为是“小项目”&#xff0c;所以对于数据持久化的实现&#xff0c;就不想用mysql等很重的db了 而且不用考虑安全性&#xff0c;故首先想到的就是使用 sqlite 本地数据库即可 然后因为是使用…