文章插图
3.3.3 Multi RequestBuffer与CQ负载均衡
TensorFlow社区版的RDMA通信过程,不仅仅包含上面Tensor数据的发送和接收过程,还包括传输相关的控制消息的发送和接收过程,控制消息的发送和接收过程同样是使用了ibv_post_send和ibv_post_recv原语 。原生的控制流实现存在一些瓶颈,在大规模训练时会限制控制流的吞吐,进而影响数据收发的效率 。具体体现在:
请求的发送通过同一片RequestBuffer内存进行写出,多个Client的请求均依赖这一片Buffer,也就导致到控制流信息实际是串行发送的,只有等到对端的Ack信息后,才可以下一个Request的写出,限制了请求的发送吞吐 。在Client端需要轮询RDMA Completion Queue来获得请求的到达,以及相关状态的变更 。原生实现仅有一个Completion Queue,单线程进行轮询处理,在大规模分布式训练中,限制了应答的效率 。
针对上面的问题,我们采用了Multi RequestBuffer与CQ负载均衡优化,破除了在请求发送和请求应答环节可能存在的吞吐瓶颈 。
3.3.4 Send-Driven & Rendezvous-Bypass
对于Tensorflow PS架构熟悉的同学会了解,一整张计算图被切割为Worker端和PS端后,为了使两张计算图能够彼此交换数据,建立了基于Rendezvous(汇合点)机制的异步数据交换模式 。如下图12所示:
文章插图
在具体实现上,Tensorflow实现了Recv-Driven的数据交换模式,如上图所示,位于DeviceA和DeviceB的两张计算图会异步并发的执行,位于DeviceB的Recv执行时会发起一条RPC请求发往DeviceA,DeviceA收到请求后,会将请求路由到Rendezvous中,如果在当中发现所需要的数据已经生产好,并被Send算子注册了进来,那么就地获取数据,返回给DeviceB;如果此时数据还没有生产好,则将来自于DeviceB的Recv请求注册在Rendezvous中,等待后续DeviceA生产好后,由Send算子发送过来,找到注册的Recv,触发回调,返回数据给DeviceB 。
我们看到,汇合点机制优雅地解决了生产者消费者节奏不同情况下数据交换的问题 。不过Recv-Driven的模式也引入了两个潜在的问题:
据我们的观察,在实际业务模型中,在Rendezvous中Recv算子等待Send算子的比例和Send算子等待Recv算子的比例相当,也就是说对于Send等到Recv的数据,在Send准备好的那一刹那就可以发给对端,但是由于机制实现问题,还是等待Recv算子过来,才将数据拉取回去,通信过程耗时较长 。Rendezvous作为一个数据交换的热点,它内部的逻辑开销并不低 。
针对上面提到的问题,我们在RDMA上实现了另外一种数据交换的模式,叫做Send-Driven模式 。与Recv-Driven模式相对,顾名思义就是有Send算子直接将数据写到Recv端,Recv端接收数据并注册到本地Rendezvous中,Recv算子直接从本地的Rendezvous中获取数据 。具体流程如下图13所示:
文章插图
- 核桃冰糖粥该怎么熬
- 老年患者在春季应该如何护心
- 你知道几个 中国古典音乐十大名曲
- 苹果xr现在价格多少钱 iphonexr上市时间是发售价
- 在钉钉群里直接考试?“群考试”全新上线!
- 在所有注入北冰洋的河流中,哪一条河流的流程最长?
- 汽车迎宾灯有哪些作用
- 如何清理地上的头发
- 水龙头怎样选购
- 水龙头安装要注意什么