MoeDistributeDispatchV2

产品支持情况

产品 是否支持
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品

功能说明

算子功能:对token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AllToAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AllToAllV通信。

  • 不存在TP域通信时:

expandXOut=AllToAllV(X)expandXOut = AllToAllV(X)\\

  • 存在TP域通信时:

ataOut=AllToAllV(X)expandXOut=AllGatherV(ataOut)ataOut = AllToAllV(X)\\ expandXOut = AllGatherV(ataOut)\\

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:该算子必须与MoeDistributeCombineV2配套使用。
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:该算子必须与MoeDistributeCombineV2MoeDistributeCombineAddRmsNorm配套使用。

说明:MoeDistributeCombineV2、MoeDistributeCombineAddRmsNorm算子在后续文档中统称为CombineV2系列算子。

相较于MoeDistributeDispatch算子,该算子变更如下:

  • 输出了更详细的token信息辅助CombineV2系列算子高效地进行全卡同步,因此原算子中shape为(Bs * K,)的expandIdx出参替换为shape为(A * 128,)的assistInfoForCombineOut参数;
  • 新增commAlg入参,代替HCCL_INTRA_PCIE_ENABLEHCCL_INTRA_ROCE_ENABLE环境变量。

详细说明请参考以下参数说明。

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 本卡发送的token数据。 FLOAT16、BFLOAT16 ND
expertIds 输入 每个token的topK个专家索引。 INT32 ND
scalesOptional 可选输入 每个专家的量化平滑参数,非量化场景传空指针,动态量化可传有效数据或空指针。 FLOAT32 ND
xActiveMaskOptional 可选输入 表示token是否参与通信,可传有效数据或空指针;1D时true需排在false前(例:{true, false, true}非法),2D时token对应K个值全为false则不参与通信;默认所有token参与通信;各卡BS不一致时所有token需有效。 BOOL ND
expertScalesOptional 可选输入 每个token的topK个专家权重。 FLOAT32 ND
elasticInfoOptional 可选输入 EP通信域动态缩容信息。当某些通信卡因异常而从通信域中剔除,实际参与通信的卡数可从本参数中获取。 FLOAT32 ND
groupEp 属性 EP通信域名称(专家并行通信域),字符串长度范围为[1, 128),不能和groupTp相同。 STRING ND
epWorldSize 属性 EP通信域大小。 INT64 ND
epRankId 属性 EP域本卡Id,取值范围[0, epWorldSize),同一个EP通信域中各卡的epRankId不重复。 INT64 ND
moeExpertNum 属性 MoE专家数量,满足moeExpertNum % (epWorldSize - sharedExpertRankNum) = 0。 INT64 ND
groupTp 可选属性
  • TP通信域名称(数据并行通信域)。
  • 默认值为""。
  • STRING ND
    tpWorldSize 可选属性
  • TP通信域大小,取值范围[0, 2],0和1表示无TP域通信,有TP域通信时仅支持2。
  • 默认值为0。
  • INT64 ND
    tpRankId 可选属性
  • TP域本卡Id,取值范围[0, 1],同一个TP通信域中各卡的tpRankId不重复;无TP域通信时传0即可。
  • 默认值为0。
  • INT64 ND
    expertShardType 可选属性
  • 表示共享专家卡分布类型,当前仅支持传0,表示共享专家卡排在MoE专家卡前面。
  • 默认值为0。
  • INT64 ND
    sharedExpertNum 可选属性
  • 表示共享专家数量(一个共享专家可复制部署到多个卡上)。
  • 默认值为1。
  • INT64 ND
    sharedExpertRankNum 可选属性
  • 表示共享专家卡数量,取值范围[0, epWorldSize);为0时需满足sharedExpertNum为0或1,不为0时需满足sharedExpertRankNum % sharedExpertNum = 0。
  • 默认值为0。
  • INT64 ND
    quantMode 可选属性
  • 表示量化模式,支持0:非量化,2:动态量化。
  • 默认值为0。
  • INT64 ND
    globalBs 可选属性
  • EP域全局的batch size大小;各rank Bs一致时,globalBs = Bs * epWorldSize 或 0;各rank Bs不一致时,globalBs = maxBs * epWorldSize(maxBs为单卡Bs最大值)。
  • 默认值为0。
  • INT64 ND
    expertTokenNumsType 可选属性
  • 输出expertTokenNums中值的语义类型,支持0:expertTokenNums中的输出为每个专家处理的token数的前缀和,1:expertTokenNums中的输出为每个专家处理的token数量。
  • 默认值为1。
  • INT64 ND
    commAlg 可选属性
  • 表示通信亲和内存布局算法。
  • 默认值为""。
  • STRING ND
    zeroExpertNum 可选属性
  • 零专家数量。
  • 默认值为0。
  • INT64 ND
    copyExpertNum 可选属性
  • copy专家数量。
  • 默认值为0。
  • INT64 ND
    constExpertNum 可选属性
  • 常量专家数量。
  • 默认值为0。
  • INT64 ND
    expandXOut 输出 根据expertIds进行扩展过的token特征。 FLOAT16、BFLOAT16、INT8 ND
    dynamicScalesOut 输出 量化场景下,表示本卡输出Token的量化系数,仅quantMode=2时有该输出。 FLOAT32 ND
    assistInfoForCombineOut 输出 表示给同一专家发送的token个数(对应CombineV2系列算子中的assistInfoForCombine)。 INT32 ND
    expertTokenNumsOut 输出 表示每个专家收到的token个数。 INT64 ND
    epRecvCountsOut 输出 从EP通信域各卡接收的token数(对应CombineV2系列算子中的epSendCounts)。 INT32 ND
    tpRecvCountsOut 输出 从TP通信域各卡接收的token数(对应CombineV2系列算子中的tpSendCountsOptional),有TP域通信则有该输出,无TP域通信则无该输出。 INT32 ND
    expandScalesOut 输出 表示本卡输出token的权重(对应CombineV2系列算子中的expandScalesOptional)。 FLOAT32 ND
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:
      • 不支持共享专家场景,不支持expertShardTypesharedExpertNumsharedExpertRankNum属性。
      • 仅支持EP域,无TP域,不支持groupTptpWorldSizetpRankId属性,且tpRecvCounts输出无有效内容。
      • 不支持elasticInfoOptional
      • commAlg = "hierarchy",expandScalesOut内容有效。
      • 不支持常量专家场景,不支持constExpertNum,使用默认值即可。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:
      • 不支持expandScalesOut

    约束说明

    • MoeDistributeDispatchV2CombineV2系列算子必须配套使用,具体参考调用示例。

    • 在不同产品型号、不同通信算法或不同版本中,MoeDistributeDispatchV2的Tensor输出assistInfoForCombineOutepRecvCountsOuttpRecvCountsOutexpandScalesOut中的元素值可能不同,使用时直接将上述Tensor传给CombineV2系列算子对应参数即可,模型其他业务逻辑不应对其存在依赖。

    • 调用算子过程中使用的groupEpepWorldSizemoeExpertNumgroupTptpWorldSizeexpertShardTypesharedExpertNumsharedExpertRankNumglobalBscommAlg参数,HCCL_BUFFSIZE取值所有卡需保持一致,网络中不同层中也需保持一致,且和CombineV2系列算子对应参数也保持一致。

    • 参数说明里shape格式说明:

      • A:表示本卡可能接收的最大token数量,取值范围如下:
        • 对于共享专家,要满足A = Bs * epWorldSize * sharedExpertNum / sharedExpertRankNum
        • 对于MoE专家,当globalBs为0时,要满足A >= Bs * epWorldSize * min(localExpertNum, K);当globalBs非0时,要满足A >= globalBs * min(localExpertNum, K)。
      • K:表示选取topK个专家,取值范围为0 < K ≤ 16同时满足0 < KmoeExpertNum + zeroExpertNum + copyExpertNum + constExpertNum
      • localExpertNum:表示本卡专家数量。
        • 对于共享专家卡,localExpertNum = 1
        • 对于MoE专家卡,localExpertNum = moeExpertNum / (epWorldSize - sharedExpertRankNum),localExpertNum > 1时,不支持TP域通信。
    • 属性约束:

      • zeroExpertNum:取值范围:[0, MAX_INT32),MAX_INT32 = 2^31 - 1, 合法的零专家的ID的值是[moeExpertNum, moeExpertNum + zeroExpertNum)。
      • copyExpertNum:取值范围:[0, MAX_INT32),MAX_INT32 = 2^31 - 1, 合法的copy专家的ID的值是[moeExpertNum + zeroExpertNum, moeExpertNum + zeroExpertNum + copyExpertNum)。
      • constExpertNum:取值范围:[0, MAX_INT32),MAX_INT32 = 2^31 - 1, 合法的常量专家的ID的值是[moeExpertNum + zeroExpertNum + copyExpertNum, moeExpertNum + zeroExpertNum + copyExpertNum + constExpertNum)。
    • 本文公式中的"/"表示整除。

    • 通信域使用约束:

      • 一个模型中的CombineV2系列算子和MoeDistributeDispatchV2仅支持相同EP通信域,且该通信域中不允许有其他算子。
      • 一个模型中的CombineV2系列算子和MoeDistributeDispatchV2仅支持相同TP通信域或都不支持TP通信域,有TP通信域时该通信域中不允许有其他算子。
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:

      • 参数约束:
        • commAlg:当前版本支持nullptr, "", "fullmesh", "hierarchy"四种输入方式,若配置"hierarchy",建议搭配搭配25.0.RC1.1及以上版本驱动使用。
          • nullptr和"":仅在此场景下,HCCL_INTRA_PCIE_ENABLEHCCL_INTRA_ROCE_ENABLE配置生效。当HCCL_INTRA_PCIE_ENABLE=1&&HCCL_INTRA_ROCE_ENABLE=0时,调用"hierarchy"算法,否则调用"fullmesh"算法。不推荐使用该方式。
          • "fullmesh":token数据直接通过RDMA方式发往topk个目标专家所在的卡。
          • "hierarchy":token数据经过跨机、机内两次发送,仅不同server同号卡之间使用RDMA通信,server内使用HCCS通信。
        • epWorldSize:依commAlg取值,"fullmesh"支持16、32、64、128、256;"hierarchy"支持16、32、64。
        • moeExpertNum:取值范围(0, 512]。
          • 还需满足moeExpertNum / epWorldSize <= 24,commAlg = "hierarchy"无此约束。
        • epRecvCountsOut:要求shape为 (moeExpertNum + 2 * globalBs * K * serverNum, ),前moeExpertNum个数表示从EP通信域各卡接收的token数,2 * globalBs * K * serverNum存储了机间机内做通信前combine可以提前做reduce的token个数和token在通信区中的偏移,globalBs传入0时在此处应当按照Bs * epWorldSize计算。
      • HCCL_INTRA_PCIE_ENABLEHCCL_INTRA_ROCE_ENABLE:不推荐使用该环境变量控制通信算法,原HCCL_INTRA_PCIE_ENABLE=1&&HCCL_INTRA_ROCE_ENABLE=0场景,下文均通过commAlg = "hierarchy"替代,默认场景使用commAlg = "fullmesh"替代。
      • commAlg配置"hierarchy"时,不支持scalesOptionalxActiveMaskOptionaloriXOptionalzeroExpertNumcopyExpertNum
      • 参数说明里shape格式说明:
        • H:表示hidden size隐藏层大小。
          • commAlg = "fullmesh":取值范围(0, 7168],且保证是32的整数倍。
          • commAlg = "hierarchy":取值范围(0, 10 * 1024],且保证是32的整数倍。
        • Bs:表示batch sequence size,即本卡最终输出的token数量,取值范围为[1, 256]。
      • HCCL_BUFFSIZE:调用本算子前需检查HCCL_BUFFSIZE环境变量取值是否合理,该环境变量表示单个通信域占用内存大小,单位MB,不配置时默认为200MB。
        • commAlg = "fullmesh":要求 >= (Bs * epWorldSize * min(localExpertNum, K) * H * 4B + 4MB)。
        • commAlg = "hierarchy":要求 >= moeExpertNum * Bs * (H * 2 + 16 * Align8(K))B + 104MB,不要求moeExpertNum / epWorldSize <= 24,其中Align8(x) = ((x + 8 - 1) / 8) * 8。
      • 组网约束:多机场景仅支持交换机组网,不支持双机直连组网。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:

      • 该场景下单卡包含双DIE(简称为“晶粒”或“裸片”),因此参数说明里的“本卡”均表示单DIE。
      • 参数约束:
        • elasticInfoOptional:可选择传入有效数据或填空指针,传入空指针时表示不使能动态缩容功能;当传入有效数据时,要求是一个1D的Tensor,shape为 (4 + 2 * epWorldSize, )。Tensor中的前四个数字分别表示(是否缩容,缩容后实际rank数,缩容后共享专家使用的rank数,缩容后moe专家的个数),后2 * epWorldSize表示2个rank映射表,缩容后本卡中因部分rank异常而从EP通信域中剔除,第一个Table的映射关系为Table1[epRankId]=localEpRankId或-1,localEpRankId表示新EP通信域中的rank Index,-1表示epRankId这张卡从通信域中被剔除,第二个Table映射关系为Table2[localEpRankId] = epRankId
        • epWorldSize:取值范围[2, 768]。
        • moeExpertNum:取值范围(0, 1024]。
        • groupTp:字符串长度范围为[1, 128),不能和groupEp相同。
        • sharedExpertNum:取值支持[0, 4]。
        • commAlg:当前版本仅支持"","fullmesh_v1","fullmesh_v2"三种输入方式。
          • "":默认值,不使能性能优化模板。
          • "fullmesh_v1":不使能性能优化模板。
          • "fullmesh_v2":使能性能优化模板,其中commAlg仅在tpWorldSize取值为1时生效,且不支持在各卡Bs不一致、输入xActiveMask和特殊专家场景下使能。
        • epRecvCountsOut:要求shape为 (epWorldSize * max(tpWorldSize, 1) * localExpertNum, )。
      • 参数说明里shape格式说明:
        • H:表示hidden size隐藏层大小,取值范围[1024, 8192]。
        • Bs:表示batch sequence size,即本卡最终输出的token数量,取值范围为[1, 512]。
      • HCCL_BUFFSIZE:调用本算子前需检查HCCL_BUFFSIZE环境变量取值是否合理,该环境变量表示单个通信域占用内存大小,单位MB,不配置时默认为200MB。要求 >= 2且满足>= 2 * (localExpertNum * maxBs * epWorldSize * Align512(Align32(2 * H) + 64) + (K + sharedExpertNum) * maxBs * Align512(2 * H)),localExpertNum需使用MoE专家卡的本卡专家数,其中Align512(x) = ((x + 512 - 1) / 512) * 512,Align32(x) = ((x + 32 - 1) / 32) * 32。

    调用说明

    调用方式 样例代码 说明
    aclnn接口 test_aclnn_moe_distribute_dispatch_v2.cpp 通过aclnnMoeDistributeDispatchV2接口方式调用moe_distribute_dispatch_v2算子。