3FS优化 03 | 数据读取模式适配

Qiao    September 15, 2020

如文章《幻方力量 | 高速文件系列 3FS》中所介绍的,幻方AI设计了一套非常适合深度学习训练的样本读取文件系统,3FS,其采用Direct IO和RDMA Read的读取方式,让模型训练在样本读取部分只用极小的CPU和内存开销,就可以获得超高的读取带宽,从而无需再训练过程中等待加载数据,更充分地利用起GPU的计算性能。

然而,实际应用中会有很多我们之前没有预料到的问题,比如任务间互相影响的问题,主要由任务不同的数据读取模式引起。本文将详细描述该问题的来龙去脉,以及我们的解决思路。

我们知道,幻方AI的深度学习平台提供的是分时调度的深度学习训练服务,用户可以自由地在平台上配置资源,提交任务。对于集群来说,同一时间会有多个任务在计算集群中训练,从存储集群中拉取数据。不同任务的读取模式,处理方式彼此之间会造成一些影响。

我们发现:

  • 如果系统里只有一种任务,即使使用的存储节点再多,每个节点都能读到不错的性能;
  • 如果有不同读取模式的其他任务调度上去跑,即使3FS的总带宽并没有跑满,之前那些任务的读取带宽也会剧烈下降。

3fs_rdma.jpg

如上图所示,计算集群侧有两个计算任务同时从3FS中读取批次数据,训练模型。计算任务1的读取模式只能从3FS存储集群中一部分节点上读取数据,因为集群是负载均衡的,分散到每个节点上读数据大概占其带宽的2/3。计算任务2的读取模式可以从3FS存储集群中大部分节点上读取数据,负载均衡到每个节点上,那些支持了计算任务1的节点只剩下1/3的带宽给计算任务2用,导致那些没有支持计算任务1的节点就算带宽有富余也无法被利用起来。

我们分析了受影响的计算任务1的读取模式,发现它读到的每个样本都很长,大约是 24MB 左右,而且每个 batch 都只从少量文件中读取数据。我们默认的块大小(chunk size)是 2MB,这个任务一个 batch 大约只从40个左右的存储服务节点中同时读取数据,而其他的类似计算任务2的任务几乎都能从接近60个,甚至是所有64个存储服务节点中同时读取数据。在单台存储服务节点总带宽有限的情况下,一个任务连接的存储服务节点少,则分到每单台存储节点的带宽需求就多。当多个任务在请求3FS读取数据时,满负荷下会造成部分任务的需求带宽无法满足的情况,进而影响了计算节点侧的数据读取性能。

因此,对于任何任务从3FS上读取数据,要尽可能让64个存储服务节点能同时读取数据,进而降低单存储节点的带宽需求。我们把块大小缩小到 512KB,并且增加了一个文件分布到的服务器数目的控制,最终成功解决了这个问题。


本文作者: Qiao


You are free to reprint the content in this Blog or excerpt or quote it without contravening the authors' intentions under the following terms: Attribution — You shall give credit to the author(s), but not in any way that suggests High-Flyer endorses you or imposes any negative influence on High-Flyer's rights. Non Commercial — You may not use the content in this Blog for commercial purposes. No Derivatives — If you remix, transform or create upon the content, you may not publish or distribute the modified content but for personal use only.