3FS优化 02 | 客户端内存使用优化

Qiao    December 04, 2019

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

我们知道,文件系统一般分为客户端与服务端。在3FS文件系统中,客户端部署在计算节点侧,通过网络访问部署在存储节点侧的3FS服务端。这个过程中有很多问题值得优化。本期文章将和大家聊聊,客户端的内存使用优化的问题。

幻方AI的深度学习平台是计算存储分离的,计算集群只负责计算,无论是数据读取、模型加载还是梯度 reduce 等都需要通过网卡传入内存再传入显存,中间需要进行多次内存拷贝,对内存带宽的使用非常严重。如果能有效优化内存的使用,将对模型训练的性能带来极大的提升。

概述

3FS的客户端是指部署在计算节点侧的3FS,其作用是与服务端的3FS通过网络联通,从服务端请求数据并解析。对于幻方萤火二号集群来说,集群里的每台机器上有一张高速网卡,对于一般的文件系统,我们来看一下每秒钟读取23.5GB数据所需的内存开销:

  1. 从网卡读到内核态内存:一次内存写入
  2. 从内核态读到 Page Cache,一次内存读取一次内存写入
  3. 从 Page Cache 读到用户态内存:一次内存读取和一次内存写入
  4. 另外,由于内核里面不支持Non-temporal store的寄存器指令,写入时还需要多出一到两倍的内存读取。详情参见这里

如上所述,如果我们想要达到23.5 GBps的读取性能,需要消耗每秒 23.5 * 6~7 = 141~165GBps 的内存带宽。

而现在市面上最先进的训练平台,比如双路AMD Epyc Rome/Milan的总内存带宽在270GBps~330GBps之间,双路Intel Cascade Lake平台的总内存带宽更是只有220GBps左右,也就是说,对于一般的文件系统,光是读取数据所消耗的内存带宽就要占掉机器总内存带宽的50%~70%!而我们在使用这些机器的时候,显然只有数据是不够的,如果IO占了这么多带宽,那么留给计算和通信的资源就少了。

因此减少内存拷贝操作、降低内存开销,是我们优化3FS客户端性能的重点方向。我们采用RDMA Read的技术来解决该类问题。

RDMA Read

我们通过 RDMA Read 到用户态内存的方式来进一步避免内核态到用户态的内存拷贝。如前文给出的例子,使用 RDMA Read 之后,读数据的操作变为一步:从网卡直接读到用户态内存,也就是说,读满 23.5GBps 的网卡,只需要消耗 23.5GBps 的内存带宽,占总内存带宽的 10% 不到。

我们选择了计算节点侧发起 RDMA Read ,而不是从存储节点侧做 RDMA Write。这是因为3FS的批量读取导致同一网络上的读取请求可能对应了很多应用的 Buffer,而 RDMA Write 不支持分发到接收方的多个地址,这意味着在单个读取长度很小的时候,会产生很多很小的 RDMA 请求,以至于显著影响读取的带宽。

image.png

然而需要注意的是,读取的数据要做对齐,RDMA Read 并不是简单地把读到的数据填到用户的 Buffer 里,而是需要把存储节点侧对齐用的数据读到内核中分配的 padding buffer 里,在计算节点侧对齐后再丢弃掉。在测试性能的过程中我们发现,不同大小的 RDMA Read 请求会互相影响:

  • 每个请求过小,比如只读几个 KB,效率不高;
  • 每个请求太大,一次读取几个 MB,在网络繁忙的时候效果也并不算好。

我们把小的请求合并起来,把大的请求拆开,最后定在每个 RDMA 读64KB 左右,收获了不错的效果。

小结

本文介绍了幻方AI在设计3FS文件系统时,针对客户端内存使用优化的一些思考。我们采用 Direct IO 和 RDMA Read 的读取方式,让服务端的数据通过网卡直接加载到用户态内存中,减少内存带宽的占用,让模型训练在样本读取部分只用极小的CPU和内存开销,就可以获得超高的读取带宽,从而无需再训练过程中等待加载数据,更充分地利用GPU的计算性能。

3FS能跑出这样的性能也不是一蹴而就的,幻方AI在长期实践中对其不断优化,遇到了不少挑战。本系列文章将陆续为大家分享一些有关3FS性能优化的小故事,作为抛砖引玉,其中还不乏我们踩过的坑。欢迎业界的学者专家们一起探讨。


本文作者: Qiao


您可以转载、不违背作品原意地摘录及引用本技术博客的内容,但必须遵守以下条款: 署名 — 您应当署名原作者,但不得以任何方式暗示幻方为您背书,亦不会对幻方的权利造成任何负面影响。 非商业性使用 — 您不得将本技术博客内容用于商业目的。 禁止演绎 — 如果基于该内容改编、转换、或者再创作,您不得公开或分发被修改内容,该内容仅可供个人使用。