如何使用分布式存储系统促进 AI 模型训练

news2024/11/24 20:28:08

在处理小型数据集和简单算法时,传统的机器学习模型可以存储在独立机器或本地硬盘驱动器上。然而,随着深度学习的发展,团队在处理更大的数据集和更复杂的算法时越来越多地遇到存储瓶颈。

这凸显了分布式存储在人工智能(AI)领域的重要性。JuiceFS 是一个开源、高性能的分布式文件系统,为这个问题提供了解决方案。

在本文中,我们将讨论 AI 团队面临的挑战,JuiceFS 如何加速模型训练,以及加速模型训练的常见策略。

AI 团队面临的挑战

AI 团队经常遇到以下挑战:

  • 大型数据集:随着数据和模型大小的增长,独立存储无法满足应用程序需求。因此,分布式存储解决方案成为解决这些问题的必要条件。
  • 完整存档历史数据集:在某些情况下,每天都会生成大量新数据集,并且必须作为历史数据存档。这在自动驾驶领域尤其重要,因为道路测试车辆收集的数据(如雷达和摄像头数据)是公司的宝贵资产。在这些情况下,独立存储被证明是不够的,因此分布式存储成为必要的考虑因素。
  • 小文件和非结构化数据过多:传统的分布式文件系统难以管理大量小文件,导致元数据存储负担沉重。这对于视觉模型尤其成问题。为了解决这个问题,我们需要一个针对存储小文件进行优化的分布式存储系统。这确保了高效的上层训练任务和大量小文件的轻松管理。
  • 用于培训框架的 POSIX 接口:在模型开发的初始阶段,算法科学家通常依靠本地资源进行研究和数据访问。但是,当扩展到分布式存储以满足更大的训练需求时,原始代码通常需要最少的修改。因此,分布式存储系统应支持 POSIX 接口,以最大程度地兼容在本地环境中开发的代码。
  • 共享公共数据集和数据隔离:在某些领域,例如计算机视觉,权威的公共数据集需要在公司内的不同团队之间共享。为了促进团队之间的数据共享,这些数据集通常集成并存储在共享存储解决方案中,以避免不必要的数据重复和冗余。
  • 基于云的训练中的数据 I/O 效率低:基于云的模型训练通常使用对象存储作为存储-计算分离架构的基础存储。但是,对象存储的读写性能不佳可能会导致训练期间出现重大瓶颈。

JuiceFS 如何帮助提高模型训练效率

什么是JuiceFS?

JuiceFS 是一个开源、云原生的分布式文件系统,兼容 POSIX、HDFS 和 S3 API。JuiceFS 采用解耦架构,将元数据存储在元数据引擎中,并将文件数据上传到对象存储,提供高性价比、高弹性的存储解决方案。

JuiceFS 的用户遍布 20 多个国家,包括人工智能、互联网、汽车、电信、金融科技等行业的龙头企业。

模型训练场景中 JuiceFS 的架构。

模型训练场景中的 JuiceFS

上图展示了 JuiceFS 在模型训练场景中的架构,由三个组件组成:

  • 元数据引擎:任何数据库,如 Redis 或 MySQL,都可以用作元数据引擎。用户可以根据自己的需求做出选择。
  • 对象存储:您可以使用公有云或自托管提供的任何受支持的对象存储服务。
  • 果汁FS客户端:要像访问本地硬盘一样访问 JuiceFS 文件系统,用户需要将其挂载在每个 GPU 和计算节点上。

底层存储依赖于对象存储中的原始数据,每个计算节点都有一些本地缓存,包括元数据和数据缓存。

JuiceFS 设计允许在每个计算节点上多级本地缓存:

  • 第一级:基于内存的缓存
  • 第二级:基于磁盘的缓存

对象存储仅在缓存渗透时访问。

对于独立模型,在第一轮训练中,训练集或数据集通常不会命中缓存。但是,从第二轮开始,有了足够的缓存资源,几乎不需要访问对象存储。这可以加速数据 I/O。

JuiceFS 中的读写缓存流程

我们之前比较了使用或不使用缓存来训练访问对象存储时的效率。结果表明,JuiceFS 的元数据缓存和数据缓存,与对象存储相比,平均性能提升了 4 倍以上,性能提升了近 7 倍。

下图显示了在 JuiceFS 中读写缓存的过程:

JuiceFS 的读写缓存流程

对于上图中的“块缓存”,块是 JuiceFS 中的一个逻辑概念。每个文件分为多个 64 MB 的块,以提高大文件的读取性能。这些信息缓存在 JuiceFS 进程的内存中,以加速元数据访问效率。
JuiceFS 中的读缓存流程:

1. 应用程序(可以是 AI 模型训练应用程序,也可以是任何启动读取请求的应用程序)发送请求。

2. 请求进入左侧的内核空间。内核检查请求的数据在内核页面缓存中是否可用。如果没有,请求会回到用户空间中的 JuiceFS 进程,该进程处理所有读写请求。

默认情况下,JuiceFS 在内存中维护一个读取缓冲区。当请求无法从缓冲区检索数据时,JuiceFS 会访问块缓存索引,这是一个基于本地磁盘的缓存目录。JuiceFS 将文件划分为 4 MB 块进行存储,因此缓存粒度也是 4 MB。

例如,当客户端访问文件的一部分时,它仅将与该部分数据对应的 4 MB 块缓存到本地缓存目录,而不是整个文件。这是 JuiceFS 与其他文件系统或缓存系统的显著区别。

3. 块缓存索引在本地缓存目录中快速定位文件块。如果找到文件块,JuiceFS 会从本地磁盘读取,进入内核空间,并将数据返回给 JuiceFS 进程,再将数据返回给应用。

4. 读取本地磁盘数据后,也会缓存在内核页面缓存中。这是因为如果不使用直接 I/O,Linux 系统会默认将数据存储在内核页面缓存中。内核页面缓存可加快缓存访问速度。如果第一个请求命中并返回数据,则请求不会通过用户空间 (FUSE) 层中的文件系统进入用户空间进程。如果没有,JuiceFS 客户端会通过缓存目录来获取这些数据。如果在本地找不到,则会将网络请求发送到对象存储,然后提取数据并将其返回到应用程序。

5. 当 JuiceFS 从对象存储下载数据时,数据会异步写入本地缓存目录。这可确保下次访问同一块时,可以在本地缓存中命中该块,而无需再次从对象存储中检索它。

与数据缓存不同,元数据缓存时间更短。为了确保强一致性,默认情况下不缓存 Open 操作。考虑到元数据流量较低,其对整体 I/O 性能的影响很小。但是,在小文件密集型场景中,元数据的开销也占据了一定的比例。

为什么AI模型训练太慢?

当你使用 JuiceFS 进行模型训练时,性能是你应该考虑的关键因素,因为它直接影响训练过程的速度。有几个因素可能会影响 JuiceFS 的培训效率:

元数据引擎

元数据引擎(如 Redis、TiKV 或 MySQL)的选择会在处理小文件时显著影响性能。一般来说,Redis 比其他数据库快 3-5 倍。如果元数据请求速度较慢,请尝试使用更快的数据库作为元数据引擎。

对象存储

对象存储会影响数据存储访问的性能和吞吐量。公有云对象存储服务提供稳定的性能。如果您使用自建对象存储(例如 Ceph 或 MinIO),则可以优化组件以提高性能和吞吐量。

本地磁盘

缓存目录存储的位置对整体读取性能有重大影响。在高缓存命中率的情况下,缓存磁盘的 I/O 效率会影响整体 I/O 效率。因此,您必须考虑存储类型、存储介质、磁盘容量和数据集大小等因素。

网络带宽

第一轮训练后,如果数据集不足以在本地完全缓存,网络带宽或资源消耗会影响数据访问效率。在云中,不同的机器型号具有不同的网卡带宽。这也会影响数据访问速度和效率。

内存大小

内存大小会影响内核页缓存的大小。当有足够的内存时,剩余的可用内存可以作为 JuiceFS 的数据缓存。这可以进一步加快数据访问速度。

但是,当可用内存很少时,您需要通过本地磁盘获取数据访问权限。这会导致访问开销增加。此外,在内核模式和用户模式之间切换会影响性能,例如系统调用的上下文切换开销。

如何排查 JuiceFS 中的问题

JuiceFS 提供了许多工具来优化性能和诊断问题。

工具#1:命令juicefs profile

您可以运行该命令来分析访问日志以进行性能优化。挂载每个文件系统后,都会生成访问日志。但是,访问日志不会实时保存,仅在查看时显示。juicefs profile

与查看原始访问日志相比,该命令聚合信息并执行滑动窗口数据统计信息,按响应时间从高到低对请求进行排序。这有助于您专注于响应时间较慢的请求,进一步分析请求与元数据引擎或对象存储之间的关系。juicefs profile

工具#2:命令juicefs stats

该命令从宏观角度收集监视数据并实时显示。它监控当前挂载点的 CPU 使用率、内存使用率、内存中的缓冲区使用率、FUSE 读/写请求、元数据请求和对象存储延迟。通过这些详细的监控指标,可以轻松查看和分析模型训练期间的潜在瓶颈或性能问题。juicefs stats

其他工具

JuiceFS 还提供了 CPU 和堆分析的性能分析工具:

  • CPU 分析工具分析了 JuiceFS 进程执行速度的瓶颈,适合熟悉源代码的用户。
  • 堆分析工具会分析内存使用情况,尤其是在 JuiceFS 进程占用大量内存时。有必要使用堆分析工具来确定哪些函数或数据结构消耗了大量内存。

加速AI模型训练的常用方法

元数据缓存优化

您可以通过两种方式优化元数据缓存,如下所示。

调整内核元数据缓存的超时

参数 、 和对应于不同类型的元数据:--attr-cache--entry-cache--dir-entry-cache

  • attr表示文件属性,例如大小、修改时间和访问时间。
  • entry表示 Linux 中的文件和相关属性。
  • dir-entry表示目录及其包含的文件。

这些参数分别控制元数据缓存的超时。

为了保证数据的一致性,这些参数的默认超时值仅为1秒。在模型训练场景中,不会修改原始数据。因此,可以将这些参数的超时时间延长到几天甚至一周。请注意,元数据缓存无法主动失效,只能在超时期限到期后刷新。

优化 JuiceFS 客户端的用户级元数据缓存

打开文件时,元数据引擎通常会检索最新的文件属性以确保强一致性。但是,由于通常不会修改模型训练数据,因此可以启用该参数,并且可以设置超时以避免每次打开同一文件时重复访问元数据引擎。--open-cache

此外,该参数控制缓存文件的最大数量。默认值为 10,000,这意味着最近打开的 10,000 个文件的元数据最多将缓存在内存中。可以根据数据集中的文件数调整此值。--open-cache-limit

数据缓存优化

JuiceFS 数据缓存包括内核页面缓存和本地数据缓存:

  • 内核页面缓存不能通过参数调整。因此,在计算节点上预留足够的空闲内存,以便 JuiceFS 能够充分利用它。如果计算节点上的资源紧张,JuiceFS 不会在内核中缓存数据。
  • 本地数据缓存可由用户控制,缓存参数可根据具体场景进行调整。
    • --cache-size调整缓存大小,默认值为 100 GB,这足以满足大多数方案的需求。但是,对于占用特别大的存储空间的数据集,需要适当调整缓存大小。否则 100 GB 的缓存空间可能会很快被填满,使得 JuiceFS 无法缓存更多数据。
    • 另一个可以与之一起使用的参数是 。它确定缓存磁盘上的可用空间量。默认值为 0.1,它允许将最多 90% 的磁盘空间用于缓存数据。--cache-size--free-space-ratio

JuiceFS 也支持同时使用多个缓存盘。建议尽可能使用所有可用磁盘。数据将通过轮询均匀分布到多个磁盘,实现负载均衡,最大化多个磁盘的存储优势。

缓存预热

为了提高训练效率,您可以使用缓存预热来加速训练任务。JuiceFS 支持在客户端预热元数据缓存和本地数据缓存。该命令会提前构建缓存,以便在训练任务开始时缓存可用,从而提高效率。juicefs warmup

增加缓冲区大小

缓冲区大小也会影响读取性能。默认情况下,缓冲区大小为 300 MB。但在高通量训练场景中,这可能还不够。您可以根据训练节点的内存资源调整缓冲区大小。

一般来说,缓冲区大小越大,读取性能越好。但不要将值设置得太大,尤其是在最大内存有限的容器环境中。有必要根据实际工作负载设置缓冲区大小,并找到一个相对合理的值。可以使用本文前面介绍的命令实时监视缓冲区使用情况。juicefs stats

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

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

相关文章

半监督学习笔记

聚类假设 假设输入数据点形成簇,每个簇对应于一个输出类,那么如果点在同一个簇中,则它们可以认为属于同一类。聚类假设也可以被视为低密度分离假设,即:给定的决策边界位于低密度地区。两个假设之间的关系很容易看出。一…

C++ 智能指针的原理、分类、使用

1. 智能指针介绍 为解决裸指针可能导致的内存泄漏问题。如: a)忘记释放内存; b)程序提前退出导致资源释放代码未执行到。 就出现了智能指针,能够做到资源的自动释放。 2. 智能指针的原理和简单实现 2.1 智能指针的原…

讯飞星火 VS 文心一言:谁是中文大语言模型的TOP1?

在百度发布文心一言一个多月后,科大讯飞也发布了自己的大模型“讯飞星火大模型”。本篇博客就测评一下这两个在中文圈最受好评的大语言模型,顺便辅以ChatGPT为参考。大家一起来看看到底谁是中文大语言模型的TOP1? 目录 体验网址 1、旅游攻…

Class类文件的结构

1 class文件介绍 Class文件是一组以8个字节为基础单位的二进制流; 各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符; 采用一种类似C语言结构体的伪结构来存储数据,只要两种数据类型:“无符号数”和“表”…

execl函数总结以及扩展

为什么要用exec族函数,有什么作用? (1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的一一父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求…

移动机器人运动规划---基于图搜索的基础知识---图和图搜索算法的基本概念

移动机器人运动规划---基于图搜索的基础知识---图和图搜索算法的基本概念 图和图搜索算法的基本概念图的基础概念图搜索基本概念图搜索算法图搜索算法框架 图和图搜索算法的基本概念 图的基础概念 图是有节点和边的一种表达方式 各节点由边连起来 边可以是有向的,…

Java经典笔试题—day07

Java经典笔试题—day07 🔎选择题🔎编程题🥝Fibonacci数列🥝合法括号序列判断 🔎结尾 🔎选择题 (1)Java属于( ) A.操作系统 B.办公软件 C.数据库系统 D.计算机语言 D (2)类声明中&a…

大数据Doris(十八):Properties配置项和关于ENGINE

文章目录 Properties配置项和关于ENGINE 一、Properties配置项 二、关于ENGINE Properties配置项和关于ENGINE 一、Properties配置项 在创建表时,可以指定properties设置表属性,目前支持以下属性: replica

Kali-linux系统指纹识别

现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录。指纹识别是识别系统的一个典型模式,包括指纹图像获取、处理、特征提取和对等模块。如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以。本节将介绍使用Nmap工具测试正在运行的主…

前端面试题汇总大全 -- 持续更新!

文章目录 一、html 系列 ⭐⭐⭐⭐⭐1、H5新增特性和css3新增特性?2、什么是HTML5,以及和HTML的区别是什么?3、说说你对 Dom 树的理解?4、跨域时怎么处理 cookie?5、说说你对 SSG 的理解?6、从输入url&#…

Azure API 管理缺陷突出了 API 开发中的服务器端请求伪造风险

微软最近修补了其 Azure API 管理服务中的三个漏洞,其中两个漏洞启用了服务器端请求伪造 (SSRF) 攻击,这些攻击可能允许黑客访问内部 Azure 资产。 概念验证漏洞用于突出开发人员在尝试为自己的 API 和服务实施基于黑名单的限制时可能犯的常见错误。 W…

JQuery 详细教程

文章目录 一、JQuery 对象1.1 安装和使用1.2 JQuery包装集对象 二、JQuery 选择器2.1 基础选择器2.2 层次选择器2.3 表单选择器 三、JQuery Dom 操作3.1 操作元素3.1.1 操作属性3.1.2 操作样式3.1.3 操作内容 3.2 添加元素3.3 删除元素3.4 遍历元素 四、JQuery 事件4.1 ready 加…

C/C++每日一练(20230513) 二叉树专场(7)

目录 1. 翻转二叉树 🌟 2. 二叉树的最小深度 🌟 3. 填充每个节点的下一个右侧节点指针 🌟🌟 附:二叉树的序列化与反序列化 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一…

消息队列中间件介绍

消息队列介绍 消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。 目前常见的消息中间件有Active…

知名高校博士:我改了这2个地方,一开始被秒拒的论文很快就成功发表了~

手稿被拒后,你会怎么做?是直接换期刊重投,还是先仔细修改下论文呢? 伊利诺伊大学博士Sara E. Skrabalak分享了自己在论文被秒拒后,修改了文章部分内容就成功发表的经验。我们来看看她到底做了哪些修改吧 ~ Sara E. Sk…

Java技术总结

Java技术总结 1.高并发1.什么是高并发2.如何提升系统的并发能力3.常见的互联网分层架构整个系统各层次的水平扩展,又分别是如何实施的呢?4.分层水平扩展架构实践5.总结 2.Java 线程的 5 种状态1.新建状态(New):2.就绪状态(Runnable):3.运行状态(Running)…

【企业信息化】第1集 免费开源ERP: Odoo 16 CRM客户关系管理系统

文章目录 前言一、概览二、使用功能1.加快销售速度2.销售线索3.机会4.客户5.高效沟通6.报告7.集成 三、总结 前言 世界排名第一的免费开源ERP: Odoo 16 CRM客户关系管理系统。真正以客户为中心的CRM。 一、概览 获得准确预测 使用可操作数据,以做出更好的决定。 获…

Java --- redis7之缓存预热+雪崩+穿透+击穿

目录 一、缓存预热 二、缓存雪崩 三、缓存穿透 3.1、解决方案 3.1.1、空对象缓存或者缺省值 3.1.2、Goolge布隆过滤器Guava解决缓存穿透 四、缓存击穿 4.1、危害 4.2、解决方案 4.3、模拟百亿补贴活动案例 一、缓存预热 场景:MySQL有N条新记录&#xff…

基于Java的班级管理系统的设计与实现(论文+源码)_kaic

摘 要 伴随着信息技术不断的飞速发展,信息技术给现在的生活也在带来翻天覆地的变化。信息时代的到来已经成为一种趋势,人类的发展历史正在进入到一个新的时代。信息技术已经在生活中的各个领域得到普及以及被应用。班级管理在信息技术发展之前一直都是…

金子数量——c++

金子数量 Description 某地区有n条(编号依次为1到n)互不交叉的道路,每条道路上都有m个数字,其中能被8整除的数称为金子数,这个数字表示其重量。 如下表是3条道路,每条道路中有5个数的一种可能情况。 苏海想在n条道路中走一条金子…