RopeGradOperation
产品支持情况
产品  | 
是否支持  | 
|---|---|
√  | 
|
√  | 
|
x  | 
|
x  | 
|
x  | 
功能说明
旋转位置编码处理的反向。
训练算子,实现对于旋转位置编码(RoPE)的梯度反向计算,计算流程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | def RopeGradCalc(self, in_tensors): cos_list = [in_tensors[2][:x, :] for x in OP_PARAM['qSeqLen']] sin_list = [in_tensors[3][:x, :] for x in OP_PARAM['qSeqLen']] cos = torch.cat(cos_list, dim=0) sin = torch.cat(sin_list, dim=0) sin1 = sin[:,:64] sin2 = sin[:,64:] rohqgsin = torch.cat((sin2, -sin1), dim=-1) q_grad = torch.zeros_like(in_tensors[0]) bs = int(in_tensors[0].shape[1] / 128) for i in range(bs): q_grad[:, i * 128:(i + 1) * 128] = in_tensors[0][:, i * 128:(i + 1) * 128] * (cos + rohqgsin) k_grad = torch.zeros_like(in_tensors[1]) for i in range(bs): k_grad[:,i * 128:(i + 1) * 128] = in_tensors[1][:, i * 128:(i + 1) * 128] *(cos + rohqgsin) return [q_grad, k_grad]  | 
定义
1 2 3 4  | struct RopeGradParam { std::vector<int32_t> qSeqLen; uint8_t rsv[8] = {0}; };  | 
参数列表
成员名称  | 
类型  | 
默认值  | 
描述  | 
|---|---|---|---|
qSeqLen  | 
std::vector< int32_t >  | 
-  | 
存储unpad场景下每个batch实际seqlen的值。size不能为0。qSeqLen的值只能为[2,1,4,4]  | 
rsv[8]  | 
uint8_t  | 
{0}  | 
预留参数。  | 
unpad场景:输入序列长度(seq length)是动态的场景下,如果对所有输入序列都按最大长度计算,存在大量冗余计算。unpad方案是decoder过程序列长度不再按照最大长度计算,而是根据实际的长度进行计算,减少计算量。
输入
参数  | 
维度  | 
数据类型  | 
格式  | 
描述  | 
|---|---|---|---|---|
ropeQ_grad1  | 
[nTokens, hiddenSize]  | 
float16  | 
ND  | 
ropeQ_grad矩阵。  | 
ropeQ_grad2  | 
[nTokens, hiddenSize]  | 
float16  | 
ND  | 
ropeQ_grad矩阵。  | 
cos  | 
[maxSeqLen, head_size]  | 
float16  | 
ND  | 
cos矩阵,maxSeqLen为qSeqLen中的最大元素,head_size为128。  | 
sin  | 
[maxSeqLen, head_size]  | 
float16  | 
ND  | 
sin矩阵。  | 
输出
参数  | 
维度  | 
数据类型  | 
格式  | 
描述  | 
|---|---|---|---|---|
q_grad  | 
[nTokens, hiddenSize]  | 
float16  | 
ND  | 
q_grad矩阵。  | 
k_grad  | 
[nTokens, hiddenSize]  | 
float16  | 
ND  | 
k_grad矩阵。  | 
约束说明
nTokens和qSeqLen需要满足以下关系:
