2016-07-01 139 views
0

對於10^6遺傳因子及其GeneXGene相互作用(〜5x10^11)的分析,我有許多獨立的線性迴歸問題,這些問題可能適用於GPU分析。使用CUDA實現大型線性迴歸模型

目標是使用包含交互項的線性迴歸在調節結果變量(腦表型)中詳盡搜索GeneXGene相互作用效應。

據我所知,Householder QR因子分解可能是擬合迴歸模型的解決方案,但是,考慮到這個特定工作中的每個迴歸矩陣都可以很容易地接近〜10'000x10的大小,即使是每個迴歸矩陣似乎不適合GPU片上存儲器(共享,寄存器等)。

我是否應該接受這個問題,它本質上是帶寬限制的,並且在迴歸分析期間將矩陣保留在GPU全局內存中,或者是否有其他策略可行?

EDIT 下面是有關該問題的更多細節:

將有大約10'000受試者,每個〜1M遺傳參數(遺傳矩陣:10'000x10^6)。每次迭代的算法應該選擇這個遺傳矩陣的兩列(10'000x2),還有其他6個與遺傳數據無關的其他變量(年齡,性別等),所以最終的迴歸模型將處理一個矩陣,如大小爲10 '000x [2(遺傳因子)+6(協變量)+2(截距&相互作用項)]和結果變量向量(10'000x1)。對於給定的一對遺傳因子,每次重複這一過程~5e11次。那些通過預定義統計閾值的模型應該保存爲輸出。

具體的問題是,雖然有〜5e11單獨的迴歸模型,即使單個迴歸模型似乎不適合片上存儲器。

我也猜測,堅持使用CUDA庫可能不是這裏的解決方案,因爲這要求大部分數據操作發生在CPU端,並且只發送每個QR分解到GPU?

+1

先走高層。儘量減少你的問題到常見的線性代數例程,並使用[CUDA庫](https://developer.nvidia.com/gpu-accelerated-libraries)(其中有很多:例如cuBLAS和cuSolver可能已經有你需要的)。推遲發明你自己的東西,並擔心帶寬,直到你真的需要這個。 – Drop

+0

爲什麼問題的大小從10^12突然變爲10000 * 10? – kangshiyin

+0

@Drop謝謝。但考慮到將會有10^12個獨立的迴歸模型,這是否有效? – Sourena

回答

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方程小得多。此外,您可以將數據傳輸與求解器內核執行重疊。

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

+0

對不起,如果這個問題聽起來很平凡,但是從我的理解,這意味着我應該將兩個大型遺傳矩陣塊轉移到GPU,然後使用來自主機端的循環枚舉blockXblock交互,並在每個循環中迭代將從輸入矩陣中選擇的兩列的「設備指針偏移量」發送到cuSolver,每次使用由cudaStreamCreate()創建的新流?你能否給我一個提示,如何在主機代碼循環中實現最佳抵消? – Sourena

+0

@sourena你關於流的話是正確的。您需要複製塊中的兩列來構建矩陣A,而不僅僅是兩個指針。您可以先忘記流和重疊的數據傳輸。 – kangshiyin

+0

我只是沒有在你的答案中得到這句話「每次你通過PCIe加載兩個塊」:現在我想大矩陣的兩個片段在GPU全局mem中。然後您評論說:「您需要複製塊中的兩列來構建矩陣A」。要麼我應該在主機端創建A列的十列,然後將其傳輸到GPU以供cuSolver分析,或者我寧願將主要大型矩陣的塊傳輸到GPU,然後在設備端構建十列A,然後繼續cuSolver? – Sourena

相關問題