在当下数字化浪潮中,AI技术迅猛发展,数据呈现爆炸增长态势,数据存储面临日益严峻的挑战,而传统数据存储在面对海量、多样化的数据时,暴露出诸多不足,AI场景下优化数据存储尤为重要。
AI大模型场景下小文件存储挑战
当前AI大模型呈现多模态趋势,从自然语言处理、图像生成到视频制作等,AI生成数据越来越多,模型也越来越大。根据Garther预测到2025年,AI内容生成会占到整个数据量10%。以ChatGPT 4.0为例,在训练时使用到了45TB数据,有近一万亿个数据量,数十亿行的源代码。
数据的数量和质量决定了人工智能整体落地水平,为了获得更高的精准度,AI模型训练所需的文件数量往往需要达到数亿甚至数十亿的量级。这是因为大规模的样本集能够覆盖更多的数据分布和异常情况,使得模型在训练过程中能够学习到更加全面和深入的知识,从而提升模型的泛化能力和精准度。
在AI模型训练中,往往涉及大量的小文件,如图片、音频片段等,这些文件通常只有几MB的大小。尽管这些小文件本身的数据量并不大,但由于其数量庞大,元数据的存储占比却相对较高。(元数据是描述文件属性、位置、大小等信息的数据,对于文件的管理和访问至关重要。)在AI大模型训练场景下,元数据的存储和管理将成为挑战。
01文件管理低效
AI训练过程中,在读取一个小文件之前,文件系统需要先进行一系列的元数据操作,如通过目录项(dentry)找到对应的索引节点(inode),再通过inode获取到文件数据块的位置信息。当前主流的文件系统(如ext4、xfs等)在处理海量小文件时,由于需要依次访问目录项(dentry)和索引节点(inode)才能定位到文件的实际数据,这导致元数据操作开销相对较大。
元数据访问性能会显著影响小文件访问性能,尤其是面对海量小文件并发访问时,每个小文件的访问都需要查询其元数据,从而显著降低整体性能。
02存储资源利用率低
对于数以亿计的小文件而言,其索引节点(inode)的数量和空间占用率相比大文件场景会显著提高。在某些情况下,甚至可能出现索引节点已用完但硬盘的物理存储空间还未被完全利用的情况。这是因为每个文件都需要一个索引节点来存储其元数据,而小文件的数据块通常较小,因此索引节点的空间占用率会相对较高。当前的文件系统在面对这一问题时,往往缺乏有效的解决方案,导致存储资源的利用率降低。
小文件合并存储
面对亿级数量的KB级、MB级的小文件,IT技术人员不得不重新考虑小文件存储优化问题。
小文件合并存储是一种广泛采用的优化策略,它通过将多个小文件合并为一个大文件,并使用数据库记录每个小文件的元数据信息(如<key,filename,offset, size>),来解决小文件过多导致的元数据管理和文件访问效率问题。这种优化思路解决了元数据存储占比过大问题并且提升了文件的读取效率。
首先,通过将多个小文件合并存储为一个大文件,成功解决了元数据存储占比过大的问题。在传统的文件系统中,每个小文件都需要一个单独的inode(索引节点)来存储其元数据,如权限、所有者、大小以及数据块的位置等。
随着小文件数量的增长,inode的消耗将迅速增加,甚至可能达到文件系统的inode限制,而磁盘的物理存储空间却尚未充分利用。通过合并小文件,能够将多个小文件的元数据合并到一个单一的inode中,从而显著减少了inode的数量,释放了宝贵的文件系统资源,同时也提高了文件系统的索引效率。
其次,合并存储策略极大地提高了文件读取的效率。在AI场景中,数据集的读取通常具有空间局限性,即时间上连续存储的一批小文件往往也是连续读取的。在传统方式下,读取这些小文件需要频繁地执行系统调用(如open()),每次调用都涉及到用户态和内核态之间的切换,以及元数据的检索等开销。
然而,通过将小文件合并为大文件,我们可以将原本对小文件的随机读取转化为对大文件的顺序读取。由于只需要打开一次大文件,系统调用的次数也显著减少,从而降低了用户态和内核态切换带来的额外开销。这种优化在AI训练等大规模数据处理场景中尤为重要,能够显著提升数据处理的效率和速度。
小文件合并存储策略通过减少元数据存储占比和提高文件读取效率,为AI训练和大规模数据处理等场景带来了显著的性能提升。这种策略不仅解决了传统文件系统在小文件处理上的局限性,还充分利用了数据访问的局部性原理。值得注意的是,这种存储方式也存在一定的局限性,比如修改和删除操作会给聚合后的文件带来很多碎片,碎片整理会额外占用cpu和内存资源等问题。