DSSM线上预测速度优化案例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/smartcat2010/article/details/88877960

输入:1个query和100个Doc-title

query经分词后的term

每个文档的title经分词后的term

输出:

每个文档的titlequery的特征向量四个相似度

DNN 输入层相似度

DNN前馈输出后相似度 

CNN输入层相似度

CNN前馈输出后相似度

通过每一步的计算量分析(也可以用Visual Profiler), 得到:

1. CNN卷积层最耗时;

2. Word-vector从Host到Device的copy耗时大;

1. CNN卷积层优化:

因为卷积核矩阵固定,word-vector词典固定,所以每个word-vector可以事先和卷积矩阵计算好,存储起来;

存储量原来:N*100; 存储量之后:N*728*3    (N是词个数,100是词向量维度,728是卷积核个数,3个window-size)

词典增大24倍,GPU放不下,只好放到host主存;

此举:QPS800==>QPS1250

2. DNN word-vector copy优化:

把词表放到GPU,CPU端维护"offset[词id]=词在显存中的offset"的数组,把offset的mini-batch发给显存,显存上直接用GPU来Max-pooling即可;

此举:QPS1250==>QPS1400

3. CPU中的CNN卷积计算优化:

AVX2, 每个指令8个float运算;

此举:QPS1400==>QPS1600

4. 余弦相似度计算优化:

优化之前:用thrust库计算q^2, t^2, q*t, 这3个向量,然后用这个矩阵乘单位向量实现加和,最后传到host上由CPU计算余弦相似度;

分析:thurst读global-memory 4次,写3次;cuBLAS读3次写3次;

优化:手写kernel, 读2次到shared-memory,计算结果折半法reduce,直接在GPU上算完余弦相似度,写回global-memory;

此举:QPS1600==>QPS1700

猜你喜欢

转载自blog.csdn.net/smartcat2010/article/details/88877960