DeepEP icon indicating copy to clipboard operation
DeepEP copied to clipboard

illegal memory on low_latency_dispatch when test dataset

Open hpz4311 opened this issue 6 months ago • 6 comments

你好,deepep的作者们,我成功在h20上把deepep集成到我们的项目中,目前internode, intranode的dispatch 和combine kernel都能正常运行, 但是在实际运行low_latency_dispatch kernel时, 会在成功运行一些数据之后报错illegal memory, 如下图

Image

我们直接调用了c++接口,对于你们的代码我只做了下面的修改, 把low_latency_mode 下的dispatch 和combine 的kNumWrapGroups和 kNumWrapPerGroup 变量改成了8 和 4,防止h20报sm不足的错误。以及在初始化时设置了相关环境变量

Image

Image

排查过程中我尝试在internode_ll.cu 的dispatch kernel中加了一些打印, 我发现出错时rdma_recv_count 获取到的值是异常值,之前的代码中应该是使用该地址进行nvshmem通信,我怀疑是rank之间进行rdma_recv_count 通信时发生了异常。 我在单机8卡和多机多卡上都会碰到这个问题,我可以确定我传入的数据是对的,因为出错的数据单独跑都能正常运行,只有在运行数据集时会发生错误,一般跑几条数据就会报错。会不会是实际运行过程中每次num_max_dispatch_token_per_rank 不同导致的。 :单机8卡机时我的local_experts_per_rank = 33 [256 /8 + 1]

Image

Image

请问有什么排查的思路吗,这个问题已经困扰我好几天了,十分感谢。

hpz4311 avatar May 10 '25 10:05 hpz4311

要不要先排除下环境的影响,用 Python 的脚本运行 test 之类的会有类似的问题吗?

还有就是你有没有 normal kernel 和 low-latency kernel 混合调用,如果混合调用了这个 buffer 是需要在中间被清零的(有一个专门的函数用来做这个);你可以在每次 launch 之前都检查下 rdma_recv_count 位置是不是都被清零的?(检查的方式是先 barrier 一下,然后检查,然后再 barrier 一下)。甚至也有可能别的 kernel 写越界了。

这里的逻辑是,最开始是 0,直到别的 rank 发过来让它不是 0 之后就知道真值了。

LyricZhao avatar May 12 '25 01:05 LyricZhao

有没有可能是 kNumWrapGroupskNumWrapPerGroup 变量改反了? 我们是H20上改成:kNumWarpsPerGroup = 8,kNumWarpGroups = 4

sed -i 's/constexpr int kNumWarpsPerGroup = 10;/constexpr int kNumWarpsPerGroup = 8;/g' ./csrc/kernels/internode_ll.cu
sed -i 's/constexpr int kNumWarpGroups = 3;/constexpr int kNumWarpGroups = 4;/g' ./csrc/kernels/internode_ll.cu

yuan-luo avatar May 13 '25 08:05 yuan-luo

这两个值基本都可以随意变,改错了应该不会 illegal memory access;一般来说,groups 的数量少(2-4 这个范围),一个 group 里面的 warps 数量多(8-12);乘积 <=32

LyricZhao avatar May 13 '25 09:05 LyricZhao

要不要先排除下环境的影响,用 Python 的脚本运行 test 之类的会有类似的问题吗?

还有就是你有没有 normal kernel 和 low-latency kernel 混合调用,如果混合调用了这个 buffer 是需要在中间被清零的(有一个专门的函数用来做这个);你可以在每次 launch 之前都检查下 rdma_recv_count 位置是不是都被清零的?(检查的方式是先 barrier 一下,然后检查,然后再 barrier 一下)。甚至也有可能别的 kernel 写越界了。

这里的逻辑是,最开始是 0,直到别的 rank 发过来让它不是 0 之后就知道真值了。

感谢回复,确实有可能是我的其他kernel越界了,不过我暂时没有定位到。听从你的建议,我在每次decode 第一次调用low_latency_dispatch 之前都调用了一下clear_low_latency_buffer(理论上是不需要此操作,因为我没有混合调用normal和ll kernel), 目前测试正常。

hpz4311 avatar May 13 '25 09:05 hpz4311

你可以用 compute-sanitizer + PYTORCH_NO_CUDA_MEMORY_CACHING=1 看看 memcheck 下别的 kernel 有没写越界,现在核心问题就是 buffer 被改了。

LyricZhao avatar May 13 '25 09:05 LyricZhao

你可以用 compute-sanitizer + PYTORCH_NO_CUDA_MEMORY_CACHING=1 看看 memcheck 下别的 kernel 有没写越界,现在核心问题就是 buffer 被改了。

是的,这个问题我还在定位,我尝试下你的方法

hpz4311 avatar May 13 '25 09:05 hpz4311