博文

DeepEP原理分析(二):low latency模式代码详解(更新中)

图片
最近在做基于 DeepEP 和 SGLang 的推理优化。DeepEP 是一个用于取代 MoE 模型中 AlltoAll 操作、非常精妙和细致的点对点通信 kernel,好好研读其实现过程对 CUDA 编程、MoE rank 间通信都有巨大好处(下面的分析基于0625 main版本,详细代码请自行上 github 上搜索) 1 dispatch 1.1 入参详解 1、接收与打包参数:主要用于在目标 GPU 上存储从其他 GPU 接收到的数据 - packed_recv_x:用于存储接收到的已打包好的 token 特征数据,这些数据将直接用于本地专家的计算。这是数据在接收方的最终存储位置 - packed_recv_x_scales:如果使用 FP8 量化传输,这个指针指向用于存储 packed_recv_x 对应 FP8 scale(缩放因子)的缓冲区 - packed_recv_src_info:存储每个接收到的 token 在其来源 GPU 上的原始索引 。这个信息在后续 combine 阶段至关重要,用于将计算结果正确地写回 - packed_recv_layout_range:记录由每个本地专家从各个源 rank 接收到的 token 的布局信息。它通常将来自某个源 rank 的 token 总数和 token 在 packed_recv_x 缓冲区中的起始偏移量打包成一个 64 位整数,其结构可参考下面这个二维数组示意图,这个结构使得 dispatch kernel 能够记录每个本地专家从哪个源 rank 接收了多少 token,以及这些 token 在接收缓冲区中的具体位置。随后 combine kernel 可以利用这些信息,将处理后的 token 结果正确地发送回它们最初的源 rank - packed_recv_count:原子计数器,每个本地专家都有一个属于自己的该计数器,用来追踪该专家已经接收了多少 token,以便为新到达的 token 计算正确的存储偏移量 - cumulative_local_expert_recv_stats:用于累计每个本地专家接收到的 token 总数,作为统计信息 2、RDMA 缓冲区参数:RDMA 通信过程所需的空间和信号 - rdma_recv_x:RDMA 接收缓冲区。从其他节点通过网络发送过来的数据会先被存...

究竟什么是“足够”

周五下班的地铁上照例打开孟岩的“ 无人知晓”播客,听到他提到了一篇叫做 The Many Worlds of Enough 的文章,里面提到了什么叫做“足够”(enough),以及如何区分自己的 ambition 和 greed,挺感兴趣,于是今天花了一个小时精读了下。读完后感受就是四个字:醍醐灌顶。感谢孟岩又让我知道了一个优质博主 Lawrence Yeo。下面简单总结了下这篇文章的核心内容,如想了解更加详细的内容,请移步原博客。 引言 为什么德国亿万富翁 Adolf Merckle 在损失 5 亿美金、但手头仍有 80 多亿美金的情况下会卧轨自杀 核心概念 1、物理界的平行时空和多重世界 2、Ambition、Greed 和 Self-awareness Ambition:出于 self-actualization 和想要成为更有能力的人这类动机而设置目标,而实现目标过程中获得的物质奖励只是 byproduct Greed:当 byproduct 这类自身以外的事物本身成为了追求的目标(the coldness of utility replaces the warmth of curiosity) Self-awareness:当你开始严肃地问自己究竟是什么驱动你实现目标时,你就在培养 self-awareness,同时 Enough 就会逐渐下沉(lower than the position you currently occupy)。而你不断接近比你当前位置更低的目标时,你的身份认同也一样会不断改变 3、Many Worlds of Enough:It’s the perpetual branching of identity that results from progress, as progress provides you with the confidence and ability to actualize greater things (resulting in further progress). The cyclical nature of this process is what makes it so difficult to stop, and is what prevents us from ever settling ...

《肌骨重建》重点内容摘录

图片
Chap 1 腰背疼痛 1 疼痛的根因 - 想要找到根因不能只看 MRI,例如椎间盘膨出很常见,且经常出现在腰椎 MRI 扫描中,但大多数人没有疼痛感 - 放射科医生无法确定腰椎膨出是一个近期结果(新伤)还是 20 年前的(旧伤),因为椎间盘膨出可以随着时间的推移而愈合(但在 MRI 上仍有显示),不再引起疼痛 - 如果我们想要更深入观察并确定哪些特定组织可能导致疼痛症状,就需要从触发疼痛的环境(具体动作、负荷和姿势/体位)中进行彻底检查,只有在完成这一过程之后,我们才转向成像技术进行进一步诊断 2 脊柱结构和腰椎小关节 相邻椎体上下关节突构成的稳定结构,下面第二张图来自于 腰椎小关节紊乱的诊治要点 3 常见腰背损伤 3.1 椎间盘膨出 (Bulges)和突出 (Herniation) - 脊椎受力过大,髓核 (nucleus pulposus)就会被挤压在一起最终导致从椎间盘、也就是破裂的纤维环中被挤出来 3.2 椎骨终板骨折 - 椎骨中的骨小梁呈现一个错综复杂、相互交织的海绵网状结构,其非常坚固所以可以支撑骨骼承载负重并避免被负荷压缩 - 举重会使你的脊柱产生适应,并随时间的推移骨小梁会增厚;但脊柱承受的负重过大且反复施加压力时也会产生微骨折 3.3 小关节损伤 - 小关节可根据脊椎位置而改变,所以能够协助或者限制脊柱的过度转动 - 小关节可能在某些情况下产生扭转,例如大重量杠铃高翻时当髋关节产生了不对称位移,久而久之容易造成腰椎小关节的关节囊被过度牵拉,最终导致疼痛 3.4 椎骨滑脱 - 椎骨滑脱发生在椎骨的一个很小的部分叫做椎弓峡部 - 当下腰背处于过度伸展或过度弓起时,椎弓峡部吸收了大量压力 3.5 神经疼痛 3.6 肌肉疼痛 - 腰背损伤会炎症反应,会导致受伤部位周围肌肉组织的继发性收缩或痉挛 - 任何腰背肌肉的疼痛或压痛感可能是来自更深层次问题 4 腰背疼痛的筛查 - 腰背疼痛:屈曲不耐受;伸展不耐受;旋转伸展不耐受;负荷不耐受 - 筛查测试:体态评估(站姿,增加负重),动作评估(屁股眨眼主要和股骨头大小、方向和髓臼深度有关;检查检查踝关节灵活性可通过5英寸触墙测试) - 负重测试:直臂向前平举重物;蹲脚后跟测试 - 髓关节协调能力:腰背疼痛能够抑制臀肌活性(通过单/双腿臀桥进行测试看是否有疼痛) - 髓关节灵活性评估:髓关节扭转问题筛查(髋关节内旋/...

硬芯与硬心

前段时间在盒马上买了几袋零脂玉米面,其配料表很干净,只有玉米粉、饮用水和食用盐,每百克钠含量是 7%,在面条里算比较低的了。拿到手后看了看食用方法,发现有 2 种:第一种是提前把面条在凉水里浸泡 2 小时以上,然后再下锅煮;第二种是直接冷水下锅,开锅后再煮 2-3 分钟然后关火继续焖几分钟。虽然两种做法略有不同,但它们有个共同点:待面条无硬芯即可食用。虽然看了说明,但第一次煮的时候还是大意了,以为用筷子稍用力夹就断就可以捞出来吃了,没想到吃起来却很“劲道”——当然这只是未将其再煮软一些的借口罢了——嚼起来的时候仍能感受到来自面条内“芯”的抵抗。于是后来几次就学乖了,煮的时间甚至比食用方法里建议的时间还更久一些,此时煮出来的面条口感正好符合自己的要求,看来“待面条无硬芯即可食用”这句话得划重点。 硬芯是这款玉米面的特点,而非它的错误,但人却不一样。如果当一个人内心刚硬的程度是玉米面的好多倍,面对他人正确且善意的指责不去虚心接受并改正,以为依然可以我行我素,那这样的硬心往往会带来悲剧。埃及记中的法老,上帝透过摩西不断降灾,为了消灾法老表面上次次答应摩西的条件却又次次“心里刚硬”而毁约,最终落得个埃及地所有人和牲畜生的长子必定死的下场,而这些人和动物本可以不死;西底家登基做犹大王的时候“行耶和华他神眼中看为恶的事。先知耶利米以耶和华的话劝他,他仍不在耶利米面前自卑...强项硬心,不归服耶和华以色列的神 ”(代下 36:12-13),将耶路撒冷变成了污秽之地,注意经文中说“所以”迦勒底人来攻击他们,焚烧圣殿,毁坏耶路撒冷,最后的下场是“地土荒凉”(36:21);当施洗约翰传悔改的道时,法利赛人和撒都该人也想一起凑热闹,但约翰却说他们是“毒蛇的种类”,因为这些人自诩亚伯拉罕的后裔——“有亚伯拉罕在我们怕什么!”这也是硬心而非悔改的一种表现,如果继续选择硬心,那么结局就是被看下来丢在火里(太 3:10)。 如果你留意世界上每天发生的许多悲剧,会发现上帝的审判并非只会跟着世界末日一起到来,因为一个人人做自己任意想要做的世界就是上帝给人的审判,正如路易斯在《梦幻巴士》(*The Great Divorce*)说:“归根究底只有两种人。一种人对上帝说:‘愿你的旨意成就’;另一种人上帝最后对他们说:‘愿你的旨意成就’”。硬心的人认为“人的所愿就是他的天堂”,殊不知“人的所愿就是他的地狱...

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 方法,该方法会根据传入的原始数据指针创建一个引用(而非复制) 指向...

NVSHMEM官方文档部分内容总结

图片
Using NVSHMEM 1、NVSHMEM 简介 针对 CUDA 设备实现的基于 OpenSHMEM 的规范(PGAS 并行编程范式,partitioned global address space) OpenSHMEM 和 NVSHMEM 的区别 NVSHMEM 通信过程中所有的 buffer arguments 必须是对称的 Block 中线程进行 fetch 操作时只能保证数据的 weak ordering(如需强制顺序则要显式调用 nvshmem_fence,其会保证在 fence 之前的所有操作以保证内存一致性) 支持单边通信的方式:通过 Verbs API 或者 UCX 进行 IB 或 RoCE 传输 2、NVSHMEM 优点 支持多 GPU 间直接进行 data movement 或 synchronization,而无需考虑和 CPU 之间的互动之类的操作带来的 overhead 支持通过 composite kernel 实现 comp 和 comm 的 overlap 3、MPI 的问题 可能会引起 shared data 读写的 high locking/atomics overheads Message ordering 会引起 serialization overheads 接收方在发布描述符之前收到数据会引起 protocol overheads 4、NVSHMEM 对应的 addressing model(类似 PGAS) 一个 NVSHMEM job 中的所有 PE 必须同时被初始化,在 job 退出前也需要同时 finalize 通过 CPU-side NVSHMEM allocation API 可以在 GPU 上分配(必须是)大小相同的 shared symmetric memory(而其他方式开辟的内存则属于 private memory) 每个 PE 上的 symmetric memory 对其他 PE 均可见且可操作(通过 NVSHMEM API) 通过 NVSHMEM 分配 API(如 nvshmem_malloc )返回的对称内存地址对于调用该 API 的 PE 对应的 GPU 来说,是一个可以通过 CUDA API 或者 Load/Store 操作直接访问的有效内存地址。因此如果仅需要对本地 PE 的对称内存进行...

The Nvidia Way书摘

图片
1、NVIDIA最大的敌人不是来自外界,而是它自己:We launched into a wide-ranging discussion of the company’s history. Jensen knows that many of his former employees look back on Nvidia’s beginnings with nostalgia. But he resists overly positive accounts of Nvidia’s start-up period—and his own missteps.  “When we were younger, Tae, we sucked at a lot of things. Nvidia wasn’t a great company on day one. We made it great over thirty-one years. It didn’t come out great,” he said. “You didn’t build NV1 because you were great. You didn’t build NV2 because you were great,” he said, referring to the company’s first two chip designs, both of which were flops that nearly killed Nvidia. “We survived ourselves. We were our own worst enemy.”   There were several more near-death experiences. But each time, amid the stress and the pressure, the company learned from its mistakes. It retained a core of die-hard employees, many of whom remain in the fold to this day. 2、NVIDIA成功的最关键要素——独特的组织架构设计和工作文化:Through these int...