开发者
下载
[object Object]

[object Object][object Object]undefined
[object Object]
  • 接口功能:执行局部旋转位置编码InplacePartialRotaryMul的反向计算。该算子对输入dy的D维度上切片[start, end)区域执行旋转位置编码梯度计算,计算结果inplace写回dy。

  • 计算公式:

    取旋转位置编码的正向计算中,broadcast的轴列表为[object Object],在D维度上的切片范围为[object Object],令参与计算的切片数据为:

    dy=dy[...,start:end]dy' = dy[..., start:end] cos=cos[...,start:end]cos' = cos[..., start:end] sin=sin[...,start:end]sin' = sin[..., start:end]

    则梯度计算公式可表达如下:

    (1)half模式(rotary_mode等于0):

    dy1,dy2=chunk(dy,chunks=2,dim=1)dy1', dy2' = chunk(dy', chunks=2, dim=-1) cos1,cos2=chunk(cos,chunks=2,dim=1)cos1', cos2' = chunk(cos', chunks=2, dim=-1) sin1,sin2=chunk(sin,chunks=2,dim=1)sin1', sin2' = chunk(sin', chunks=2, dim=-1) dx=cat((cos1dy1+sin2dy2,cos2dy2sin1dy1),dim=1)dx' = cat((cos1' * dy1' + sin2' * dy2', cos2' * dy2' - sin1' * dy1'), dim=-1)

    dx'的结果inplace写回dy的[start, end)区间。

    (2)interleave模式(rotary_mode等于1):

    dy1,dy2=dy[...,::2],dy[...,1::2]dy1', dy2' = dy'[..., :: 2], dy'[..., 1 :: 2] cos1,cos2=cos[...,::2],cos[...,1::2]cos1', cos2' = cos'[..., :: 2], cos'[..., 1 :: 2] sin1,sin2=sin[...,::2],sin[...,1::2]sin1', sin2' = sin'[..., :: 2], sin'[..., 1 :: 2] dx=stack((cos1dy1+sin2dy2,cos2dy2sin1dy1),dim=1).reshape(dy.shape)dx' = stack((cos1' * dy1' + sin2' * dy2', cos2' * dy2' - sin1' * dy1'), dim=-1).reshape(dy'.shape)

    dx'的结果inplace写回dy的[start, end)区间。

    (3)quarter模式(rotary_mode等于2):

    dy1,dy2,dy3,dy4=chunk(dy,chunks=4,dim=1)dy1', dy2', dy3', dy4' = chunk(dy', chunks=4, dim=-1) cos1,cos2,cos3,cos4=chunk(cos,chunks=4,dim=1)cos1', cos2', cos3', cos4' = chunk(cos', chunks=4, dim=-1) sin1,sin2,sin3,sin4=chunk(sin,chunks=4,dim=1)sin1', sin2', sin3', sin4' = chunk(sin', chunks=4, dim=-1) dx=cat((cos1dy1+sin2dy2,cos2dy2sin1dy1,cos3dy3+sin4dy4,cos4dy4sin3dy3),dim=1)dx' = cat((cos1' * dy1' + sin2' * dy2', cos2' * dy2' - sin1' * dy1', cos3' * dy3' + sin4' * dy4', cos4' * dy4' - sin3' * dy3'), dim=-1)

    dx'的结果inplace写回dy的[start, end)区间。

    (4)interleave-half模式(rotary_mode等于3):

    dy1,dy2=chunk(dy,chunks=2,dim=1)dy1', dy2' = chunk(dy', chunks=2, dim=-1) cos1,cos2=chunk(cos,chunks=2,dim=1)cos1', cos2' = chunk(cos', chunks=2, dim=-1) sin1,sin2=chunk(sin,chunks=2,dim=1)sin1', sin2' = chunk(sin', chunks=2, dim=-1) dx=stack((cos1dy1+sin2dy2,cos2dy2sin1dy1),dim=1).reshape(dy.shape)dx' = stack((cos1' * dy1' + sin2' * dy2', cos2' * dy2' - sin1' * dy1'), dim=-1).reshape(dy'.shape)

    dx'的结果inplace写回dy的[start, end)区间。

[object Object]

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

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

    [object Object]
  • 返回值

    返回aclnnStatus状态码,具体参见

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

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

    [object Object]
  • 返回值

    返回aclnnStatus状态码,具体参见

[object Object]
  • 该算子仅支持Ascend 950 AI Processor。

  • 该算子仅支持连续Tensor,不支持非连续Tensor。

  • 该算子当前版本仅支持 interleave 模式([object Object]。half(0)、quarter(2)、interleave-half(3)模式暂未实现。

  • 该算子不支持输入空Tensor(任意维度大小不能为0),不支持 slice 长度为零(即 [object Object])的场景。

  • 确定性计算:

    • aclnnInplacePartialRotaryMulGrad默认确定性实现。
  • 输入张量dyRef支持BSND排布以及其B/S/N维度的广播变体(如111D、1SND、B1ND、BS1D、11ND、B11D、1S1D等)。各参数的shape约束可以描述如下:

    • 输入张量dyRef的最后一维大小D必须小于等于1024。
    • 输入张量cos、sin的最后一维大小必须等于切片长度(end - start)。
    • 输入张量cos和sin的shape必须完全相同,cos和sin的B、S、N维度需要与dyRef满足,且广播后的B、S、N必须等于dyRef的B、S、N。
    • half、interleave和interleave-half模式下,切片长度(end - start)必须能被2整除。
    • quarter模式下,切片长度(end - start)必须能被4整除。
    • 输入张量cos和sin的数据类型必须相同。
[object Object]

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

[object Object]