[求教]MEX优化稀疏矩阵运算选择

楼主: InnocentMage   2017-10-12 01:15:56
各位版友好:
最近在实作算法 sub routine 时遇到了效能问题,sub routine 的目标是在给
定Z矩阵的情况下,找到最好的W来使得 L(ZW) + C*Tr(W'W)最小,其中Loss function 的
长相是 \sum_{(i,j) sample} -R_{ij}log(sigmoid(ZW_{ij}))-(1-R_{ij})log(1-sigmo
id(ZW_{ij})), R 是观察到的资料,取值在{0,1}。C 是 regularization constant.
然后 minimize function 的gradient 会是 ▼W = Z'▼L(ZW)+2CW
资料型态 : Z 会是一个 N*K 的sparse 矩阵, W 会是 K*N 的 dense 矩阵 , R 会是 N*N
的 sparse 矩阵 (只考虑有被抽样的点), N >>> K, N/K = 10^2~10^3 。
当前解法 : 之前已经实作了一个 Z 是 dense 的版本,由 matlab 经由 mex 把资料传到
C里,然后我再在C里使用 liblbfgs library 求解传回。而我需要做的事就是给定w 求
gradient给liblbfgs,目前的复杂度是 nnz(R)*K (算ZW) + nnz(R)*K (算Z'▼L) + K^2
(算+CW)
现在我有问题的点是我有很多可能的改进方向,不知道该选择什么比较好。
(1) 沿用原本的架构,只是将Z是sparse 也考虑进去,再自己利用循环实作sparse 矩阵乘
法,复杂度应该是 nnz(R)*K*r (evaluate ZW, 其中因为Z的row sparse,在算ZW_ij可能
平均起来只要做 rK 次) + nnz(R)*K*r (同理) + K^2
结果 : 速度大概会变快1/r 倍
优 : 我只要改改code就好,也不用学新东西
缺 : 因为自己实作,不会平行处理,没有利用到 multi core
(2) 在做稀疏矩阵乘法时直接使用类似Intel-MKL 的library 来加速
优 : 简单,之前有修过数值方法,还记得怎么call API
缺 : 我不太清楚要怎么使用ICC 来编译mex file,不知是否相容,可以 mex -setup ICC?
不清楚实际怎么implement,无法细致的分析
(3) 交由GPU来计算,不管是在C里自己写还是就直接在matlab 里做,用matlab提供的GPU
API
优: 可以很平行的处理?学习GPU运算增强自己的能力XD
缺: 没有写过这样利用GPU去做事的程式,learning curve有点抖,可能需要花很多时间找
资料或实作,一样可能很难分析。
(4) 可能还有其他方法? 或者要进一步考虑Block Algorithm 或 catch affinity
版友觉得应该朝哪个方向努力呢?这个subroutine会很常被call到,效能是非常重要的考量
作者: sunev (Veritas)   2017-10-12 01:27:00
你哪部份是用matlab script,哪部份是用mex,哪部份是用C?matlab内建sparse,要刻一个BFGS也不是很难。你的瓶颈在哪BFGS的哪个部份不够快,现在gradient是用matlab还是用C算?所以你有用过matlab的BFGS然后嫌不够快,改用C确实变快?

Links booklink

Contact Us: admin [ a t ] ucptt.com