Document
拖动滑块完成拼图
首页 专利交易 科技果 科技人才 科技服务 国际服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

一种提升GRU推理速度的方法 

买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!

摘要:本发明提供一种提升GRU推理速度的方法,包括:S1.计算gate_i;S2,计算gate_h;S3,计算GRU;这里将使用CUDA核函数进行加速,核函数是指在GPU端运行的代码,即就是规定GPU的各个线程访问哪个数据并执行什么计算;CUDA从逻辑上将GPU线程分成了三个层次——线程格grid、线程块block和线程thread;将线程块设置成batch_size,direction,direction值表示单向或双向gru取值范围为[0,1];线程thread块设置成512;获取对应值;最后套入公式,得:r_t=sigmoidgate_ir+gate_hr,z_t=sigmoidgate_iz+gate_hz,n_t=tanhgate_in+r_t×gate_hn,h_t=1‑z_t×n_t+z_t×hS4,更新状态h,结果赋值;S5,循环序列,重复步骤S2到S4。本方法提升了GRU算子的推理速度。

主权项:1.一种提升GRU推理速度的方法,其中,GRU算子的获得是通过Addmm函数实现矩阵的乘运算,加bias操作;通过Sigmoid函数代码实现11+expfdata;通过tanh函数代码实现expfdata-expf-dataexpfdata+expf-data;计算r_t:sigmoidAddmmx_t,W_ir,b_ir+Addmmh,W_hr,b_hr;计算z_t:sigmoidAddmmx_t,W_iz,b_iz+Addmmh,W_hr,b_hr;计算n_t:tanhAddmmx_t,W_in,b_in+Addmmh,W_hr,b_hr*r_t;计算h_t:1-z_t*n_t+z_t*h;其特征在于,所述方法包括以下步骤:S1.计算gate_i;直接求GRU的输入x_t与权重W_i的矩阵乘,实际实现流程中W_irW_izW_in在一个变量中存储表示为W_iW_i=[W_ir,W_iz,W_in]同样的,b_i=[b_ir,b_iz,b_in]gate_i=Addmmx_t,W_i,b_igate_i存储的结果可视为[gate_ir,gate_iz,gate_in]等同于[Addmmx_t,W_ir,b_ir,Addmmx_t,W_iz,b_iz,Addmmx_t,W_in,b_in]gate_i=matmulx_t,W_i+b_i,gate_i的维度为seq_length,batch_size,3×hidden_size,正向记作f_gate_i,反向记作b_gate_i;S2.计算gate_h;gate_h=Addmmh,W_h,b_hgate_h存储的结果可视为[gate_hr,gate_hz,gate_hn]等同于[Addmmh,W_hr,b_hr,Addmmh,W_hz,b_hz,Addmmh,W_hn,b_hn]gate_h=matmulh,w_h+b_h,gate_h的维度为batch_size,3×hidden_size;S3.计算GRU;这里将使用CUDA核函数进行加速,核函数是指在GPU端运行的代码,即是规定GPU的各个线程访问哪个数据并执行什么计算;CUDA从逻辑上将GPU线程分成了三个层次——线程格grid、线程块block和线程thread;具体流程:定义gird如下Batch_size:为当前输入数据的batch_size维度;grid_y:为判断GRU是否为双向,如果是则为2,如果不是则为1;BLOCK:默认设置为512,表示为BLOCK=512;Dim3gridbatch_size,grid_y通过实现核函数完成了对gate_i,gate_h索引取值和计算结果;使用gru_unit_forward_kerenlgrid,BLOCK,0,stream参数完成CUDA核函数线程分配;将线程块设置成batch_size,direction,direction值表示单向或双向gru取值范围为[0,1];线程thread设置成512;获取对应值:gate_i的维度为seq_length,batch_size,3×hidden_size,设seq_index循环遍历seq_length长度,令i=threadIdx.x,ihidden_size;将公式中x_t×W_ir+b_ir记作gate_ir,h×W_hr+b_hr记作gate_hr,gate_ir在gate_i对应值的索引值为:seq_index×batch_size×3×hidden_size+blockIdx.x×3×hidden_size+i,gate_hr在gate_h对应值的索引值为:blockIdx.x×3×hidden_size+i,将公式中x_t×W_iz+b_iz记作gate_iz,h×W_hz+b_hz记作gate_hz,gate_iz在gate_i对应值的索引值为:seq_index×batch_size×3×hidden_size+blockIdx.x×3×hidden_size+i+hidden_size,gate_hz在gate_h对应值的索引值为:blockIdx.x×3×hidden_size+i+hidden_size,将公式中x_t×W_in+b_in记作gate_in,h×W_hn+b_hn记作gate_hn,gate_in在gate_i对应值的索引值为:seq_index×batch_size×3×hidden_size+blockIdx.x×3×hidden_size+i+2×hidden_size,gate_hn在gate_h对应值的索引值为:blockIdx.x×3×hidden_size+i+2×hidden_size,套入GRU算子公式,得:r_t=sigmoidgate_ir+gate_hr,z_t=sigmoidgate_iz+gate_hz,n_t=tanhgate_in+r_t×gate_hn,h_t=1-z_t×n_t+z_t×h;Sigmoid:函数代码实现11+expfdata;tanh:函数代码实现expfdata-expf-dataexpfdata+expf-data;实际实现流程中W_irW_izW_in在一个变量中存储表示为W_iW_i=[W_ir,W_iz,W_in],W_h=[W_hr,W_hz,W_hn]同样的b_i=[b_ir,b_iz,b_in],b_i=[b_hr,b_hz,b_hn]gate_i=Addmmx_t,W_i,b_i循环index从0到seq_length:gate_h=Addmmh,W_h,b_hgru_forward_kernel核函数grid_y,BLOCK传入index,gate_i,gate_h和所需要的参数gru_forward_kernel核函数计算h_t;S4.更新状态h,结果赋值;更新隐藏状态值h,正向状态值记作f_h,f_h核函数中的索引值为blockIdx.x×hidden_size+i,f_h[blockIdx.x×hidden_size+i]=h_t当GRU双向时,反向状态值记作b_h,用同样的索引值更新反向的状态值即可,b_h[blockIdx.x×hidden_size+i]=h_t;S5.循环序列,重复步骤S2到步骤S4。

全文数据:

权利要求:

百度查询: 北京君正集成电路股份有限公司 一种提升GRU推理速度的方法

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。