开发者
下载
[object Object][object Object]
  • [object Object]Ascend 950DT[object Object]:支持
  • [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:支持
  • [object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:支持
  • [object Object]Atlas 200I/500 A2 推理产品[object Object]:不支持
  • [object Object]Atlas 推理系列产品[object Object]:不支持
  • [object Object]Atlas 训练系列产品[object Object]:不支持
[object Object]
  • 接口功能:需与配套使用,完成MoE的并行部署下的token的dispatch和combine。
    • 支持非量化、静态量化、pertoken动态量化、pergroup动态量化、mx动态量化和mx clip动态量化场景,对token数据先进行量化(可选),进行EP(Expert Parallelism)域的alltoallv通信;
    • 支持特殊专家场景。
  • 计算公式:
    • 量化场景:

      [object Object]不为None,先按专家维或量化系数进行平滑/缩放;若为None,则直接使用[object Object]

       x_fp32={ CastToFp32(x)× x_smooth_scale,if x_smooth_scaleNone CastToFp32(x),if x_smooth_scale=None\ x\_fp32 = \begin{cases} \ CastToFp32(x) \times \ x\_smooth\_scale, & \quad \text{if } x\_smooth\_scale \ne None \\ \ CastToFp32(x), & \quad \text{if } x\_smooth\_scale = None \end{cases}

      如果quant_mode=0(非量化)

       quant_out=x\ quant\_out = x

       alltoall_x_out=alltoallv( quant_out)\ alltoall\_x\_out = alltoallv(\ quant\_out)

       expand_x=alltoall_x_out\ expand\_x = alltoall\_x\_out

      如果quant_mode=1(静态量化)

       quant_out=Cast(CastToFp32(x)×scales,dstType)\ quant\_out = Cast(CastToFp32(x) \times scales, dstType)

       alltoall_x_out=alltoallv(quant_out)\ alltoall\_x\_out = alltoallv(quant\_out)

       expand_x=alltoall_x_out\ expand\_x = alltoall\_x\_out

      如果quant_mode=2(动态量化)  x_fp32=CastToFp32(x)×scales\ x\_fp32 = CastToFp32(x) \times scales

       dynamic_scales_value=dst_type_max/Max(Abs(x_fp32))\ dynamic\_scales\_value = dst\_type\_max / Max(Abs(x\_fp32))

       quant_out=Cast(x_fp32× dynamic_scales_value,dstType)\ quant\_out = Cast(x\_fp32 \times \ dynamic\_scales\_value, dstType)

       alltoall_x_out=alltoallv(quant_out)\ alltoall\_x\_out = alltoallv(quant\_out)

       alltoall_dynamic_scales_out=alltoallv(1.0/dynamic_scales_value)\ alltoall\_dynamic\_scales\_out = alltoallv(1.0 / dynamic\_scales\_value)

       expand_x=alltoall_x_out\ expand\_x = alltoall\_x\_out

       dynamic_scales=alltoall_dynamic_scales_out\ dynamic\_scales = alltoall\_dynamic\_scales\_out

      如果quant_mode=3(pergroup量化)

       x_fp32=CastToFp32(x)×scales\ x\_fp32 = CastToFp32(x) \times scales

       dynamic_scales_value=dst_type_max/Max(Abs(x_fp32))\ dynamic\_scales\_value = dst\_type\_max / Max(Abs(x\_fp32))

       quant_out=Cast( x_fp32× dynamic_scales_value,dstType)\ quant\_out = Cast(\ x\_fp32 \times \ dynamic\_scales\_value, dstType)

       alltoall_x_out=alltoallv(quant_out)\ alltoall\_x\_out = alltoallv(quant\_out)

       alltoall_dynamic_scales_out=alltoallv(1.0/dynamic_scales_value)\ alltoall\_dynamic\_scales\_out = alltoallv(1.0 / dynamic\_scales\_value)

       expand_x=alltoall_x_out\ expand\_x = alltoall\_x\_out

       dynamic_scales=alltoall_dynamic_scales_out\ dynamic\_scales = alltoall\_dynamic\_scales\_out

      如果quant_mode=4(mxfp8量化)

       sharedexp=floor(log2(max(x)))emax\ shared_exp = floor(log_2(max(x))) - emax

       dynamic_scales_value=2shared_exp\ dynamic\_scales\_value = 2^{shared\_exp}

       quant_out=Cast(x/dynamic_scales_value,dstType)\ quant\_out = Cast(x / dynamic\_scales\_value, dstType)

       alltoall_x_out=alltoallv(quant_out)\ alltoall\_x\_out = alltoallv(quant\_out)

       alltoall_dynamic_scales_out=alltoallv(1.0/dynamic_scales_value)\ alltoall\_dynamic\_scales\_out = alltoallv(1.0 / dynamic\_scales\_value)

       expand_x=alltoall_x_out\ expand\_x = alltoall\_x\_out

       dynamic_scales=alltoall_dynamic_scales_out\ dynamic\_scales = alltoall\_dynamic\_scales\_out

      如果quant_mode=5(mxfp8量化chip方法)  max_abs=max(abx(x))\ max\_abs = max(abx(x))  max_abs_clamp=max(max_abs,104)\ max\_abs\_clamp = max(max\_abs, 10^{-4})  shared_exp=ceil(log2(max_abs_clamp/fp8_max))\ shared\_exp = ceil(log_2(max\_abs\_clamp / fp8\_max))

       dynamic_scales_value=2shared_exp\ dynamic\_scales\_value = 2^{shared\_exp}

       quant_out=CastToFp8(x/dynamic_scales_value)\ quant\_out = CastToFp8(x / dynamic\_scales\_value)

       alltoall_x_out=alltoallv(quant_out)\ alltoall\_x\_out = alltoallv(quant\_out)

       alltoall_dynamic_scales_out=alltoallv(1.0/dynamic_scales_value)\ alltoall\_dynamic\_scales\_out = alltoallv(1.0 / dynamic\_scales\_value)

       expand_x=alltoall_x_out\ expand\_x = alltoall\_x\_out

       dynamic_scales=alltoall_dynamic_scales_out\ dynamic\_scales = alltoall\_dynamic\_scales\_out

    • 特殊专家场景:

      零专家场景,即[object Object]不为0:

      Moe(ori_x)=0Moe(ori\_x)=0

      拷贝专家场景,即[object Object]不为0:

      Moe(ori_x)=ori_xMoe(ori\_x)=ori\_x

      常量专家场景,即[object Object]不为0:

      Moe(ori_x)=const_expert_alpha_1ori_x+const_expert_alpha_2const_expert_vMoe(ori\_x)=const\_expert\_alpha\_1*ori\_x+const\_expert\_alpha\_2*const\_expert\_v

      参数ori_x、const_expert_alpha_1、const_expert_alpha_2、const_expert_v见文档。

[object Object]
[object Object]
[object Object][object Object][object Object][object Object][object Object]
  • 该接口支持推理场景下使用。

  • 该接口支持单算子模式和torchair图模式调用,[object Object][object Object]必须配套使用。

  • 各输入Tensor的list[Tensor]长度、是否转置、是否支持非连续Tensor约束如下:

    [object Object]
  • 参数里Shape使用的变量如下:

    • A:表示本卡接收的最大token数量,取值范围如下

      • 对于共享专家,要满足A=BS*shared_expert_num/shared_expert_rank_num。
      • 对于MoE专家,当[object Object]为0时,要满足A >= BS * ep_world_size * min(local_expert_num, K);当[object Object]不为0时,要满足A >= num_max_dispatch_tokens_per_rank * ep_world_size * min(local_expert_num, K)。
    • H:表示hidden size隐藏层大小。取值为[1024, 8192]。

    • BS:表示batch sequence size,即本卡最终输出的token数量。取值范围为0<BS≤512。

    • K:表示选取topK个专家,取值范围为0<K≤16,同时满足0 < K ≤ num_experts + zero_expert_num + copy_expert_num + const_expert_num。

    • local_expert_num:表示本卡专家数量。

      • 对于共享专家卡,local_expert_num为1。
      • 对于MoE专家卡,local_expert_num=num_experts/(ep_world_size-shared_expert_rank_num),应满足0 < local_expert_num * ep_world_size ≤ 2048。
  • 在不同产品型号、不同通信算法或不同版本中,[object Object]的Tensor输出[object Object][object Object][object Object]中的元素值可能不同,使用时直接将上述Tensor传给[object Object]对应参数即可,模型其他业务逻辑不应对其存在依赖。

  • 调用接口过程中使用的[object Object][object Object][object Object][object Object][object Object]参数取值所有卡需保持一致,[object Object][object Object]网络中不同层中也需保持一致,且和对应参数也保持一致。

  • 该场景下单卡包含双DIE(简称为“晶粒”或“裸片”),因此参数说明里的“本卡”均表示单DIE。

  • num_experts + zero_expert_num + copy_expert_num + const_expert_num < MAX_INT32。

  • quant_mode相关约束:

    • [object Object]Atlas A2 训练系列产品/Atlas A2 推理系列产品[object Object]:
      • [object Object]表示非量化场景,[object Object]不传,[object Object]的数据类型支持float16、bfloat16。
      • [object Object]表示pertoken动态量化场景,[object Object]的数据类型支持int8,[object Object]可传可不传;若传入有效Tensor,shape为(num_experts, H),输出[object Object] shape为(A,)。
    • [object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]:
      • [object Object]可传有效Tensor、空Tensor或None,有效Tensor为2D Tensor,shape为(BS, K),传空Tensor或None时[object Object][object Object]输出无效;传有效Tensor时支持[object Object]输出。
      • [object Object]表示非量化场景,[object Object]不传,[object Object]的数据类型支持float16、bfloat16。
      • [object Object]表示pertoken动态量化场景,[object Object]的数据类型支持int8,[object Object]可传可不传;若存在共享专家且传入有效Tensor,shape为(shared_expert_num + num_experts, H),若不存在共享专家,shape为(num_experts, H),输出[object Object] shape为(A,)。
    • [object Object]Ascend 950DT[object Object]:
      • [object Object]可传有效Tensor、空Tensor或None,有效Tensor为2D Tensor,shape为(BS, K),传空Tensor或None时[object Object][object Object]输出无效;传有效Tensor时支持[object Object]输出。
      • [object Object]表示非量化场景。当[object Object]为float16或bfloat16时,[object Object]可与[object Object]一致,也可通过[object Object]指定为hifloat8,[object Object]必须为None;当[object Object]为hifloat8、float8_e5m2、float8_e4m3fn、float4_e2m1、float4_e1m2时,[object Object]必须传有效Tensor,[object Object][object Object]逻辑类型一致。[object Object]为hifloat8时,[object Object]逻辑类型为float;[object Object]为float8_e5m2或float8_e4m3fn时,[object Object]逻辑类型为float或float8_e8m0;[object Object]为float4_e2m1或float4_e1m2时,[object Object]逻辑类型为float8_e8m0,且H必须为偶数。此时[object Object] shape为(BS, dim1),其中dim1 <= H。
      • [object Object]表示静态量化场景,[object Object]支持int8、hifloat8,[object Object]必须传有效Tensor。[object Object]为int8时,[object Object]可表示量化系数,shape为(1,);也可表示每个专家共享的平滑权重,shape为(H,);也可表示融合了每个专家平滑权重的量化系数,有共享专家时shape为(shared_expert_num + num_experts, H),无共享专家时shape为(num_experts, H)。[object Object]为hifloat8时,[object Object] shape必须为(1,)。
      • [object Object]表示pertoken动态量化场景,[object Object]支持int8、float8_e4m3fn、float8_e5m2,[object Object]可传可不传;若传入有效Tensor,其专家维shape规则同[object Object],输出[object Object] shape为(A,)。
      • [object Object]表示pergroup动态量化场景,[object Object]支持float8_e4m3fn、float8_e5m2,[object Object]可传可不传;若传入有效Tensor,其专家维shape规则同[object Object],输出[object Object] shape为(A, Ceil(H, 128))。
      • [object Object]表示mx动态量化场景,[object Object]表示mx clip动态量化场景,[object Object]支持float8_e4m3fn、float8_e5m2、float4_e2m1、float4_e1m2,[object Object]必须为None,输出[object Object] shape为(A, Align2(Ceil(H, 32)));当[object Object]为float4_e2m1或float4_e1m2时,H必须为偶数。
    • 本文中的[object Object]表示[object Object][object Object]表示向上对齐到2的整数倍。
  • HCCL通信域缓存区大小: 调用本接口前需检查HCCL_BUFFSIZE环境变量取值是否合理,该环境变量表示单个通信域占用内存大小,单位MB,不配置时默认为200MB。

    • 该场景仅支持通过环境变量HCCL_BUFFSIZE配置,该环境变量按通信域粒度管理,每个通信域独占一组“2*HCCL_BUFFSIZE”大小的内存。
    • ep通信域内,comm_alg配置为"fullmesh_v1"或"": 设置大小要求 >= 2 * (local_expert_num * max_bs * ep_world_size * Align512(Align32(2 * H) + 64) + (K + shared_expert_num) * max_bs * Align512(2 * H))。
    • ep通信域内,comm_alg配置为"fullmesh_v2": 设置大小要求 >= 2 * (local_expert_num * max_bs * ep_world_size * 480Align512(Align32(2 * H) + 64) + (K + shared_expert_num) * max_bs * Align512(2 * H))。
    • 其中480Align512(x) = ((x+480-1)/480)*512,Align512(x) = ((x+512-1)/512)*512,Align32(x) = ((x+32-1)/32)*32。
    • 通信域开设大小可通过调用MoeDistributeBuffer.get_low_latency_ccl_buffer_size接口计算。
  • 本文公式中的“/”表示整除。

  • 通信域使用约束:

    • 一个模型中的[object Object][object Object]算子仅支持相同EP通信域,且该通信域中不允许有其他算子。

    • 一个通信域内的节点需在一个超节点内,不支持跨超节点。

  • 版本配套约束:

    静态图模式下,从Ascend Extension for PyTorch 8.0.0版本开始,Ascend Extension for PyTorch框架会对静态图中最后一个节点输出结果做Meta推导与inferShape推导的结果强校验。当图中只有一个Dispatch算子,若CANN版本落后于Ascend Extension for PyTorch版本,会出现Shape不匹配报错,建议用户升级CANN版本,详细的版本配套关系参见《》中“相关产品版本配套说明”。

[object Object]

默认支持确定性计算。

[object Object]
  • 单算子模式调用:

    [object Object]
  • 图模式调用:

    [object Object]