热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

毫末智行Fluid实践:云原生AI让汽车变得“更聪明”

引言:Fluid是云原生基金会CNCF下的云原生数据编排和加速项目,由南京大学、阿里云及Alluxio社区联合发起并开源。本文主要介绍毫末智行机器学习平

引言:Fluid 是云原生基金会 CNCF 下的云原生数据编排和加速项目,由南京大学、阿里云及 Alluxio 社区联合发起并开源。本文主要介绍毫末智行机器学习平台在自动驾驶场景的使用,以及如何基于 Fluid +JindoFS 突破原有存储与计算分离架构带来的性能瓶颈,从而提高生产资源利用率,有效缓解 OSS 带宽压力,并且大大提高训练效率的生产实践。

自动驾驶商业应用正驶入快车道

毫末智行是一家致力于自动驾驶,提供智能物流解决方案的人工智能技术公司。企业使命为以零事故、零拥堵、自由出行和高效物流为目标, 协助客户重塑和全面升级整个社会的出行及物流方式。

数据智能是毫末智行的核心能力,乘用车自动驾驶系统及解决方案、低速无人车生态系统及解决方案、自动驾驶相关产品研发与定制服务三大垂类产品为数据智能服务, 数据智能反哺三大垂类产品,巩固其在各自市场内的绝对领先地位。经近10年的积累与全栈自研,以及90%以上的研发投入,在乘用车、低速无人车、智能硬件三个方 面不断积累相关数据,目前已孵化出小魔盒、小魔驼、小魔盘等10余款成熟产品。

毫末智行的快速发展也体现着更高级别的智能驾驶将在更广泛的场景中发挥作用,自动驾驶的商业应用正在驶入快车道。

传统机器学习训练效能遭遇瓶颈

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

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

1、计算存储分离架构导致数据访问高延时,导致训练慢:

业务团队使用的机器学习任务在训练过程中要实时频繁访问 OSS 上的数据,在 OSS 带宽受限或者压力较大时, 访问 OSS 上数据速度比访问本地文件速度要慢很多;

2、Kubernetes 调度器数据缓存无感知,同一数据源多次运行访问依旧慢:

在现实应用中深度学习任务运行会不断 重复访问同一数据,包括相同模型不同超参的任务、微调模型相同输入的任务、以及 AutoML 任务等。这种深度学习任务的重复数据访问就产生了可以复用的数据缓存。然而,由于原生 Kubernetes 调度器无法感知缓存,导致应用调度的结果不佳,缓存无法重用,性能难以提升;

3、OSS 成为数据并发访问的瓶颈点,稳定性挑战大:

毫末机器学习平台上的大量机器学习任务在同时训练时都会并发访问后端 OSS 存储。这种并发机器学习训练造成的 IO 压力比较大, OSS 服务成为了性能单点,一旦 OSS 带宽出现瓶颈则会影响所有机器学习任务;

4、训练文件分散,元数据压力大:

机器学习任务的训练数据文件通常会分散在不同路径下,读取文件需要耗费大量的时间在 list 操作上。对象存储的 list 操作性能较差, 因此在进行大规模 list 时对 OSS 元数据压力很大,经常出现超时或者 list 失败的情况。

在现实应用中,通过对于毫末机器学习平台的监控分析,我们发现 IO 性能问题会导致 GPU 等昂贵计算资源不能被充分利用。机器学习自身训练的特点导致了数据文件访问较分散, 元数据压力较大。如果能够精细化地缓存元数据和文件数据,那么一方面可以提高缓存效率和磁盘利用率,另一方面也可以解决文件查找操作带来的元数据损耗。

基于 Fluid+JindoRuntime 加速模型推理训练的生产实践

为了能更好地满足大规模机器学习模型训练的高效性需求,模型训练过程中需要对数据访问取得更好的数据本地化效果。因此,我们希望达到以下目标:

  • 计算能够充分利用本地化数据访问:这样就不需通过网络反复读取,从而加速机器学习模型的训练速度,并提升集群的 GPU 使用率。
  • 降低 OSS 负载压力:通过应用对于部分数据的本地读取,减小数据访问延时和降低对底层 OSS 的带宽压力。
  • 充分发挥热点数据集的缓存节点优势:在对用户无感知的前提下,智能地将任务调度到数据缓存节点上,从而使得常用模型训练程序越来越快。
  • 自定义文件列表形式缓存指定文件:只缓存训练需要的文件,极大提高缓存使用率和磁盘利用率。
  • 元数据缓存和数据缓存分离:可单独对文件进行元数据缓存,缓存策略定制化。
  • 通过 POSIX 接口读取数据:这样无需在模型开发和训练阶段使用不同的数据访问接口,降低开发机器学习模型程序的成本。

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

3.1 技术方案

  • Fluid

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

  • JindoRuntime

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

之所于选型基于JindoRuntime 的 Fluid,主要是基于以下考虑:

  • Fluid 可以将数据集编排在 Kubernetes 集群中,实现数据和计算的同置,并且提供基于 Persistent Volume Claim 接口,实现 Kubernetes 上应用 的无缝对接。同时 JindoRuntime 提供对 OSS 上数据的访问和缓存加速能力,并且可以利用 FUSE 的 POSIX 文件系统接口实现可以像本地磁盘一样轻松使用 OSS 上的海量文件,pytorch 等深度学习训练工具可利用 POSIX 文件接口读取训练数据。
  • 提供元数据和数据分布式缓存,可单独进行元数据缓存预热。
  • 提供元数据缓存预热,避免训练文件在OSS上大量元数据操作、提供数据预热机制,避免在训练时刻拉取数据造成的数据访问竞争
  • 提供文件列表形式的数据定制化预热,精细化预热数据。
  • 通过 Fluid 的数据感知调度能力,用户无需知道缓存节点信息就可以将任务放置到有缓存数据的节点,实现数据访问性能的优势最大化。

3.2 落地实践

  • 选择合适的缓存节点:

使用 JindoRuntime 可以获得更好的数据本地性能,在实际生产中我们发现不是所有节点都来做缓存性能就比较好。原因是有些 节点的磁盘和网络 IO 性能不是很好,这个时候需要我们能够把缓存节点尽量选择到一些大容量磁盘和网络较好的节点上。Fluid 支持 dataset 的可调度性,换言 之,就是缓存节点的可调度性,我们通过指定 dataset 的 nodeAffinity 来进行数据集缓存节点的调度,从而保证缓存节点可高效的提供缓存服务。

  • 配置缓存容量与路径:

通过 dataset 的 Mounts 和 JindoRuntime 的 tieredstore 可以设定数据的挂载目录。同时,为避免数据量过多而导致 缓存量过于庞大,可手动配置 JindoRuntime 的 tieredstore 来约束缓存的最大容量与水位线(超过水位线的数据会被自动丢弃),tieredstore 也包含对缓存 存放路径的设定与存储层(SSD/MEM/HDD)的设定,以满足各种场景的需要。对于多节点的场景,使用dataset 的 replacement 可以支持在同一集群上部署多个 dataset。

  • 设定缓存安全策略:

在Fluid中创建Dataset时,有时候我们需要在mounts中配置一些敏感信息,如 oss 账号的 accessKeyId、accessKeySecret 。为了保证安全,Fluid提供使用Secret来配置这些敏感信息的能力。通过创建Secret,dataset 以 EncryptOptions 字段指定 Secret 的 name,实现对敏感信息的绑定。

  • 数据预加载:

对于已经创建完成的 dataset 和 jindoruntime,第一次访问挂载的数据会经历一次下载数据目录下全部文件的过程,这就产生了一个问题:若数据所在的目录存在无需使用的其他数据,会造成无意义的空间资源与网络资源浪费。为避免这种问题,Fluid 既支持对数据的预加载,同时也支持元数据缓存。通 过创建 dataload读取所要预加载数据路径信息,可以动态将数据注入。dataload 支持缓存元数据与屏蔽非预加载数据的访问,这样就大大降低的数据访问效率。

3.3 带来的性能显著提升

我们使用了不同的模型,推理和训练相同的数据,分别以使用 JindoRuntime 和不使用 JindoRuntime 的方式推理和训练,对比训练时长,发现性能带来了显示提升:

模型在云端推理1万帧图片的测试结果

另一个稍大的模型在云端推理1万帧图片的测试结果

模型使用 4 卡在云端训练1万帧图片帧耗时测试结果

集成了 Fluid+JindoRuntime 后,显著提升了云端训练和推理的效率,尤其是一些小模型,在云端做训练和推理 JindoRuntime 可以有效解决 IO 瓶颈问题,训练速度最高可提升约 300% 。同时也大幅度提升云端 GPU 使用效率,加速了在云端数据驱动的迭代效率。

共建 Fluid 开源生态,让更多行业更“聪明”

毫末机器学习训练场景对于数据读取有较高的性能要求,且对于元数据和数据缓存的精细化控制要求较高, 通过 Fluid + JindoRuntime 的缓存能力可以灵活地缓存 OSS 训练文件进行元数据和数据,提供高效的元数据和数据访问性能。基于这种方案,我们可以实现精细化控制缓存的内容,提高生产资源利用率,不仅有效缓解了 OSS 带宽的压力,也大大提高了训练效率。

当前 Fluid + JindoRuntime 能够满足生产环境的基本需要,对 OSS 的加速效果也比较明显,提供的精细化缓存策略更加高效。我们期望能够把弹性的数据加速作为毫末机器学习平台的差异化竞争能力,提升整体训练任务速度和计算资源的利用率。在未来的工作中,我们也希望也帮助社区不断演进,帮助到更多的开发者。具体来说,后面在平台中计划增加的功能包括:

  • 支持定时任务支持动态扩缩容
  • 提供性能监控控制台
  • 支持规模化 K8s 集群中多数据集的全生命周期管理
  • 支持对缓存数据和缓存元数据的动态删减

致谢

感谢阿里云 JindoFS 团队的辰山、扬礼和容器团队的车漾在整个方案设计和优化过程中的巨大帮助,对生产过程中的需求给予定制化的支持,对遇到的各种问题进行快速的帮助和解决。

相关链接

[1] Fluid:https://github.com/fluid-cloudnative/fluid

[2] JindoFS: https://github.com/aliyun/alibabacloud-jindodata

原文链接

本文为阿里云原创内容,未经允许不得转载。


推荐阅读
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 如何使用代理服务器进行网页抓取?
    本文介绍了如何使用代理服务器进行网页抓取,并探讨了数据驱动对竞争优势的重要性。通过网页抓取,企业可以快速获取并分析大量与需求相关的数据,从而制定营销战略。同时,网页抓取还可以帮助电子商务公司在竞争对手的网站上下载数百页的有用数据,提高销售增长和毛利率。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 携手生态伙伴,希捷发布银河X16数据存储方案
    2019年6月26日,希捷科技在北京举办“容海量数据筑云之基石”——2019希捷科技企业级生态合作伙伴沟通会暨银河ExosX16新品发布会。在本次发布会上࿰ ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
author-avatar
手机用户2502858341
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有