System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本专利技术属于循环神经网络的算子推理流程领域,特别涉及一种提升gru反向传播速度的方法。
技术介绍
1、现有技术中,gru全称是gate recurrent unit(门循环单元),它是循环神经网络(recurrent neural network,rnn)的一种。是为了解决长期记忆和反向传播中的梯度等问题而提出来的。rnn是一种用于处理序列数据的神经网络。反向传播是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。现有训练量化gru流程中,存在训练速度较慢的缺陷,在深度学习训练模型中,模型的训练需要通过正向传播推理和反向传播更新权重的过程。在北京君正集成电路股份有限公司(简称:君正)的产品中,君正magik是一个为端侧ai应用场景打造的集模型训练、优化转换、部署推理于一体的全栈式深度学习开放平台,提升平台训练量化的算子支持广度与效率,循环神经网络是必须要支持的重要一部分,循环神经网络对处理音频与文字识别具有重要位置,gru算子属于训练神经网络的一种。而提升君正magik平台gru算子的推理速度与训练速度,目前存在的问题是现有gru算子量化训练速度要比官方(cudnn)的速度慢很多,必须提高其训练速度节省训练时间。
技术实现思路
1、为了解决上述问题,本申请的目的在于:为提升gru算子反向传播速度提出解决方法。
2、具体地,本专利技术提供一种提高gru反向传播速度的方法。从而提高gru算子量化训练的速度。其中,所述方法包括:
3、s
4、使用cuda核函数完成具体实现,所述核函数是指在gpu端运行的代码,就是规定gpu的各个线程访问哪个数据并执行什么计算;
5、cuda从逻辑上将gpu线程分成了三个层次:线程格grid、线程块block和线程thread;s1.得到gate_i和gate_h的梯度和old_h的梯度;
6、核函数实现:
7、historys为默认保存的gru正向推理时的历史数据,用于计算梯度使用。historys_gate_h保存的是gru正向推理的gate_h的历史数据,用于梯度计算
8、设置grid_y如果是双向grid_y=2否则=1
9、设置block=512
10、循环index从seq_lenght-1到0:
11、gru_backward_kernel核函数<<<grid_y,block>>>传入index和所需要的参数
12、gru_backward_kernel核函数主要计算gate_i和gate_h的梯度具体流程试下如下:
13、设置seq_step=batch_size*hidden_size*3
14、设置his_step=batch_size*hidden_size*4
15、设置offset=blockidx.x*hidden_size*3
16、设置history_offset=blockidx.x*hidden_size*4
17、设置i=threadidx.xf_h为此时正向推理的历史状态值用于梯度计算
18、如果blockidx.y=0则执行
19、如果i<hidden_size则执行:
20、history_s_offset=index*history_step,
21、rg=historys[history_s_offset+history_offset+i],
22、zg=historys[history_s_offset+history_offset+i+hidden_size],
23、ng=historys[history_s_offset+history_offset+i+hidden_size*2],
24、grad_h_data=输出梯度[i*batch_size*hidden_size+blockidx.x*
25、hidden_size+]+状态值的梯度[blockidx.x*hidden_size+i],
26、d_n=grad_h_data*(1-zg)*(1-ng*ng),
27、d_r=d_n*historys_gate_h[seq_offset_+i+hidden_size*2]*(1-r_t)*r_t,
28、d_z=grad_h_data*(f_h[index*batch_size*hidden_size+blockidx.x*hidden_size+i]-ng)*(1-zg)*zg,
29、d_h_old=grad_h_data*zg,
30、d_gate_i[blockidx.x*hidden_size*3+i]=d_r,
31、d_gate_i[blockidx.x*hidden_size*3+i+hidden_size]=d_z,
32、d_gate_i[blockidx.x*hidden_size*3+i+2*hidden_size]=d_n,
33、d_gate_h[blockidx.x*hidden_size*3+i]=d_r,
34、d_gate_h[blockidx.x*hidden_size*3+i+hidden_size]=d_z,
35、d_gate_h[blockidx.x*hidden_size*3+i+2*hidden_size]=d_n*rg;
36、如果blockidx.y=1则为双向gru逆向梯度计算。同正向梯度计算流程一样,此处略;
37、gate_i和gate_h的梯度分别记作d_gate_i,d_gate_h,维度为(batch,hidden_size*3);old_h的梯度记作d_h_old;
38、s2.得到权重梯度;
39、正向推理中的w_ir,w_iz,w_in的维度都为(input,hidden_size),所以是将w_ir,w_iz,w_in放在一起同时处理的,这里统称为w_i,w_i的维度为(3×hidden_size,input_size);
40、同样的w_hr,w_hz,w_hn也是放在一起的,这里统称为w_h,维度为(3×hidden_size,hidden_size);
41、核函数实现:
42、将线程块设置成(batch_size,direction)direction值表示单向或双向gru取值范围为[1,2];thread线程设置成512;
43、设置指针的偏移:
44、w_ih_offset=本文档来自技高网...
【技术保护点】
1.一种提高GRU反向传播速度的方法,其特征在于,所述方法包括:S0,设置一个反向遍历的index,起始位置为seq_length-1,终止索引值为0,步长为1;
2.根据权利要求1所述的一种提高GRU反向传播速度的方法,其特征在于,所述步骤S0中seq_lenght为5,index的值变换为4,3,2,1,0。
3.根据权利要求1所述的一种提高GRU反向传播速度的方法,其特征在于,所述
4.根据权利要求3所述的一种提高GRU反向传播速度的方法,其特征在于,所述步骤S1中的梯度,是将梯度所用数据套入如下反向传播即链式求导获得:
5.根据权利要求4所述的一种提高GRU反向传播速度的方法,其特征在于,所述步骤S2中,权重梯度的计算公式为:
【技术特征摘要】
1.一种提高gru反向传播速度的方法,其特征在于,所述方法包括:s0,设置一个反向遍历的index,起始位置为seq_length-1,终止索引值为0,步长为1;
2.根据权利要求1所述的一种提高gru反向传播速度的方法,其特征在于,所述步骤s0中seq_lenght为5,index的值变换为4,3,2,1,0。
3.根...
【专利技术属性】
技术研发人员:闫少甫,
申请(专利权)人:北京君正集成电路股份有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。