2016-07-01 2 views
0

10^6 유전 요인과 GeneXGene 상호 작용 (~ 5x10^11)을 분석하기 위해 GPU 분석에 적합 할 수있는 수 많은 독립 선형 회귀 문제가 있습니다.CUDA를 사용한 큰 선형 회귀 모델 구현

목적은 포함 된 상호 작용 용어로 선형 회귀를 사용하여 결과 변수 (뇌 표현형)를 조절할 때 GeneXGene 상호 작용 효과를 철저히 검색하는 것입니다.

Householder QR factorization은 피팅 회귀 모델의 솔루션이 될 수 있습니다. 그러나이 특정 작업의 각 회귀 행렬은 ~ 10'000x10의 크기에 쉽게 접근 할 수 있으므로 각 회귀 행렬 GPU 온칩 메모리 (공유, 레지스터 등)에 맞지 않는 것 같습니다.

본질적으로 대역폭 제한이있는 문제를 회귀 분석 중에 GPU 전역 메모리에 보관해야합니까 아니면 다른 전략을 사용할 수 있습니까?

편집 다음은 문제에 대한 자세한 내용은 다음과 같습니다

약 10'000 주제 ~ 1M 유전 매개 변수 각각이있을 것입니다 (유전 매트릭스 : 10'000x10^6). 각 반복의 알고리즘은이 유전자 매트릭스의 2 열 (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를 완전히 활용하는 데 너무 작을 수 있습니다. 각각의 최소 제곱 문제에 대한


, 당신은 QR 인수 분해 및 삼각 해결을 위해 cuSolver를 사용할 수 있습니다. 문제의 크기가 완전히 GPU를 활용하는 너무 작은 경우

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

, 당신은 동시에 여러 방정식을 해결하기 위해 동시 커널 실행을 사용할 수 있습니다. 는 글로벌 메모리에 맞지 않는 경우, 한 번에 그것의 일부에서만 일할 수있는 전체 데이터 매트릭스에 대한


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

. 예를 들어 행렬을 10 개 (1e4 x 1e5) 블록으로 나눌 수 있습니다. 두 블록을 PCIe에로드 할 때마다 두 블록에서 가능한 모든 두 열 조합을 선택하고 방정식을 풀어 다른 두 블록을로드하십시오. 블록 크기를 최대화하면 PCIe 데이터 전송을 최소화하는 데 도움이됩니다. 적절한 설계를 사용하면 PCIe 데이터 전송에 소요되는 시간이 1e12 방정식을 푸는 것보다 훨씬 적을 것으로 확신합니다.게다가 솔버 커널 실행으로 데이터 전송을 오버랩시킬 수 있습니다.

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

+0

이 질문은 사소한 소리지만, 내가 이해할 수 있다면, 이것은 GPU에 큰 유전자 매트릭스의 두 덩어리를 전송해야한다는 것을 의미합니다 다음 호스트 측면에서 루프를 사용하여 blockXblock 상호 작용을 열거하고 각 루프 iteration은 cudaStreamCreate()에 의해 생성 된 새로운 스트림을 사용할 때마다 입력 행렬에서 cuSolver로 선택된 두 개의 열에 대한 "장치 포인터 오프셋"을 보냅니 까? 호스트 코드의 루프에서이 오프셋을 가장 잘 수행 할 수있는 방법을 알려주십시오. – Sourena

+0

@sourena 스트림에 대한 귀하의 단어가 정확합니다. 두 개의 포인터가 아니라 행렬 A를 만들기 위해 블록에서 두 개의 열을 복사해야합니다. 먼저 스트림에 대해 잊어서 데이터 전송을 중첩 할 수 있습니다. – kangshiyin

+0

"PCIe를 통해 블록 두 개를로드 할 때마다"이 문장을 얻지 못했습니다. 이제 큰 행렬의 두 조각이 GPU 전역 메모리에 있다고 가정합니다. 그런 다음 "매트릭스 A를 만들기 위해 블록에서 두 개의 열을 복사해야합니다"라고 주석을 달았습니다. 호스트 측에 A 열 10 개를 작성한 다음 cuSolver 분석을 위해이를 GPU로 전송해야합니다. 그렇지 않으면 주 대형 행렬의 덩어리를 GPU로 전송 한 다음 진행하기 전에 장치 측에 열 A를 작성합니다. cuSolver? – Sourena