开发者
资源
[object Object][object Object][object Object]undefined
[object Object]
  • API功能:MoE(Mixture of Experts)的routing计算,根据的计算结果做routing处理,支持不量化、动态量化和静态量化模式。

  • 计算公式:

    1. 对输入expertIdx做排序,得出排序后的结果sortedExpertIdx和对应的序号sortedRowIdx:

      sortedExpertIdx,sortedRowIdx=keyValueSort(expertIdx,rowIdx)sortedExpertIdx, sortedRowIdx=keyValueSort(expertIdx,rowIdx)
    2. 以sortedRowIdx做位置映射得出expandedRowIdxOut:

      • rowIdxType等于1时, 输出scatter索引expandedRowIdxOut[i]=sortedRowIdx[i]expandedRowIdxOut[i]=sortedRowIdx[i]
      • rowIdxType等于0时, 输出gather索引expandedRowIdxOut[sortedRowIdx[i]]=iexpandedRowIdxOut[sortedRowIdx[i]]=i
    3. 对sortedExpertIdx的每个专家统计直方图结果,得出expertTokensCountOrCumsumOutOptional:

      expertTokensCountOrCumsumOutOptional[i]=Histogram(sortedExpertIdx)expertTokensCountOrCumsumOutOptional[i]=Histogram(sortedExpertIdx)
    4. 如果quantMode不等于-1, 计算量化结果:

      • 静态量化:

        quantResult=round((xscaleOptional)+offsetOptional)quantResult=round((x∗scaleOptional)+offsetOptional)
      • 动态量化:

        • 若不输入scale:dynamicQuantScaleOutOptional=row_max(abs(x))/127dynamicQuantScaleOutOptional = row\_max(abs(x)) / 127
        quantResult=round(x/dynamicQuantScaleOutOptional)quantResult = round(x / dynamicQuantScaleOutOptional)
        • 若输入scale:dynamicQuantScaleOutOptional=row_max(abs(xscaleOptional))/127dynamicQuantScaleOutOptional = row\_max(abs(x * scaleOptional)) / 127
        quantResult=round(x/dynamicQuantScaleOutOptional)quantResult = round(x / dynamicQuantScaleOutOptional)
    5. 若活跃的expert范围为全专家范围时,按照Scatter索引搬运token;反之按照Gather索引搬运token。在dropPadMode为1时将每个专家需要处理的Token个数对齐为expertCapacity个,超过expertCapacity个的Token会被Drop,不足的会用0填充。得出expandedXOut:

      • 非量化场景
        • 按照Scatter索引搬运expandedXOut[i]=x[scatterRowIdx[i]//K]expandedXOut[i]=x[scatterRowIdx[i]//K]
        • 按照Gather索引搬运expandedXOut[gatherRowIdx[i]]=x[i//K]expandedXOut[gatherRowIdx[i]]=x[i//K]
      • 量化场景
        • 按照Scatter索引搬运expandedXOut[i]=quantResult[scatterRowIdx[i]//K]expandedXOut[i]=quantResult[scatterRowIdx[i]//K]
        • 按照Gather索引搬运expandedXOut[gatherRowIdx[i]]=quantResult[i//K]expandedXOut[gatherRowIdx[i]]=quantResult[i//K]
    6. expandedRowIdxOut的有效元素数量availableIdxNum,计算方式为expertIdx中activeExpertRangeOptional范围内的元素的个数。

      availableIdxNum={xexpertIdxexpert_startx<expert_end }availableIdxNum = |\{x\in expertIdx| expert\_start \le x<expert\_end \ \}|
  • 等价计算逻辑

    [object Object]
[object Object]
[object Object]
[object Object]
  • x ([object Object]):必选参数,表示MoE的输入即token特征输入,要求为2维张量,shape为(NUM_ROWS, H)。数据类型支持[object Object][object Object][object Object][object Object],数据格式要求为NDND

  • expert_idx ([object Object]):必选参数,表示输出每一行特征对应的K个处理专家,要求是2维张量,shape为(NUM_ROWS, K),且专家id不能超过专家数。数据类型支持[object Object],数据格式要求为NDND

  • [object Object]*[object Object]:必选参数,代表其之前的变量是位置相关的,必须按照顺序输入;之后的变量是可选参数,位置无关,需要使用键值对赋值,不赋值会使用默认值。

  • scale ([object Object]):可选参数,默认为None,用于计算量化结果的参数。数据类型支持[object Object],数据格式要求为NDND。如果不输入表示计算时不使用[object Object],且输出[object Object]中的值无意义。

    • 非量化场景下,如果输入则要求为1维张量,shape为(NUM_ROWS,)。
    • 静态量化场景必须输入,输入要求为1D的Tensor,shape为(1,)
    • 动态量化场景下,如果输入则要求为2维张量,shape为(expert_end-expert_start, H)或(1, H)。
  • offset ([object Object]):可选参数,默认为None,用于计算量化结果的偏移值。数据类型支持[object Object],数据格式要求为NDND

    • 在非量化场景下不输入。
    • 静态量化场景必须输入,输入要求为1维张量,shape为(1,)
    • 动态量化场景下不输入。
  • active_num ([object Object]):可选参数,默认值为-1,表示总的最大处理row数,输出[object Object]只有这么多行是有效的,入参校验需大于等于0,0表示Dropless场景,大于0时表示Active场景,约束所有专家共同处理tokens总量。

  • expert_capacity ([object Object]):可选参数,默认值为-1,表示每个专家能够处理的tokens数,入参校验大于0小于NUM_ROWS。

  • expert_num ([object Object]):可选参数,默认值为-1,表示专家数。[object Object]为key_value模式时,取值范围为[0, 5120];其他模式取值范围为[0, 10240]。

  • drop_pad_mode ([object Object]):可选参数,默认值为0,表示是否为drop_pad场景。0表示dropless场景,该场景下不校验[object Object]。1表示drop_pad场景。

  • expert_tokens_num_type ([object Object]):可选参数,默认值为0,表示直方图的不同模式。取值为0、1和2。0表示cumsum模式;1表示count模式,即输出的值为各个专家处理的token数量的累计值;2表示key_value模式,即输出的值为专家和对应专家处理token数量的累计值。

  • expert_tokens_num_flag ([object Object]):可选参数,默认值为False,取值为False和True,表示是否输出[object Object]

  • quant_mode ([object Object]):可选参数,默认值为-1,表示量化模式,支持取值为0、1、-1。0表示静态量化,-1表示不量化场景;1表示动态量化场景。

  • active_expert_range ([object Object]):可选参数,默认为空, 表示活跃expert的范围。数组内值的范围为[expert_start, expert_end],左闭右开,表示活跃的expert范围在expert_start到expert_end之间。要求值大于等于0,并且expert_end不大于[object Object]。drop_pad场景下,expert_start等于0, expert_end等于[object Object]。传入默认值时,视为活跃的expert范围在0到[object Object]之间。

  • row_idx_type ([object Object]):可选参数,默认为0,表示输出[object Object]使用的索引类型,支持取值0和1。0表示gather类型的索引;1表示scatter类型的索引。

[object Object]
  • expanded_x ([object Object]):根据[object Object]进行扩展过的特征,Dropless场景shape为[NUM_ROWS * K, H]。Active场景shape为[min(activeNum, NUM_ROWS * K), H]。Drop/Pad场景下要求是一个3D的Tensor,shape为[expertNum, expertCapacity, H]。非量化场景下数据类型同[object Object];量化场景下数据类型为[object Object]。数据格式要求为NDND。量化场景下,当[object Object]的数据类型为[object Object]时,输出值无意义。

  • expanded_row_idx ([object Object]):[object Object][object Object]的映射关系,要求是1维张量,shape为(NUM_ROWS * K, ),数据类型支持[object Object],数据格式要求为NDND。当[object Object]为1时, 前available_idx_num个元素为有效数据,无效数据未初始化;当[object Object]为0时,无效数据由-1填充。

  • expert_token_cumsum_or_count ([object Object]):表示输出每个专家处理的token数量的统计结果或累加值。

    • [object Object]为0时,表示[object Object]范围内expert在排序后处理token总数的前缀和。
    • [object Object]为1的场景下,要求是1维张量,表示[object Object]范围内expert对应的处理token的总数,shape为(expert_end-expert_start, )。shape为(expert_end-expert_start, );
    • [object Object]为2的场景下,要求是2维张量,shape为(expert_num, 2),表示[object Object]范围内token总数为非0的expert,以及对应expert处理token的总数;

    expert_idx在active_expert_range范围且剔除对应expert处理token为0的元素对为有效元素对,存放于Tensor头部并保持原序。数据类型支持[object Object],数据格式要求为NDND

  • expanded_scale ([object Object]):数据类型支持[object Object],数据格式要求为NDND。输出shape为[object Object]的shape去掉最后一维之后所有维度的乘积。令available_idx_num为[object Object]范围的元素的个数。

    • 非量化场景下,当[object Object]输入时,前[object Object]个元素为有效数据。
    • 动态量化场景下,输出量化计算过程中[object Object]的中间值,前[object Object]个元素为有效数据。
    • 静态量化场景下不输出。
[object Object]
  • 该接口支持推理场景下使用。

  • 该接口支持图模式。

  • 进入低时延性能模板需要同时满足以下条件:

    • [object Object][object Object][object Object]输入Shape要求分别为:(1, 7168)、(1, 8)、(256, 7168)
    • [object Object]数据类型要求:[object Object]
    • 属性要求:active_expert_range=[0, 256]、 quant_mode=1、expert_tokens_num_type=2、expert_num=256
  • 进入大batch性能模板需要同时满足以下条件:

    • NUM_ROWS范围为[384, 8192]
    • K=8
    • expert_num=256
    • expert_end-expert_start<=32
    • quant_mode=-1
    • row_idx_type=1
    • expert_tokens_num_type=1
  • 在算子输入shape较小的场景,操作间的多核同步时间占比较高,成为性能瓶颈。因此,针对这种特化场景,添加全载性能模板。该模板中,搬入、排序、计算都在同一个kernel内完成。需要满足 drop_pad_mode=0 的条件。

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

    [object Object]
  • 图模式调用

    [object Object]