DeepEP原理分析(一):low latency模式特点总结
一、双缓冲模式
双缓冲模式是一种常见的提升数据发送效率的方法,数据的发送和接收往往有延迟。如果只用一块缓冲区,必须等通信完成后才能复用这块内存。而使用双缓冲则让通信任务和数据准备任务同时进行,有效隐藏通信延迟,提高整体吞吐。该方法涉及两块缓存,第一块缓存用于当前数据收发时,也会对第二块缓存会进行清理以准备下一轮的数据发送。例如下面的 low latency dispatch 代码中第一块缓存为 buffer,第二块为 next_buffer,它们均为 LowLatencyBuffer 结构体,位于显存(rdma_buffer_ptr )上
当 dispatch kernel 利用多个 SM 和 buffer 进行数据收发时,最后一个 warp 中的第一个 SM 也会对 next_buffer 进行清零操作,这样当下一次进行 combine 时可以直接复用刚刚完成的 dispatch 过程中准备好的 next_buffer,而 combine 过程同样也会为下一次的 dispatch 准备好 buffer。buffer 和 next_buffer 见的切换通过“异或”操作进行(^= 1),每进行一次异或操作 low_latency_buffer_idx 的值就会从 0 变为 1 或 1 变成 0,这样每轮 dispatch 和 combine 的过程就能错开利用两块 buffer
二、zero copy 原理
在 test_low_latency 测试脚本中有个叫做 test_func 的函数,该函数允许调用者手动设置是否使用 zero copy 模式来进行 combine。顾名思义 zero copy 指在 combine——也就是各专家将 dispatch 过程中收到的 token 计算完后的结果发回 token 所在的原 rank——该过程中无需将 token 计算结果拷贝至 RDMA 发送缓冲区,而是直接将让 combine 发送缓冲区(combine_rdma_send_buffer_data_start)指向计算后结果(simulated_gemm_x)
其关键作用的便是 get_next_low_latency_combine_buffer 函数,里面会使用 from_blob 方法,该方法会根据传入的原始数据指针创建一个引用(而非复制) 指向传入的指针,即上面说的 combine_rdma_send_buffer_data_start 会指向传入的 simulated_gemm_x
基于上述做法,进行 combine 的时候就会直接调用 nvshmemi_ibgda_put_nbi_warp 将发送缓冲区数据 put 到远端 PE 即可。如果不使用 zero copy 的话则在 put 这一步之前就必须将 token 拷贝到 RDMA 发送缓冲区中然后进行 put 操作
三、细粒度通信组
如果使用 low latency 模式,则返回全局 rank(dst_rdma_rank * NUM_MAX_NVL_PEERS + nvl_rank),反之则返回 RDMA rank(dst_rdma_rank)
评论
发表评论