昇腾社区首页
中文
注册

aclnnDequantRopeQuantKvcache

产品支持情况

产品 是否支持
[object Object]Atlas A3 训练系列产品/Atlas A3 推理系列产品[object Object]
[object Object]Atlas A2 训练系列产品/Atlas 800I A2 推理产品/A200I A2 Box 异构组件[object Object]
[object Object]Atlas 200I/500 A2 推理产品[object Object] ×
[object Object]Atlas 推理系列产品 [object Object] ×
[object Object]Atlas 训练系列产品[object Object] ×

功能说明

  • 算子功能:对输入张量(x)进行dequant(可选)后,按sizeSplits(为切分的长度)对尾轴进行切分,划分为q、k、vOut,对q、k进行旋转位置编码,生成qOut和kOut,之后对kOut和vOut进行量化并按照indices更新到kCacheRef和vCacheRef上。

  • 计算公式:

    dequantX=Dequant(x,weightScaleOptional,activationScaleOptional,biasOptional)dequantX = Dequant(x,weightScaleOptional,activationScaleOptional,biasOptional) q,k,vOut=SplitTensor(dequantX,dim=1,sizeSplits)q,k,vOut = SplitTensor(dequantX,dim=-1,`sizeSplits`) qOut,kOut=ApplyRotaryPosEmb(q,k,cos,sin)qOut,kOut = ApplyRotaryPosEmb(q,k,cos,sin) quantK=Quant(kOut,scaleK,offsetKOptional)quantK = Quant(kOut,scaleK,offsetKOptional) quantV=Quant(vOut,scaleV,offsetVOptional)quantV = Quant(vOut,scaleV,offsetVOptional)

    如果cacheModeOptional为contiguous则:

    kCacheRef[i][indice[i]]=quantK[i]kCacheRef[i][indice[i]]=quantK[i] vCacheRef[i][indice[i]]=quantV[i]vCacheRef[i][indice[i]]=quantV[i]

    如果cacheModeOptional为page则:

    kCacheRefView=kCacheRef.view(1,kCacheRef[2],kCacheRef[1])kCacheRefView=kCacheRef.view(-1,kCacheRef[-2],kCacheRef[-1]) vCacheRefView=vCacheRef.view(1,vCacheRef[2],vCacheRef[1])vCacheRefView=vCacheRef.view(-1,vCacheRef[-2],vCacheRef[-1]) kCacheRefView[indices[i]]=quantK[i]kCacheRefView[indices[i]]=quantK[i] vCacheRefView[indices[i]]=quantV[i]vCacheRefView[indices[i]]=quantV[i]

函数原型

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

  • aclnnStatus aclnnDequantRopeQuantKvcacheGetWorkspaceSize(const aclTensor *x, const aclTensor *cos, const aclTensor *sin, aclTensor *kCacheRef, aclTensor *vCacheRef, const aclTensor *indices, const aclTensor *scaleK, const aclTensor *scaleV, const aclTensor *offsetKOptional, const aclTensor *offsetVOptional, const aclTensor *weightScaleOptional, const aclTensor *activationScaleOptional, const aclTensor *biasOptional, const aclIntArray *sizeSplits, char *quantModeOptional, char *layoutOptional, bool kvOutput, char *cacheModeOptional, const aclTensor *qOut, const aclTensor *kOut, const aclTensor *vOut, uint64_t *workspaceSize, aclOpExecutor **executor)
  • aclnnStatus aclnnDequantRopeQuantKvcache(void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream)

aclnnDequantRopeQuantKvcacheGetWorkspaceSize

  • 参数说明:

    • x(aclTensor*,计算输入):公式中的用于切分的输入x,Device侧的aclTensor,shape为[B,S,H]或[B,H],H=(Nq+Nkv+Nkv)*D,数据类型支持FLOAT16、INT32、BFLOAT16。支持undefinedundefined支持ND,shape维度只支持2维或3维。
    • cos(aclTensor*,计算输入):公式中的用于位置编码的输入cos,Device侧的aclTensor,x为3维时shape为[B,S,1,D],x为二维时shape为[B,D],数据类型支持FLOAT16、BFLOAT16,数据类型和sin保持一致。支持undefinedundefined支持ND,shape维度只支持2维或4维。
    • sin(aclTensor*,计算输入):公式中的用于位置编码的输入sin,Device侧的aclTensor,x为3维时shape为[B,S,1,D],x为二维时shape为[B,D],数据类型支持FLOAT16、BFLOAT16,数据类型和cos保持一致。支持undefinedundefined支持ND,shape维度只支持2维或4维。
    • kCacheRef(aclTensor*,计算输入):公式中用于缓存k的输入kCacheRef,Device侧的aclTensor,shape为[C_1,C_2,Nkv,D],数据类型支持int8。不支持undefinedundefined支持ND,shape维度只支持4维。
    • vCacheRef(aclTensor*,计算输入):公式中用于缓存v的输入vCacheRef,Device侧的aclTensor,shape为[C_1,C_2,Nkv,D],数据类型支持int8。不支持undefinedundefined支持ND,shape维度只支持4维。
    • indices(aclTensor*,计算输入):公式中表示Kvcache的token位置信息的输入indices,Device侧的aclTensor,当cache_mode为page且x为3维时shape为[B*S],否则shape为[B],数据类型支持int32。支持undefinedundefined支持ND,shape维度只支持1维或2维。
    • scaleK(aclTensor*,计算输入):公式中的输入scaleK用于量化k的scale因子,Device侧的aclTensor,shape为[Nkv,D],数据类型支持FLOAT。支持undefinedundefined支持ND,shape维度只支持2维。
    • scaleV(aclTensor*,计算输入):公式中的输入scaleV用于量化v的scale因子,Device侧的aclTensor,shape为[Nkv,D],数据类型支持FLOAT。支持undefinedundefined支持ND,shape维度只支持2维。
    • offsetKOptional(aclTensor*,计算输入):公式中的输入offsetKoptional用于量化k的offset因子,Device侧的aclTensor,shape为[Nkv,D],数据类型支持FLOAT。支持undefinedundefined支持ND,shape维度只支持2维。
    • offsetVOptional(aclTensor*,计算输入):公式中的输入offsetVoptional用于量化的offset因子,Device侧的aclTensor,shape为[Nkv,D],数据类型支持FLOAT。支持undefinedundefined支持ND,shape维度只支持2维。
    • weightScaleOptional(aclTensor*,计算输入):公式中的输入weightScaleoptional用于反量化的权重scale因子,Device侧的aclTensor,shape为[H],数据类型支持FLOAT。支持undefinedundefined支持ND,shape维度只支持1维。
    • activationScaleOptional(aclTensor*,计算输入):公式中的输入activationScaleOptional用于反量化的激活scale因子,Device侧的aclTensor,x为3维时shape为[B*S],x为二维时shape为[B],数据类型支持FLOAT。支持undefinedundefined支持ND,shape维度只支持1维。
    • biasOptional(aclTensor*,计算输入):公式中的输入用于反量化的偏置biasOptional,Device侧的aclTensor,shape为[H],数据类型支持FLOAT、FLOAT16(HALF)、INT32、BFLOAT16。支持undefinedundefined支持ND,shape维度只支持1维。
    • sizeSplits(aclIntArray *,计算输入):Host侧的aclIntArray,数据类型为int数组,size大小为3,值为[Nq * D,Nkv * D,Nkv * D]。表示输入的qkv进行切分的长度。
    • quantModeOptional(char*,计算输入):Host侧表达式字符串。表示支持的量化类型,目前仅支持static
    • layoutOptional(char*,计算输入):Host侧表达式字符串。表示支持的数据格式,目前仅支持BSND
    • kvOutput(bool,计算输入):Host侧表达式布尔值。表示是否输出kOutvOut
    • cacheModeOptional(char*,计算输入):Host侧表达式字符串。表示kCacheRef的更新方式,目前仅支持pagecontiguous,默认为contiguous
    • qOut(aclTensor*,计算输出):公式中的输出qOut,表示经过处理的q,Device侧的aclTensor,x为3维时shape为[B,S,Nq,D],x为二维时shape为[B,Nq,D],数据类型支持FLOAT16、BFLOAT16,数据类型和sin保持一致。不支持undefinedundefined支持ND。
    • kOut(aclTensor*,计算输出):公式中的输出kOut,表示经过处理的k,Device侧的aclTensor,当kvOutput为false时,kOut为空;否则x为3维时shape为[B,S,Nkv,D],x为2维时shape为[B,Nkv,D]。数据类型和sin保持一致。不支持undefinedundefined支持ND。
    • vOut(aclTensor*,计算输出):公式中的输出vOut,表示经过处理的v,Device侧的aclTensor,当kvOutput为false时,vOut为空;否则x为3维时shape为[B,S,Nkv,D],x为二维时shape为[B,Nkv,D]。数据类型和sin保持一致。不支持undefinedundefined支持ND。
    • workspaceSize(uint64_t*,出参):返回需要在Device侧申请的workspace大小。
    • executor(aclOpExecutor**,出参):返回op执行器,包含了算子计算流程。
  • 返回值:

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

    [object Object]

aclnnDequantRopeQuantKvcache

  • 参数说明:

    • workspace(void*,入参):在Device侧申请的workspace内存地址。
    • workspaceSize(uint64_t,入参):在Device侧申请的workspace大小,由第一段接口aclnnDequantRopeQuantKvcacheGetWorkspaceSize获取。
    • executor(aclOpExecutor*,入参):op执行器,包含了算子计算流程。
    • stream(aclrtStream,入参):指定执行任务的Stream。
  • 返回值:

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

约束说明

  1. cacheModeOptional为contiguous时:kCacheRef的第0维大于x的第0维,indices数据值大于等于0且小于等于vCacheRef的第1维([b,s,n,d]格式中的s)减x的第1维;cacheModeOptional为page时:indices 数据值大于等于0,小于kCacheRef的第0维*第1维且不重复。
  2. x的尾轴小于等于4096,且按64对齐
  3. 输入x不为int32时,x、cos、sin与输出qOut、kOut、vOut的数据类型保持一致,此时activationScaleOptional,weightScaleOptional、biasOptional不生效;x为int32时,cos、sin与输出qOut、kOut、vOut的数据类型保持一致,此时weightScaleOptional必选,activationScaleOptional、biasOptional可选(biasOptional不需要与其他输入类型一致)。

调用示例

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

[object Object]