본문 바로가기

대용량 플랫폼

[박혜웅] "Big Data 처리를 위한 Hadoop과 GPGPU 세미나" 후기

http://onoffmix.com/event/4325


2011년 11월 10일 부터 11일까지 정보통신 산업 진흥원에서,  Hadoop과 GPGPU(CUDA) 에 대한 세미나가 소프트비전 주최로 열렸다. 회사 일정상 11일(금)에만 참석하였고, 총 3개의 발표가 있었는데 그 중 OpenGL, Virtualization 관련 발표 1개를 제외한 2개의 발표에 대한 요약이다.
아쉽게도 발표자료를 파일로 공유하지 않았고, 세미나 참석자에게 프린트물로 제공하여서 링크가 없다.

<GPU 클러스터 및 개발 환경 - 양도영이사>
CUDA는 GPU기반 분산라이브러리로 nVidia에서 주도적으로 개발, 배포하고 있다.
과거버전은 OpenCL이며, 2007년도부터 CUDA Toolkit과 SDK를 공개하고 있다.
2011년 4월 현재 SDK4.0이 발표되었고, 특징으로는 CPU를 거치지 않고 GPU끼리 데이타전송이 가능하며, C만 지원하던 기존버전과 달리 C++에서도 포팅되도록 지원하고 있다.

<그림: 
http://en.wikipedia.org/wiki/File:CUDA_processing_flow_(En).PNG 편집>

CUDA를 사용하려면 프로그램(코드)가 병렬처리할 수 있도록 해야 한다. (이건 MapReduce도 마찬가지지만..)
아래 그림이 가장 중요한 GPU를 이용한 병렬 연산 과정인데, 아래와 같다.
(1) 처리할 데이타를 메모리에서 GPU메모리로 보낸다.
(2) 처리할 명령어를 GPU로 보낸다. (당연히 CUDA 라이브러리의 API 함수를 이용해야 한다.)
(3) 각 코어에서 병렬 실행한다.
(4) 실행결과를 GPU메모리에서 메모리로 가져온다.

GPU는 GPU메모리만 접근이 가능하므로, CUDA 명령을 실행하기에 항상 GPU메모리에 사용할 데이타가 있어야 한다.
아래 그림에서 빨간색 박스가 1개의 GPU를 나타내며, SP또는 DP는 각각의 코어를 나타낸다. SP는 32bit 연산용이며, DP는 64bit 연산용이다. 일반적으로 SP보다 DP가 느리다. 그림에 표시되지 않은 것중에 SFU라고 sin, cos등 특수한 연산용의 코어도 있고, CPU처럼 cache도 GPU안에 포함된다.
CPU처럼 각 코어는 다수의 thread를 실행할 수 있다.

* 일반적으로 (3)의 실행시간보다 (1)의 입력데이타 전송시간이 오래 걸린다. 이 속도는 그래픽카드 슬롯인 PCI-Express에 의존하므로, PCI-Express의 속도가 중요하다. 2011년 현재 가장 빠른 PCI-Express의 속도는 16배속이다.

그래픽카드 설치할 때, 크기가 있으므로 메인보드의 슬롯을 2개 정도 차지할 수 있다. 따라서, 
PCI-Express 슬롯이 8개인 메인보드일 경우 그래픽카드를 4개까지 설치할 수도 있으며, VGA OUT이 없는 그래픽카드인 경우는 연산용으로 3개만 설치할 수 있다.

GPU Cluster는 노드(Host server+GPU server)당 GPU가 8개 이하가 적당하다. 왜냐하면 너무 많은 GPU를 꼽아도 병목이 그래픽카드 연결 케이블에서 발생한다.
2010년까지 GPU Cluster로 만든 중국의 슈퍼컴퓨터인 Tianhe-1A가 1위를 했다. (
http://top500.org/ 참조.) Tianhe-1A의 경우 네트워크의 bottle neck을 완화하기 위해 7.96Tbps 광케이블을 이용했다.
슈퍼컴퓨터 성능의 클러스터의 경우, 안정적인 전력 공급이나, 냉각(cooling) 관련 이슈가 존재한다.

CUDA 프로그래밍 툴로는 nVidia Parallel NSight 2.0 이 있으며, MS Visual Studio 2008또는 2010의 플러그인 형태로 무료로 제공된다. 이 툴을 사용할 때는 GPU연산용 그래픽카드와 VGA Out용 그래픽카드가 각각 존재해야 한다. 왜냐하면 break point를 걸어서 디버깅할 때, GPU의 동작이 멈추기 때문이다.

CUDA를 사용하기 위해서는 3만원 ~700만원대의 nVidia 그래픽카드가 필요하며, 최근 2년에 출시된 그래픽카드는 모두 지원한다.
일반적으로 처음 테스트나 저가용으로는 GForce시리즈를 이용하는데, 
GForce는 nVidia에서 칩과 설계도만 제공하고 나머지는 각 벤더에서 제작하는 것으로 장시간(24시간 이상) 연산시 결과가 이상하고 불안정하다고 한다. 따라서 GForce를 이용할 경우, 연산을 2회하여 비교하는 등의 검증 작업이 필요하다.
Tesla는 nVidia에서 직접 제작한 CUDA전용 그래픽카드로 400만원대 이상이며, 안정적이다. 몇몇 모델은 VGA가 아예 없는 경우도 있다.
 


<
Hadoop + GPGPU 개발환경과 응용 - 이동훈> 
MapReduce연산은 게놈 분석처럼 입력데이타를 분산할 수 있는 작업에 적합하며, 현재 생명정보학에 유용히 쓰이고 있다.

외국논문에서 Hadoop MapReduce+GPGPU 연산의 성능을 테스트한 논문을 발표했다. (Mars, 
http://www.cse.ust.hk/gpuqp/) 이 논문에 따르면, CPU대비 약 16배~20배의 속도향상이 있었다고 한다. 전력소모도 감소했다고 한다. (이건 당연한 얘기인듯 수행시간이 감소했으니..). 테스트는 strcpy, strcat, strcmp, strchr, strstr, memset등을 수행한 것이다. 

소프트비전에서도 이 논문을 참조하여 직접 시스템을 구현하였는데, 구현에 성공만 하였고, 실제 GPU를 쓰지 않은 시스템과의 성능 비교는 못했다고 한다. 이 때 Hadoop과 연동하기 위해 Java용  CUDA라이브러리인 JCuda를 이용했다고 하며, Linux에서 Hadoop, CUDA 설치가 어려웠다고 한다. CUDA 의 경우 그래픽카드 드라이버를 설치해야 하는데, Windows와 달리 Linux에서는 드라이버 설치를 위해 커널소스가 있어야 하는등 복잡하다고 한다. 
프로그램을 수행하다가 에러가 발생했는데 원인은 라이브러리 파일을 유저디렉토리에 복사하지 않아서 였다고 한다.
구현할 때의 핵심은 머신당 Mapper를 1개만 할당하고, 머신내에서는 CUDA에 의해서 GPU분산처리를 하는 것이었다.

소프트비전이 운영하는 카페(
http://cafe.naver.com/gpusupercomputing)와 오픈소스프로젝트 홈페이지(http://kldp.net/projects/supercomputing/)에서 실제 세팅하는 문서와 trouble shooting 문서를 찾을 수 있다.