案例分享|Alluxio在自动驾驶模型训练中的应用与部署

在这里插入图片描述
分享嘉宾:
杨林三-辉羲智能

关于辉羲智能:
辉羲智能致力打造创新车载智能计算平台,提供高阶智能驾驶芯片、易用开放工具链及全栈自动驾驶解决方案,运用独创性“数据闭环定义芯片”方法学,助力车企构建低成本、大规模和自动化迭代能力,实现优质高效的自动驾驶量产交付,引领数据驱动时代的高阶智慧出行。

分享提纲:

  1. 创业公司中,如何使用Alluxio?

  2. 从0-1使用 Alluxio 的过程(调研-部署-上生产)。

  3. 实践经验分享。

分享主题:
《 Alluxio 在自动驾驶模型训练中的应用与部署》

👉戳我观看完整回放👈

下文为完整文字版分享内容

自动驾驶数据闭环

在这里插入图片描述

首先分享一下自动驾驶中怎么样构建数据闭环,这个业务过程可能大家都有所了解。自动驾驶会包含多种车辆类型,比如数采车辆、带着算法在路上跑的车。数据采集就是在跑的过程中采自动驾驶车上的各种数据:比如说 camera 的数据就是图片,激光雷达的数据是点云。

传感器数据采回来,可能一辆车每天跑下来就有几T的数据。这种数据通过基盘的方式或者其他上传方式把它们整体存储起来,传到对象存储里面。原始数据存储之后会有一个 pipeline 做数据的解析预处理,比如把它切成一帧一帧的数据帧,每帧的不同传感器数据之间可能还要做同步对齐的操作。

完成数据解析之后,就要在上面做更多的挖掘。构建一个一个的数据集。因为不管是在算法、仿真或者测试里面,都要构建数据集。比如说我们想要雨天的某一个晚上,某一个路口,或者一些密集形成区域的数据,那我们就会在整个系统里面有大量的这种数据需求,要做数据的打标,打上一些标签。比如说在清华东门这个地方,需要去拿这个位置的经纬度,解析周围的 POI 。之后再对挖掘出来的数据做标注。常见的标注有:对象、行人、对象的类型等。

这种做了标注的数据,会被拿去做训练。典型的一些任务,比如目标的检测、车道线的检测、或者更大的端到端的模型。模型训练好了之后,还要做一些仿真验证。验证完再把它部署到车上面,再去跑数据,在这个基础上再去采更多的数据。就是这样的一个循环,不断的去丰富数据,不断的去构建性能更好的模型。这是整个训练,数据闭环要做的事情,也是现在自动驾驶研发里面较核心的事情。

算法训练:NAS

我们聚焦到模型训练来讲:模型训练主要是通过数据挖掘拿到数据,从而生成一个数据集。数据集在内部是一个 pkl 文件,包含数据、channel 、存储位置,最后数据算法训练的同学会自己写下载脚本,把数据从对象存储拉到本地。

在这里插入图片描述

我们在选用 Alluxio 之前,是通过 NAS 系统充当缓存的作用,把对象存储的数据拉到 NAS 上面,最后再用不同的模型,把数据 load 进来进行训练。这是使用 Alluxio 之前,大概的训练流程。

其中最大的问题在 NAS :

1.第一是并发性能比较差——NAS 我们可以理解成它就是一块大的硬盘,当只有几个任务一起跑的时候,还是比较够用的。但是当有几十个训练任务同时进行、很多模型在训练的时候,往往就会出现卡死。我们曾经有一段时间卡死非常严重,研发每天都叫苦不迭。卡得严重以至于可用性非常差、并发性能很差。

2.第二是管理困难——每一个人都用自己下载的脚本,然后把想要的数据下载到自己的目录下面。另一个人可能又自己去下另外一堆数据,放到NAS的另外一个目录下面,这样就会造成 NAS 空间满时很难做清理。当时我们基本都是当面或者微信群沟通。一方面是效率特别低,依靠群消息管理会滞后。另外一方面,也会因为手动 remove ,导致一些风险。我们曾经出现过 remove 数据时,把别人的数据集给删掉的情况。这也会造成线上任务区域的报错,这是另外一个痛点。

3.第三是空间浪费——不同人下载的数据放在不同目录下,有可能同样一帧数据会出现在好几个数据集,存在比较严重的空间浪费。

4.第四是使用很复杂——因为 pkl 里面的文件格式不相同,使得下载逻辑也不一样,每个人都要单独去写下载程序。

这是我们之前用 NAS 会面临的一些困难和问题,为了解决这些问题,我们做了调研。调研后聚焦到Alluxio上来。发现 Alluxio 它可以提供一个比较统一的缓存,缓存可以提升我们的训练速度,同时也可以减少管理成本。我们还会用 Alluxio 的系统,处理双机房的问题。通过统一的命名空间和访问方式,一方面可以简化我们的系统设计,另外在代码实现上也会变得很简单。

在这里插入图片描述

算法训练引入 Alluxio在这里插入图片描述

当我们把 NAS 换成 Alluxio 之后,Alluxio 能够针对性的解决刚才提到的一些问题:

  1. 在并发性方面。NAS 本身不是一个完全分布式的系统,而 Alluxio 是。NAS 它访问的 IO 达到一定的速度时会出现卡顿,可能达到几个 G/s 的时候就会开始卡。而 Alluxio 的上限非常高,我们下面还有专门的测试来说明这一点。

  2. 通过手动清理或者管理会非常麻烦。Alluixo 会配置缓存的逐出策略。一般是通过 LRU,当到一个 threshold 的时候(比如90%)它会自动做缓存的驱逐和清理。这样做的效果:

  • 效率大大得提升;
  • 可以避免因为误删导致的安全性问题;
  • 解决了重复数据的问题。

在 Alluxio 里面,一个 UFS 里面文件,对应到 Alluxio 就是一个路径,当所有人都去访问这个路径时,就可以拿到对应的数据,这样就不会存在重复数据的问题。另外使用上面也比较简单,我们只需要通过 FUSE 的接口方式访问,不再需要下载文件。

以上是从逻辑层面解决了我们刚才讲的各种各样问题。下面讲一讲,我们整个落地的历程,怎么从 0 到 1 实现 Alluxio 从开始的 POC 测试,到各种性能的验证,再到最后怎么样部署、运维。我们的一些实践经验。

Alluxio 部署:单机房

在这里插入图片描述

首先,我们可能会在单机房里部署,就是一定要临近 GPU,部署到 GPU 节点上。同时利用之前 GPU 上很少用的 SSD,把每个节点都利用起来,然后把 FUSE 和 worker 部署在一起。FUSE 就相当于客户端,worker 就相当于一个具有内网通信的缓存小集群,做FUSE 的服务。最后对应的通过 worker 自己对底层的对象存储做通信。

Alluxio 部署:跨机房

但是由于各种各样的原因,我们还会有跨机房的存在。现在有两个机房,每一个机房里都会有对应的 S3 服务,也会有相应的 GPU 计算节点。基本上每一个机房我们都会部署一个 Alluxio 。同时在这个过程中也要注意,一个机房里可能是两个 Alluxio 的对象存储,另外一个机房如果也要做 S3 挂载,尽量做好 bucket 名字的统一规划,不能把两个搞重了。比如这里有个 bucket 1,那里又有一个 bucket 1,会导致 Alluxio 挂载时的一些问题。

在这里插入图片描述
在这里插入图片描述

还要注意,不同的 endpoint 要注意内网和外网的区分,比如集群1的 Alluxio,挂载集群1的 endpoint 内网,在另一边就是外网,反之性能就会大打折扣。挂载之后我们可以通过同样的路径去访问不同集群上面不同 bucket 的数据,这样其实整个架构就会变得非常简单,这是跨机房部署方面。

Alluxio 测试:功能

在这里插入图片描述
想要真正把 NAS 换成 Alluxio ,在部署之前要做很多功能测试。这种功能测试,目的是让现有的算法流程通过最小程度的改造,让算法同学也能用起来。这里可能要根据各位实际情况去操作。我们当时和 Alluxio 做过接近2-3周的 POC 验证,其中会涉及到,比如说:

  • K8S 上访问 PVC 的配置;
  • 数据集的组织方式;
  • 作业提交的配置;
  • 访问路径的替换;
  • 最终访问的脚本接口。

以上遇到的诸多问题可能都要做验证,至少我们要通过它选一个典型任务,然后做一些改造,最后才能把 NAS 比较平稳的换成 Alluxio。

Alluxio 测试:性能

在这里插入图片描述
接下来在这个基础上,还要做一些性能测验。在这个过程中,不管是单机还是多机,我们都做了比较充分的测试。在单机上,Alluxio 和原来的 NAS 基本上性能是打平的。

在这里插入图片描述
其实真正体现 Alluxio 优势的是多主机上、分布式的能力。可以看到 NAS 或者我们举例的 QTS,它有一个非常明显的点:不稳定。测试3G 到 10G 间波动会比较大,同时它有一个明显的瓶颈,达到 7/8G 左右,就基本上稳定了。

而 Alluxio 这边,整个测试过程,节点随着运行实例的增加,可以达到一个非常高的上限,我们当时设到 20GB/s时,它都还是呈现出一直向上的趋势。这说明 Alluxio 整个并发的、分布式的性能非常好。

Alluxio 落地:调参适配环境

在这里插入图片描述
做完功能验证和性能测试之后,就真正的要实际部署 Alluxio 集群,部署好之后,需要一个参数调参适配的过程。因为测试时,只采用了一些典型的任务,真的上 Alluxio 环境之后,会发现随着任务增多,会有一个参数调参适配的过程。需要把 Alluxio 上面相应的参数跟实际运行环境做匹配,然后才能够把它性能给发挥好。所以会有边运行、边运维、边调参的过程。

我们经历了一些典型的调参过程,比如说:

  1. ETCD 的节点。一开始是 1 后来增加至3节点,这样就保证即便某个ETCD节点挂了,整个集群不会受到影响。

  2. 与 S3 相关的。比如说 Alluxio 在实现的时候,他会让 S3 生成一个访问比较长的路径,会在中间的路径节点,默认写一些空白,以至于让它具有更好的性能。但是这种情况下,我们训练任务下面的 S3 ,是做了权限管控的,不允许他们去写这种数据。面对这种冲突,也需要调参。

  3. FUSE 节点本身能忍受的并发强度的能力。包括它要使用的 Direct Memory 的大小,实际上也和整个业务实际运行并发的强度多少有很大关系。和能够一次性访问的数据量其实是有很大关系的,这也有一个调参的过程,不一而足。可能会在不同环境下遇到不同的问题。这也是选择 Alluxio 企业版的原因。因为在企业版的过程中 Alluxio 会有非常强的支持, 7* 24h 都可以做到遇到问题去调整、去配合。有了相互配合的周期,才能够让整个集群比较顺畅地运行起来。

Alluxio 落地:运维

我们这个团队最早运维的同学只有一个人,他负责很多底层 Infra 的维护和相关工作,当我要把 Alluxio 部署上来的时候,其实运维那边的资源是不够的,所以相当于我也兼半个运维。从自己要去运维一个东西的角度来说,要做好很多运维方面的记录和知识沉淀,特别是对一个新手来讲很重要。比如下一次出现问题怎样更好地解决,是不是之前已经有过这样的经验。

在这里插入图片描述
针对我们当时的环境,会维护好三份文档。

  1. 运维的历史记录文档:比如说哪一天出现了什么问题,这些问题我找到它根因是什么,它的解决方案是什么?具体操作是什么?

  2. 操作文档:比如我们在 K8S 上面去运维,它的重启是哪几步、操作是什么、出现问题怎样去看日志、怎样去排查、去看FUSE对应的数据是哪个任务、哪个 worker 上面去运行、监控等等。都是常用的一些操作。

  3. 配置的变更:因为 Alluxio 具体在调参的过程中。不同的时候,可能遇到的配置文件、yaml 文件是不一样的,可能还要做一些备份。可以用 Git 管理,也可以简单地采用文档管理。通过这种方式可以追溯到当前配置和历史配置版本。

在此基础上,我们还会有一些相关的配套建设,就是为了更好地使用 Alluxio。研发同学使用下来认为 Alluxio 蛮好用的。但多任务的时候,就暴露出来一些配套建设的需求。比如我们要去做图片的 resize,把图片从一开始高清4K ,降到 720P ,以便支持更多的任务缓存。

训练数据集做跨集群同步,以便更好的做数据预加载。这些都是围绕着 Alluxio 要做的系统化建设。

Alluxio 落地:共同进步

在我们不断使用 Alluxio 的过程中,也会发现一些值得改进的地方,我们通过给 Alluxio 反馈,促进了整个产品的迭代,从研发算法同学那边,他们 care 的是:

  1. 稳定性:一定要在运行过程中稳定,不能因为 Alluxio ,一些东西 crash 了,让整个系统训练受阻。这里面可能有一些运维的小技巧,比如说尽可能不要让 FUSE 重启。刚才也提到了 FUSE 重启就意味着它的访问路径,读数据文件的时候,会失败、出现 IO 的 error。

  2. 确定性:比如 Alluxio 之前建议数据不需要做预加载,即不需要在预训练之前读一遍,只需要在第一个 epoch 过程中读一遍。但是因为研发有发版周期,他要明确的知道预加载要多长的时间,如果通过第一个 epoch 去读,很难预估整个训练时间。这里面其实也会引申出来,怎样通过一个 file list 做缓存这件事情,这个也给 Alluxio 提了一些需求。

  3. 可控性:虽然 Alluxio 是可以提供自动化的基于 LRU 的缓存驱逐清理缓存。但是实际上研发还是希望,一些已经缓存过的数据,能够主动做一些清理。那么能不能也通过提供 file list,让 Alluxio 把这块数据给 free 掉。这也是我们除了间接的用 Alluxio,还要直接的、非常可控的用 Alluxio 的需求。

从运维的这一端,也会提一些需求:

  1. 配置中心:Alluxio 自己可以提供一个配置中心,把配置的历史给保存下来。增加一个功能以便实现配置项更改时,提前预算到这个改动到底影响的是什么;

  2. Trace跟踪一个命令的运行过程:另外一个比较现实一点的需求,比如现在发现一个问题:访问底层的一个 UFS 文件时延时比较高,到底是什么原因?我们看 FUSE 的日志可能看不出原因,得需要再去看 location 对应的worker日志。这其实是一个非常耗时、麻烦的过程,而且往往排查不了问题,还需要Alluxio 的线上客服支持。Alluxio 能不能加一个 Trace 命令,在要做访问的时候,把 FUSE 耗时、worker 耗时、以及从 UFS 里面读它的耗时,一个全链路的耗时问题给 Trace 出来。这样其实对整个运维过程或者排查过程会有比较大的帮助。

  3. 智能监控:有时候监控的东西是我们已经知道的东西。比如说 Direct Memory 有问题了,我们去配一个监控项。但是如果下一次一个新问题在我的日志里面出来了,它可能是一个隐藏的问题,在人不知道的情况下悄悄地发生。这种情况我们希望可以自动的监控出来。

我们通过工单反馈的方式,给 Alluxio 提了各种各样的建议。希望 Alluxio 能够在产品迭代过程中,提供更强大的功能。把整个研发、运维 care的事项,做到更好的满足。

小结

第一,从 Alluxio 在整个自动驾驶模型训练的缓存加速方面,对比 NAS 它提供了很好的可用性。对我们来说它也会有10倍左右的提升。成本的降低来源于两部分:

  • 产品采购成本低;
  • NAS可能会有20%-30%的冗余存储,Alluxio 都可以解决掉。

从可维护性的角度来讲,它可以自动清理数据,更加及时,也更加安全。易用性方面,它通过 FUSE 可以更便捷的访问数据。

第二,我也分享了辉羲是怎么样去从 0 到 1 部署 Alluxio ,运维一个系统。

以上就是我的分享,谢谢大家。

在这里插入图片描述

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

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

相关文章

设计模式5——抽象工厂模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 抽象工厂模式(Abst…

每日5题Day8 - LeetCode 36 - 40

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:36. 有效的数独 - 力扣(LeetCode) 题目要求我们进行判断,我们不需要自己填写,所以要一个标志位,来看当…

Go源码--sync库(1)sync.Once和

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

首个“软件供应链安全”国家标准正式发布!ToB企业震荡,影响90%开发者

​近日,由开源网安深度参与编制的GB/T 43698-2024《网络安全技术 软件供应链安全要求》和GB/T 43848-2024《网络安全技术 软件产品开源代码安全评价方法》两项国家标准正式发布。 GB/T 43698-2024《网络安全技术 软件供应链安全要求》,是国内首个面向软件…

Linux .eh_frame section以及libunwind

文章目录 前言一、LSB二、The .eh_frame section2.1 简介2.2 The Common Information Entry Format2.1.1 Augmentation String Format 2.3 The Frame Description Entry Format 三、The .eh_frame_hdr section四、libunwind五、基于Frame Pointer和基于unwind 形式的栈回溯比较…

双向链表C++,C#,Java版,这些程序大多已经过测试,一直在用。

先C版吧&#xff0c;我最先用的是C#,后来是Java&#xff0c;后来改用C版的&#xff0c;因为现在一直在用C&#xff0c;单链 表一直没写上去&#xff0c;因为我很少用&#xff0c;用的是双链表。 执行代码例子1&#xff1a; int main() { _DList<_string> s…

9.STL中list的常见操作(图文并茂)

目录 1.list的介绍及使用 1.1.list的构造 1.2 list iterator的使用 1.3. list capacity 1.4.list modifiers 1.5.list的迭代器失效 1.list的介绍及使用 list介绍 &#xff0c;可以通过以下图直观的感受到 vector 和 list 的区别 Vector 插入代价高&#xff0c;但便于排…

力扣HOT100 - 72. 编辑距离

解题思路&#xff1a; 动态规划 class Solution {public int minDistance(String word1, String word2) {int n1 word1.length();int n2 word2.length();int[][] dp new int[n1 1][n2 1];for (int j 1; j < n2; j) dp[0][j] dp[0][j - 1] 1;for (int i 1; i < …

《艺术大观》知网艺术刊:可加急, 出刊上网快

《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿&#xff0c;共同探索艺术领域的前沿问题&#xff0c;促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论&#xff0c;包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…

【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

目录 0. 前情提醒&#xff1a; 1. 插入排序 1.1 基本思想&#xff1a; 1.2 直接插入排序 实现步骤&#xff1a; 动图演示&#xff1a; 特性总结&#xff1a; 代码实现&#xff1a; 1.3 希尔排序&#xff08;缩小增量排序&#xff09; 基本思想&#xff1a; 步骤演示&…

AI大模型如何赋能智能座舱

AI 大模型如何赋能智能座舱 从上海车展上&#xff0c;我们看到由于智能座舱配置性价比较高&#xff0c;已经成为车企的核心竞争点之一&#xff0c;随着座舱硬件规模化装车&#xff0c;蔚小理、岚图、极狐等新势力开始注重座舱多模态交互&#xff0c;通过集成语音/手势/触控打造…

Leetcode—2769. 找出最大的可达成数字【简单】

2024每日刷题&#xff08;139&#xff09; Leetcode—2769. 找出最大的可达成数字 实现代码 class Solution { public:int theMaximumAchievableX(int num, int t) {return num t * 2;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连…

【实战】SpringBoot整合Websocket、Redis实现Websocket集群负载均衡

文章目录 前言技术积累什么是Websocket什么是Redis发布订阅Redis发布订阅与消息队列的区别 实战演示SpringBoot整合WebsoketWebsoket集群负载均衡 实战测试IDEA启动两台服务端配置nginx负载均衡浏览器访问模拟对话 前言 相信很多同学都用过websocket来实现服务端主动向客户端推…

【知识蒸馏】deeplabv3 logit-based 知识蒸馏实战,对剪枝的模型进行蒸馏训练

本文将对【模型剪枝】基于DepGraph(依赖图)完成复杂模型的一键剪枝 文章中剪枝的模型进行蒸馏训练 一、逻辑蒸馏步骤 加载教师模型定义蒸馏loss计算蒸馏loss正常训练 二、代码 1、加载教师模型 教师模型使用未进行剪枝&#xff0c;并且已经训练好的原始模型。 teacher_mod…

利用Python去除PDF水印

摘要 本文介绍了如何使用 Python 中的 PyMuPDF 和 OpenCV 库来从 PDF 文件中移除水印&#xff0c;并将每个页面保存为图像文件的方法。我们将深入探讨代码背后的工作原理&#xff0c;并提供一个简单的使用示例。 导言 简介&#xff1a;水印在许多 PDF 文件中都很常见&#x…

全国数据库管理系统设计赛-人大金仓内核实训安排正式发布

作为数据库领域国家队&#xff0c;人大金仓积极响应国家战略&#xff0c;通过赛题设计、内核技术支撑及赛前培训等多方面&#xff0c;大力支持全国大学生计算机系统能力大赛-数据库管理系统设计大赛成功举办。目前第二届全国大赛正在火热报名中&#xff0c;各种奖项等你来拿&am…

《web应用设计》第八次作业

我的小组长是姚若希&#xff0c;我们组课程设计的题目是&#xff1a;学生管理系统 &#xff0c;我认领的功能模块是&#xff1a;课程管理 2.查询并分页

只需三步,即可配置HTTPS跳转

HTTPS&#xff08;全称&#xff1a;Hyper Text Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。通过SSL/TLS协议对数据进行加密&#xff0c;保证了数据传输的安全&#xff0c;防止数据被截获、…

UWB论文:Introduction to Impulse Radio UWB Seamless Access Systems(2):脉冲;超宽带;测距;定位

3) 测距/接收器 像全球定位系统&#xff08;GPS&#xff09;这样的系统依赖于单向测距One Way Ranging&#xff08;OWR&#xff09;&#xff0c;其中多个卫星&#xff08;代表固定节点&#xff0c;称为锚点anchors&#xff09;定期传输同步的无线电数据包集合&#xff0c;这允许…

sh控制台输入文字多行 按“# ꧂ ꧁”结束

如果在Unix shell中输入多行文字&#xff0c;那么这样操作&#xff1a; 1. 打开您的终端&#xff08;Terminal&#xff09;。 2. 输入您的文字&#xff0c;每行文字后按回车键。 3. 当您完成输入所有文字后&#xff0c;输入“# ꧂ ꧁”然后按回车键&#xff0c;表示输入结束。…