大模型训练:K8s 环境中数千节点存储最佳实践

news2024/11/20 7:01:44

今天这篇博客来自全栈工程师朱唯唯,她在前不久举办的 KubeCon 中国大会上进行了该主题分享。

Kubernetes 已经成为事实的应用编排标准,越来越多的应用在不断的向云原生靠拢。与此同时,人工智能技术的迅速发展,尤其是大型语言模型(LLM)的推进,导致企业需要处理的数据量急剧增加,例如,Llama 3.1 模型拥有 4050 亿参数,其模型文件的大小达到了 231GB。随着模型参数的增长,模型文件体积也随之增大。

01 Kuberenetes 中大模型训练的存储挑战

随着数据集群规模不断扩大,在 Kubernetes 环境中管理大规模数据集群面临多重挑战:

  1. 复杂权限管理:大规模 AI 训练往往涉及到上百人算法工程师,对文件系统的权限管理提出了复杂的需求。在 Kubernetes 环境中,这种规模的权限管理尤其困难,因为必须细粒度地控制对高度动态和分布式资源的访问,同时确保不影响开发和运维的效率。
  2. 稳定性挑战:在极致弹性的云原生环境中,文件系统的稳定性也面临了极大的挑战。如何保证重启或升级文件系统服务时,不影响业务?
  3. 系统可观测性:在复杂的 Kubernetes 系统下,如何增加系统可观测性,简化运维与问题排查的难度?

除了在 Kubernetes 环境中的挑战之外,存储系统还面临高并发、高吞吐量和低延迟的性能要求,以及在多云架构中维持数据一致性的挑战。

02 JuiceFS 的架构设计如何应对这些挑战?

JuiceFS 将元数据与数据分开存储。元数据存储在包括 Redis、MySQL 以及自研高性能云数据引擎等数据库中;而数据则被切分成块存储在对象存储中,支持市面上几乎所有类型的对象存储。这种将文件分块存储的方法使得所有文件的 I/O 请求都可以通过偏移量精确锁定到特定的块,特别适合大文件的读写操作,并确保数据一致性。

如下图所示,JuiceFS 客户端位于系统的上方,处理所有文件 I/O 请求,并向上层应用提供多种访问方式,包括 POSIX 接口、JuiceFS CSI Driver 和 S3 Gateway。

Kubernets 环境中的 JuiceFS

JuiceFS 提供了 CSI Driver,使用户可以在 Kubernetes 环境中通过原生的 Persistent Volume Claim (PVC) 方式使用文件系统,支持静态和动态配置。

在静态配置中,管理员为应用 Pod 创建一个单独的 Persistent Volume (PV)。用户只需创建一个 PVC,并在 Pod 中声明这个 PVC,即可在 Pod 中使用 JuiceFS。

动态配置则简化了管理员的工作。管理员无需为每个 Pod 单独创建 PV,而是创建一个 PV 的模板即 StorageClass。用户的操作与静态配置相同,仍需创建 PVC,系统将自动基于 StorageClass 动态生成所需的 PV。然后在运行当中系统会自动创建对应的 PV。

以下图解演示了当 JuiceFS CSI Driver 收到 Kubernetes 的挂载请求后的操作流程。系统会创建一个独立的 Pod 来运行 JuiceFS 客户端。这种设计带来了几个显著的好处:

  1. 增加系统稳定性和可扩展性:FUSE 客户端与 CSI Driver 组件进行了彻底的解耦,使得 CSI Driver 的重启和升级不会影响到 FUSE 客户端的运行。
  2. 便于管理 :此架构允许以 Kubernetes 的方式直观管理 FUSE 守护进程(daemon),增强了过程的透明性和管理效率。

Serverless 环境中如何运行 CSI Driver

在 Serverless 环境中,服务通常不与特定节点关联,这意味着无法在节点上运行守护进程(daemon site),从而使得 CSI node 组件无法正常工作。为解决这一问题,我们采用了创新性的解决方案,使用 Sidecar 模式,以支持 JuiceFS 在 Serverless 弹性环境中的运行,确保存储客户端的高可用性和灵活性。

具体操作中,我们在 CSI controller 中向 API server 注册了一个 webhook。当 API server 需要创建 Pod 时,它会向此 webhook 发起请求。通过这一机制,我们会向应用 Pod 注入一个 Sidecar 容器,在该容器中运行 JuiceFS 客户端。这种配置使得 JuiceFS 客户端能以 sidecar 的形式与应用容器共存于同一个 Pod 中,共享相同的生命周期,从而提高了整体的运行效率和稳定性。关于 Sidecar 模式,点击此处了解更多详情。

多租户环境中实现数据安全性

在多租户环境下,确保数据安全是一个重大挑战。JuiceFS 采用了多种安全机制来应对这一挑战:

数据隔离:通过为 StorageClass 动态声明的 PVC 分配不同的存储目录,JuiceFS 实现了不同业务间的数据隔离。

数据加密:在文件系统启动静态数据加密功能后,用户可以在 Secret 中设置密钥口令和密钥文件,从而启用 JuiceFS 的数据加密功能。

权限控制:用户可使用类 Unix 系统的 UID 和 GID 来管理文件权限,并可直接在 pod 中设置 uid 和 gid。此外,JuiceFS 还支持设置 POSIX ACL,以实现更细粒度的权限控制。

可无限扩展的存储空间

JuiceFS 是基于对象存储构建的,因此其实际上没有存储容量的上限。我们在对象存储的基础上实现了一套逻辑数据管理系统。

用户在使用时,可以在 PersistentVolumeClaim (PVC) 中通过指定 StorageClass 的属性值来设定 JuiceFS 的配额。这一过程类似于为 JuiceFS 设置一个容量配额。当需要进行数据扩容时,操作也非常简单:用户只需使用 kubectl 命令修改 PVC 中的 StorageClass 属性中的存储容量值,即可轻松实现数据的扩容。

如何实现高性能?

当大量客户端需要频繁访问相同的数据集时,分布式缓存能让多个客户端共享相同的缓存数据,显著提升性能。这种机制特别适用于使用 GPU 集群进行深度学习模型训练的场景。

以下是分布式缓存集群的一个典型部署方式。在 GPU 计算节点中,JuiceFS 客户端会运行,并使用本地的 NVMe 作为本地缓存。分布式文件缓存集群通常部署在近端,并通过预热方式从远端的对象存储中拉取数据到近端,供 GPU 节点上的客户端使用。

这里分享一项针对大文件顺序读和随机读的性能测试,以帮助大家理解分布式缓存的效果。如下图所示,在顺序读大文件的测试中,未启用缓存时带宽为 4.7GB,而启用缓存后带宽提升至 13.2GB。在随机读大文件的测试中,未使用缓存时的延迟为 29 毫秒,启用缓存后,延迟显著降低至 0.3毫秒 ,性能得到显著提升。

多云环境如何保持数据一致性?

随着模型参数和数据集规模的不断增大,公有云的 GPU 资源因其充足数量和高度灵活性而成为更合适的选择。为了降低成本并满足多云架构的需求,越来越多的公司选择在不同的云平台之间分配 GPU 资源。

我们引入了镜像文件系统功能,使用户能够在不同的云平台中访问 JuiceFS 数据,并保持数据的一致性。该系统通过异步方式将数据从原始文件系统同步到对象存储。

此外,我们通过元数据引擎定期同步 Raft 的 changelog 来增强数据一致性。在镜像文件系统中,客户端可对原始文件系统发起写请求,而读请求可从任一端发起——无论是原始文件系统还是镜像文件系统,均能确保数据的一致性。这种设计有效确保了多云架构中数据一致性的稳定性。

03 针对数千节点集群的实践与优化

在一个包含数千节点的集群中,最大的挑战之一是管理大量节点及其关联的资源,如Deployment、DaemonSet 等。随着这些资源请求的增多,APIServer 将面临极大的压力。

优化1:可视化监控

当集群中的资源众多时,故障排查往往变得繁琐且困难。为此,我们提供了一套可视化的dashboard。在这个 dashboard 中,我们可以列出所有使用 JuiceFS PVC 的应用 Pod,并显示每个 Pod 对应的挂载 Pod 以及它们的运行状态。

此外,如果应用 Pod 出现异常,dashboard 还会展示一些 tips,说明可能的具体原因,以便为用户提供进一步的排查方向。这套 dashboard 极大地简化了用户的故障排查过程,点击此处了解该功能详情。

优化2:资源 & 性能

对于应用 Pod,为每个 Pod 单独创建挂载点是不现实且浪费资源的。因此,所有使用同一 PersistentVolumeClaim (PVC) 的应用 Pods 默认会共享一个挂载 Pod,并且在某些配置下,所有使用同一 StorageClass 的应用 Pods 也将共享一个挂载 Pod,以进一步优化资源使用。

另一方面,CSI 管理挂载 Pod 生命周期时采用了 list-watch 的方法。在大规模集群中,CSI 组件启动时的全量 list 请求会对 API server 造成极大压力,甚至有可能导致其宕机。因此,我们采取的策略是每个节点上的 CSI 组件会单独轮询对应节点的 Kubelet,从而减轻对 API server 的压力。

优化3:稳定性

由于 FUSE 客户端的特殊性,在重启后其挂载点可能仍然无法使用,这会影响所有应用端的数据请求。为此,我们之前进行了一项优化:当 Mount Pod 因 OOM 或其他原因重启时,我们会在 CSI 中为应用 Pod 执行重新挂载。虽然这种方式能够恢复挂载点,但文件请求在当时仍可能受到影响。

为了进一步优化,我们在 Mount Pod 启动时从 /devfuse 中获取它使用的 fuse 文件描述符(fd),并将此 fd 通过进程间通信(IPC)直接传递给 CSI Driver。CSI Driver 会在内存中维护 Mount Pod 和它所使用的 fuse fd 的映射关系。如果 Mount Pod 因 OOM 重启,CSI 会立即将其删除,并启动一个新的 Pod 来替代它。

这个新的 Pod 启动后,会通过 IPC 从 CSI 获取之前使用的 fuse fd,并重新处理业务请求。这种方式对用户端的影响相对较小,在读文件操作中只会出现短暂的卡顿,不会影响后续的处理。

优化4:平滑升级

Mount Pod 的平滑升级与之前提到的故障恢复相似,但有一个显著区别,在原有的升级过程中,旧的客户端会将其当前处理的所有数据请求保存到一个临时文件中。实现平滑升级功能后,新的客户端将执行两个操作:一是从 CSI 获取其 fuse 文件描述符(fd),二是在启动后立即从该临时文件中读取升级前的数据请求。这样做能确保在升级过程中不会遗漏任何业务请求,从而实现真正的平滑升级功能。

04 总结

自 2021 年 7 月 JuiceFS CSI Driver 首次推出以来,随着 Kubernetes 用户数量的增长和集群规模的不断扩大,面对的应用场景也愈发复杂。过去三年多的时间里,我们对 JuiceFS CSI Driver 在稳定性、管理权限等关键领域进行了持续的优化和改进,这使得 JuiceFS 能够有效地适应各种复杂的需求,成为 Kubernetes 环境中数据持久化的理想选择。

最后,我们将再次概述 JuiceFS 的核心特性以及关键优化,以帮助用户在 Kubernetes 环境中更好地进行存储选型。

  • 数据安全:JuiceFS 通过实行数据隔离、加密和权限控制来保障数据安全。此外,其分布式缓存技术不仅提升了系统性能,还有效地控制了成本。
  • 数据弹性:在 Serverless 环境中,JuiceFS 采用 sidecar 设计模式和动态数据扩容技术,以增强数据弹性。
  • 数据一致性:JuiceFS 的镜像文件系统功能保证了多云架构下的数据一致性,确保了数据在不同云平台间的稳定性和可靠性。
  • 高性能与成本控制:JuiceFS 支持从对象存储中快速将必要文件数据拉取到本地缓存,这一过程通常在 10 到 20 秒内完成,大幅缩短了数据获取时间,相较于无缓存状态下的四至五百秒。预热过程采用并行处理方式,能在模型加载前完成,有效减少了启动时间。
  • POSIX 兼容性:JuiceFS 提供全面的 POSIX 兼容性,确保与多种应用和系统的高度兼容性。

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

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

相关文章

智慧政务助力实现服务民生新突破

在数字化转型的浪潮中,中国移动紧密结合人工智能(AI)技术,推动政务服务的智能化升级。近日,中国移动正式发布政务大模型3.0版本,以科技创新提升政务效率,实现服务民生的新突破。 为什么…

【Android】页面启动耗时统计流程梳理

文章基于Android 11 写在前面: 最近的文章都会放流程图,时序图之类的图片,解释下为什么这么做: 图片的好处: 流程清晰,一目了然很多代码,如同老太太的裹脚布,又臭又长。影响理解&a…

Python的Pandas库学习指南

应用场景 Pandas库因其强大的数据处理和分析能力,在数据科学和数据分析领域有着广泛的应用。 1. 数据清洗 处理缺失数据:通过删除或填充缺失值来清洗数据。数据类型转换:将数据转换为合适的格式,例如将日期字符串转换为日期类型…

k8s_资源管理介绍

资源管理介绍 在k8s中,所有内容都抽象成资源,用户需要通过操作资源来管理k8s k8s本身就是一个集群系统,用户可以在集群中部署服务,在k8s集群中运行一个个的容器,将指定的程序部署到容器中 k8s最小的管理单元是pod&…

AI-Talk开发板之wifi scan

一、说明 AI-Talk开发板使用ESP32-C3扩展WIFI通信功能,与CSK6011A通过SPI接口通信。 与处理器的信号连接: ESP32-C3需要烧录hosted固件,参考:AI-Talk开发板更新ESP32固件_esp32 固件-CSDN博客 二、工程 1、创建项目 进入exampl…

本地编译安装|编译安装最新版postgis3.4.3版本指南

一、本地编译安装步骤介绍 本地编译,指的是在本地环境编译安装某个软件,例如,本文所述的最新版postgis3.4.3,本地是什么cpu架构,编译完成后,编译产出物就可以在其它的同cpu架构的服务器上直接适用了&#…

关于JAVA中Scanner和sout读取超时问题

1.Scanner与System.out为什么慢 Scanner读取速度慢的原因: 在ACM模式下,输入数据和输出数据时,他会将数据放在一个文件里面 在new上一个Scanner时,去调用一个next()方法,他会去访问IO设备&…

【mac开发入坑指南】能让你的终端好用一万倍的神仙组合iTerm2 + oh-my-zsh

介绍 iTerm2 iTerm2是默认终端的替代品,也是目前Mac系统下最好用的终端工具,集颜值和效率于一身。 Oh-My-Zsh Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。 它基于Zsh 命令行&#xff0c…

docker-文件复制(docker ps:用于在Docker主机和容器之间拷贝文件或目录)

文章目录 1、把宿主机的文件复制到容器内部1.1、查询 宿主机 root 下的文件1.2、docker cp /root/anaconda-ks.cfg spzx-redis:/root1.3、查看 spzx-redis 容器 中/root目录下是否有 anaconda-ks.cfg 文件 2、把容器中的文件 复制 到宿主机中2.1、查看 spzx-redis 容器 / 下的文…

怎么批量制作文本或链接静态码?批量静态码在线的生成技巧

怎么将文本或者链接做成静态二维码呢?有很多的场景都会使用静态二维码,在需要制作大量静态二维码时,有什么方法能够快速提高二维码制作效率呢?在网上能够找到在线二维码生成器的功能来快速生成二维码,下面通过这篇文章…

【shell脚本8】Shell脚本学习--其他

目录 ​编辑 Shell输入输出重定向 重定向深入讲解 Here Document Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端&…

JAVA-StringBuilder和StringBuffer

一、认识String类 1.认识 String在Java中是字符串类型,但与其他类型不同。它是一个类,可以创建对象的类。与int、char等自待类型有些许不同。但它仍然是java提供的一种类型。 类中有4个属性,这里主要认识一下value属性。它是实际存放字符串…

AI 赋能大模型:从 ChatGPT 到国产大模型的角逐与发展契机

在当今科技飞速发展的时代,大模型作为人工智能领域的关键技术,正引发着深刻的变革。它们在自然语言处理、计算机视觉、语音识别等众多领域展现出了惊人的潜力,为各行各业带来了前所未有的机遇和挑战。本文将深入剖析大模型的技术原理、市场态…

字符串的join和os.path.join()

>>> key "".join("I love China.")>>> keyI love China.>>> key.join("--xwf")-I love China.-I love China.xI love China.wI love China.f为什么执行key.join("--xwf")的结果不是“I love China.--xwf”…

鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目案例分析

摘 要:分布式光伏发电利用太阳能光伏板,分散布置在各区域,通过小规模、模块化并网或独立使用。其特点为就近发电、并网、转换和使用。技术进步和政策支持降低了光伏组件成本,推动了分布式光伏监控系统在多个领域的广泛应用。在全球…

【学习笔记】UWB技术定位原理

UWB技术还没有完全普及,却在慢慢兴起,一旦爆发,势不可挡也。 01-什么是UWB? UWB(Ultra Wide Band)是一种无载波通信技术,UWB不使用载波,而是使用短的能量脉冲序列,并通…

TikTok多语言商城系统源码+落地页 附搭建教程

TikTok多语言商城系统源码落地页 附搭建教程 环境 nginx php7.4.33 redis5.0.8 Memcached 1.6.6 mysql5.6 phpMyAdmin 伪静态 location / { try_files $uri $uri/ /index.php?$query_string; } 源码下载:https://download.csdn.net/download/m0_660477…

CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 (UM-SIAT队)

关联比赛: CVPR2021 安全AI挑战者计划第六期:防御模型的白盒对抗攻击 CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 (UM-SIAT队) 1.赛题简介 1.比赛通过15个防御模型测试攻击算法,其中包括13个在CIFAR-10上训练的模型…

单刀单掷(SPST)及单刀双掷(SPDT)模拟开关

单刀单掷(SPST)及单刀双掷(SPDT)模拟开关是对继电器元件的一种模拟简化, 本质上还是一种用开关控制的开关. 我们先从单刀双掷(SPDT)模拟开关与继电器的一个对比中了解其特性. 单刀双掷(SPDT)模拟开关 通过菜单 绘制--有源集成电路--添加模拟开关(SPDT) 可以添加一个单刀双掷…

我与Linux的爱恋:进程创建|终止

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 ​ 文章目录 一、进程创建**fork函数**写时拷贝 二、进程终止进程退出的常见方法 一、进程创建 fork函数 在Linux中fork函数是非常重要的函数,它从已存在进程…