【问题标题】:Implementing large linear regression models using CUDA使用 CUDA 实现大型线性回归模型
【发布时间】:2016-11-04 09:06:29
【问题描述】:

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

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

据我所知,Householder QR 分解可能是拟合回归模型的解决方案,但是,考虑到这项特定工作中的每个回归矩阵都可以轻松接近 10'000x10 的大小,即使每个单个回归矩阵都可以似乎不适合 GPU 片上内存(共享、寄存器等)。

我应该接受这是一个固有带宽受限的问题,并在回归分析期间将矩阵保留在 GPU 全局内存中,还是其他策略可行?

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

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

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

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

【问题讨论】:

  • 先上高层。尝试将您的问题简化为常见的线性代数例程并使用CUDA libraries(其中有很多:例如 cuBLAS 和 cuSolver 可能已经拥有您需要的东西)。推迟发明自己的东西并担心带宽,直到你真正需要它。
  • 为什么你的问题大小突然从 10^12 变成了 10000*10?
  • @Drop 谢谢。但是考虑到会有 10^12 个独立的回归模型,这样会有效吗?
  • “结果变量向量”的大小?你的意思是解决A(10000x10) X(10x1) = B(10000x1)
  • @kangshiyin 你是对的。 Ouctcome 变量将等于受试者数量(大脑测量):10'000x1。

标签: cuda linear-regression matrix-factorization


【解决方案1】:

您整个数据矩阵(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加载两个块,分别从两个块中选择所有可能的双列组合,求解等式,然后加载另外两个块。最大化块大小将有助于您最小化PCIe数据传输。通过适当的设计,我确定PCIe数据传输的时间远小于求解1E12方程。此外,您可以将数据传输与Solver Kernel执行重叠重叠。

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

【讨论】:

  • 抱歉,如果这个问题听起来很简单,但从我理解的那种情况下,这意味着我应该将两个大型遗传矩阵的大块转移到GPU,然后使用来自主机侧的循环来枚举块XBlock交互的两个大块,在每个循环迭代中,为从输入矩阵中选择的两个列发送“设备指针偏移”,每次使用CudastReamCreate()创建的新流?你能给我一个提示,如何在主机代码中的循环中执行最佳的偏移? span>
  • @ sourena关于流的单词是正确的。您需要从块中复制两个列以构建矩阵A,而不仅仅是两个指针。首先,您可以忘记流并重叠数据传输。 span>
  • 我只是在答案中没有得到这句话“每次通过pcie加载两个块”:好的我想我想两个大矩阵的片段是gpu global mem。然后您已评论“您需要从块中复制两个列以构建矩阵A”。无论是我应该在主机侧建立十列,然后将其转移到GPU进行Cusolver分析,或者我宁愿将主大矩阵的大块转移到GPU,然后在进行之前在设备侧构建十列A. cusolver? span>
  • 将主大矩阵的“comcopy”>转移到gpu,然后在进入cusolver之前在设备侧构建十列a - 这最小化了PCIe数据传输。 span>
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
  • 2021-01-11
  • 2015-04-06
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多