使用 CUDA 实现大型线性回归模型

Implementing large linear regression models using CUDA

为了分析 10^6 个遗传因子及其 GeneXGene 相互作用 (~5x10^11),我有许多独立的线性回归问题,可能适合在 GPU 上进行分析。

objective 是使用包含交互项的线性回归来详尽地搜索 GeneXGene 在调节结果变量(大脑表型)时的交互作用。

据我所知,Householder QR 分解可能是拟合回归模型的解决方案,但是,鉴于此特定工作中的每个回归矩阵很容易接近 ~ 10'000x10 的大小,即使每个单一回归矩阵似乎不适合 GPU 片上内存(共享、寄存器等)。

我是否应该将此视为一个本质上受带宽限制的问题并在回归分析期间将矩阵保留在 GPU 全局内存中,或者是否可以采取其他策略?

编辑 以下是有关该问题的更多详细信息:

将有大约 10'000 名受试者,每个受试者具有约 1M 遗传参数(遗传 matrix:10'000x10^6)。每次迭代中的算法应该 select 该遗传矩阵的两列 (10'000x2) 以及大约 6 个与遗传数据无关的其他变量(年龄、性别等),因此最终的回归模型将处理这样的矩阵10'000x[2(genetic factors)+6(covariates)+2(intercept&interaction term)] 的大小和结果变量向量 (10'000x1)。对于给定的一对遗传因素,每次将重复相同的过程约 5e11 次。那些通过预定义统计阈值的模型应保存为输出。

具体问题是,虽然有 ~5e11 个独立的回归模型,但即使是单个回归模型似乎也不适合片上内存。

我还猜想坚持使用 CUDA 库可能不是这里的解决方案,因为这要求大部分数据操作发生在 CPU 端并且只将每个 QR 分解发送到 GPU?

您的整个数据矩阵 (1e4 x 1e6) 可能太大而无法放入全局内存,而您的每个最小二乘求解 (1e4 x 10) 可能太小而无法充分利用 GPU。


对于每个最小二乘问题,您可以使用 cuSolver 进行 QR 分解和三角求解。

http://docs.nvidia.com/cuda/cusolver/index.html#cuds-lt-t-gt-geqrf

如果问题规模太小而无法充分利用 GPU,您可以使用并发内核执行同时求解多个方程。

https://devblogs.nvidia.com/parallelforall/gpu-pro-tip-cuda-7-streams-simplify-concurrency/


对于整个数据矩阵,如果它不能放入全局内存,你可以一次只处理它的一部分。例如你可以将矩阵分成十个(1e4 x 1e5)块,每次你通过PCIe加载两个块,select分别从两个块中提取所有可能的两列组合,求解方程然后加载另外两个街区。最大化块大小将帮助您最小化 PCIe 数据传输。通过适当的设计,我确信 PCIe 数据传输的时间将比求解 1e12 方程式要少得多。此外,您可以将数据传输与求解器内核执行重叠。

https://devblogs.nvidia.com/parallelforall/how-overlap-data-transfers-cuda-cc/