开发者
资源
[object Object][object Object][object Object]undefined
[object Object]
  • 接口功能:训练场景下计算注意力的反向输出,即的反向计算。该接口query、key、value参数支持多个长度相等或者长度不相等的sequence

    • 该接口合并了接口和接口,并调整了Dropout功能
      • Atlas 350 加速卡:keepProb小于1.0时,若没有外部传入的DropoutMask,则使用新增参数生成DropoutMask;若有外部传入的DropoutMask,则使用外部传入的DropoutMask
  • 计算公式:

    • pseType=1时,与计算公式相同
    • pseType=其他取值时,公式如下:
    Y=Dropout(Softmax(Mask(QKTd+pse),atten_mask),keep_prob)VY=Dropout(Softmax(Mask(\frac{QK^T}{\sqrt{d}}+pse),atten\_mask),keep\_prob)V

    为方便表达,以变量SSPP表示计算公式:

    S=Mask(QKTd+pse),atten_maskS=Mask(\frac{QK^T}{\sqrt{d}}+pse),atten\_mask P=Dropout(Softmax(S),keep_prob)P=Dropout(Softmax(S),keep\_prob) Y=PVY=PV

    则注意力的反向计算公式为:

    dV=PTdYdV=P^TdY dQ=((dS)K)ddQ=\frac{((dS)*K)}{\sqrt{d}} dK=((dS)TQ)ddK=\frac{((dS)^T*Q)}{\sqrt{d}}

    说明: query、keyIn、value数据排布格式支持从多种维度解读,其中T (Total S Length) 表示所有batch对应的S的总长、B(Batch)表示输入样本批量大小、S(Seq-Length)表示输入样本序列长度、H(Head-Size)表示隐藏层的大小、N(Head-Num)表示多头数、d(Head-Dim)表示隐藏层最小的单元尺寸,且满足d=H/N。

[object Object]

每个算子分为,必须先调用“aclnnFlashAttentionScoreGradV4GetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnFlashAttentionScoreGradV4”接口执行计算。

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

    [object Object]
  • 返回值:

    返回aclnnStatus状态码,具体参见

    第一段接口完成入参校验,出现以下场景时报错:

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

    [object Object]
  • 返回值:

    返回aclnnStatus状态码,具体参见

[object Object]
  • 确定性计算:

    • aclnnFlashAttentionScoreGradVX默认非确定性实现,支持通过aclrtCtxSetSysParamOpt开启确定性。
  • 输入query、key、value、dy的约束如下:

    • B:batchsize必须相等。
    • inputLayout必须一致。
    • D:Head-Dim必须满足query和key的D相等,value和dy的D相等,并且query和key的D大于等于value和dy的D。
  • 支持输入query/dy的N和key/value的N不相等,但必须成比例关系,即Nq/Nkv必须是非0整数,Nq取值范围1~256。

  • 关于数据shape的约束,以inputLayout的TND为例,其中:

    • B:取值范围为1~2K。带prefixOptional的时候B最大支持1K。
    • N:取值范围为1~256。
    • S:取值范围为1~1M。
    • D:取值范围为1~768。
    • KeepProb:取值范围为(0, 1]。
  • 部分场景下,如果计算量过大可能会导致算子执行超时(aicore error类型报错,errorStr为:timeout or trap error),此时建议做轴切分处理,注:这里的计算量会受B、S、N、D等参数的影响,值越大计算量越大。

  • prefixOptional稀疏计算仅支持压缩场景,sparseModeOptional=6,当Sq > Skv时,prefix的N值取值范围[0, Skv],当Sq <= Skv时,prefix的N值取值范围[Skv-Sq, Skv]。当sparseModeOptional=5、prefix的N > Skv或prefixOptional不传时执行全计算,sparseModeOptional=6要求prefixOptional必传。

  • sparseModeOptional=7时,不支持可选输入pseShiftOptional。

  • sparseModeOptional=8时,当每个sequence的q、kv等长时支持可选输入pseShiftOptional,针对全局做pse生成。支持q方向进行外切,需要外切前每个sequence的q、kv等长,外切后传入的actualSeqQLenOptional[0] - actualSeqKvLenOptional[0] + qStartIdxOptional - kvStartIdxOptional == 0(本功能属实验性功能)。

  • actualSeqQLenOptional输入支持某个Batch上的S长度为0,此时不支持可选输入pseShiftOptional。

  • 关于softmaxMax与softmaxSum参数的约束:输入格式固定为[B, N, S, 8],TND的输入格式除外,此时为[N, T, 8],注:T=B*S。

  • headNum的取值必须和传入的Query中的N值保持一致。

  • Atlas 350 加速卡:

    • seedOptional和offsetOptional只在keepProbOptional小于1.0时生效,否则不生效。
    • keepProbOptional小于1.0时,若dropMaskOptional非nullptr,则使用输入的dropMask;否则使用seed和offset生成的dropMask。
  • TND格式下,支持尾部部分Batch不参与计算,此时actual_seq_q_len和actual_seq_kv_len尾部传入对应个数的0即可。假设真实S长度为[2, 3, 4, 5, 6],若希望最后两个Batch不参与计算,则传入的actual_seq_q_len为[2, 3, 4, 0, 0]。此时若需要传入prefixOptional,其尾部也需要传入同等数量的0,例如[1, 1, 1, 0, 0]。

[object Object]

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

[object Object]