海量小文件场景下训练加速优化之路

作者:星辰算力平台

1. 背景

随着大数据、人工智能技术的蓬勃发展,人类对于算力资源的需求也迎来大幅度的增长。在腾讯内部,星辰算力平台以降本增效为目标,整合了公司的GPU训练卡资源,为算法工程师们提供统一的底层GPU算力服务。借助于虚拟化、算力挖掘等技术,平台服务公司内各BG的AI训练场景,GPU利用率业界领先。同时,通过云原生任务化的方式,对接了内部各大业务,促进了AI技术研究效率的提升和创新研究。

当下,由于AI训练时的高性能计算设备(如NVIDIA GPU)成本高昂,如果任务在训练过程中不能保证数据IO的速度,将会导致计算设备低载甚至空载,这无疑在时间和资源上都是一种极大的浪费。

在星辰算力平台内部,用户的训练数据大多存放在平台提供的CephFS中,训练时将对应的CephFS目录挂载至容器内部,从而使用户在训练时能够像使用本地文件系统一样使用CephFS。但在平台运营过程中我们发现,在训练数据集文件数较多时,训练任务使用CephFS会使训练速度变得异常缓慢。基于这个普遍存在的问题,本文剖析其产生的原理,然后介绍相应的优化方案。最后,通过延伸思考来发散思维,简要介绍了不同场景下AI训练加速的技术。

2. 基本概念

2.1. CephFS IO流程

CephFS IO流程如下图所示。

CephFS IO路径

当客户端进行文件系统调用时(如openreadreaddir等),需要先从元数据服务器(Metadata Server, MDS)中获取请求文件的元数据信息,元数据信息主要包括文件的Inode号、权限、uidgid和访问更改时间等。为了加快元数据的访问效率,MDS将大部分热点元数据都缓存在自己的内存中,从而避免低效地通过访问RADOSReliable, Autonomic Distributed Object Store)层来获取元数据。客户端在从MDS中获取元数据后,通过计算的方式(CRUSH算法)得到数据在RADOS中的位置,最后与远程的存储设备进行交互。

从这个架构来看,CephFS是一个元数据和用户数据分离的文件系统。文件的元数据和数据存储在RADOS中的不同Pool中,客户端需要先与MDS进行元数据交互,再与RADOS进行数据交互。

2.2. Ceph-FUSE

Ceph-FUSE是CephFS客户端的一种形式,通过用户空间文件系统(Filesystem in Userspace, FUSE)的方式来实现CephFS客户端的功能。FUSE是一个面向类Unix计算机操作系统的软件接口,它使无特权的用户能够无需编辑内核代码而创建自己的文件系统。目前Linux通过内核模块对此进行支持。通过这种方式,我们可以编写用户态的应用程序,只需要实现Linux定义的一组文件系统接口,即可在用户态实现一个完整的文件系统。

当用户需要与CephFS进行交互时,客户端的整个IO流程如下:

  1. 用户程序通过syscallglibc库进行系统调用

  2. 进程陷入内核态,文件系统操作请求到达Linux虚拟文件系统(Virtual Filesystem, VFS

  3. VFS根据请求类型,从Dentry CacheInode CachePage Cache中分别查找dentryinode和页缓存,若缓存命中可直接返回

  4. 若缓存不命中,则将请求转发至FUSE Driver

  5. Ceph-FUSE进程通过libfuse监听到来自于/dev/fuse的请求,与Ceph集群进行交互并返回结果。

Ceph-FUSE IO路径

当用户态程序发起FUSE请求时,Ceph-FUSE在经过处理后会将元数据信息缓存在内存中,提升后续访问的性能。同时,Linux的Dentry CacheInode CachePage Cache也会分别缓存该文件的dentryinode和页,提升热点数据的读取性能。

3. 问题

3.1. 问题源起

星辰算力平台服务了公司内部各个BG和部门的AI算法工程师,因此平台上运行的训练任务场景也各不相同。在运营过程中我们发现,有用户反映某些任务中CephFS的读取速度较慢,使整个训练的时间拉长,其中属CV类的任务较为明显。

平台上CV类的任务数据集,一般都是海量的图片文件。这类数据集的特点是:

  • 文件个数多,小数据集达到十万级别,大数据集达到百万、千万甚至上亿级别。

  • 单个文件占用空间不大,大多是小文件。

3.2. 理论分析

AI训练场景与许多复杂的文件操作场景不同,其数据读写的逻辑较为简单。一般来说,用户会在每个epoch训练相同的数据,然后训练多个epoch直至模型达到收敛条件。因此,AI训练场景下,训练文件在训练过程中保持不变,且被读取的频率相对固定,同时写文件的频率较低

针对这种特点,由于Ceph-FUSE会对访问过的元数据进行缓存,同时Linux的Dentry CacheInode CachePage Cache也会充分缓存读取过的文件元数据和文件数据。通常来说,在第二个epoch开始时࿰

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值