开发者
下载
[object Object][object Object][object Object]undefined
[object Object]
  • 接口功能:[object Object]面向大语言模型推理中的PagedAttention KV Cache更新场景。接口从融合输入[object Object]中拆分Q、K、V分量,对Q/K执行RMSNorm、RoPE和共享[object Object]矩阵乘,随后将Q/K动态量化为FP8 E4M3FN;Q分支输出[object Object][object Object],K分支按[object Object]写入[object Object][object Object]。V分支按[object Object]缩放后量化为FP8 E4M3FN,并按[object Object]写入[object Object]

  • 计算公式:

    [object Object][object Object]拆分Q、K、V:

    q,k,v=split(qkv,[Nq,Nk,Nv])q, k, v = split(qkv, [Nq, Nk, Nv])

    Q/K分支分别使用[object Object][object Object]做RMSNorm:

    y=xmean(x2)+epsilongammay = \frac{x}{\sqrt{mean(x^2) + epsilon}} * gamma

    [object Object]个batch中第[object Object]个token的RoPE位置由[object Object][object Object]确定:

    position=seqLens[b](queryStartLoc[b+1]queryStartLoc[b])+iposition = seqLens[b] - (queryStartLoc[b + 1] - queryStartLoc[b]) + i

    Q/K分支执行RoPE,[object Object]为cos,[object Object]为sin;V分支不执行RoPE:

    yrope=concat(ylowcosyhighsin, yhighcos+ylowsin)y_{rope} = concat(y_{low} * cos - y_{high} * sin,\ y_{high} * cos + y_{low} * sin)

    Q/K共享[object Object]矩阵:

    qrot=qrope@rotationOptional,krot=krope@rotationOptionalq_{rot} = q_{rope} @ rotationOptional,\quad k_{rot} = k_{rope} @ rotationOptional

    Q/K按每个token和head做动态量化,FP8 E4M3FN最大有限值使用[object Object],该值为448:

    scale=max(abs(x))/FP8_E4M3FN_MAX,xfp8=cast(x/scale)scale = max(abs(x)) / FP8\_E4M3FN\_MAX,\quad x_{fp8} = cast(x / scale)

    V分支按[object Object]缩放后量化:

    vfp8=cast(vvScaleOptional)v_{fp8} = cast(v * vScaleOptional)

    Cache写回位置由[object Object]决定:

    blockId=slotMapping[t]/BlockSize,blockOffset=slotMapping[t] % BlockSizeblockId = slotMapping[t] / BlockSize,\quad blockOffset = slotMapping[t]\ \%\ BlockSize kCacheRef[blockId,nk,blockOffset,:]=kfp8[t,nk,:]kCacheRef[blockId, nk, blockOffset, :] = k_{fp8}[t, nk, :] vCacheRef[blockId,nv,blockOffset,:]=vfp8[t,nv,:]vCacheRef[blockId, nv, blockOffset, :] = v_{fp8}[t, nv, :] kScaleCacheRef[blockId,nk,blockOffset,0]=kscale[t,nk]kScaleCacheRef[blockId, nk, blockOffset, 0] = k_{scale}[t, nk]
[object Object]

每个算子分为,必须先调用“aclnnQkvRmsNormRopeCacheWithKScaleGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnQkvRmsNormRopeCacheWithKScale”接口执行计算。

[object Object]
[object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

    第一段接口出现以下场景时报错:

    [object Object]
[object Object]
  • 参数说明

    [object Object]
  • 返回值

    aclnnStatus:返回状态码,具体参见

[object Object]
  • 确定性说明:aclnnQkvRmsNormRopeCacheWithKScale默认确定性实现。
  • 输入shape限制:
    • 当前实现仅支持[object Object]
    • [object Object]控制[object Object]的N/T轴布局,默认值为[object Object][object Object]控制[object Object][object Object]的N/T轴布局,默认值为[object Object]
      • [object Object][object Object][object Object][object Object][object Object]
      • [object Object][object Object][object Object][object Object][object Object]
      • [object Object][object Object][object Object][object Object][object Object]
    • [object Object][object Object][object Object][object Object][object Object]必须一致。
    • [object Object][object Object][object Object]均为4维正stride,最后一维stride为1;[object Object][object Object]前三维stride必须一致。
  • 输入值域限制:
    • [object Object]必须满足[object Object]。若[object Object]小于该batch本次调用的token数,行为未定义。
    • 资源边界约束:[object Object][object Object][object Object][object Object]
[object Object]

示例代码如下,仅供参考,具体编译和执行过程请参考

  • [object Object]Ascend 950PR/Ascend 950DT[object Object]:

    [object Object]