Transcript PowerPoint

CPU-GPU 이기종 플랫폼에서 하둡 맵리
듀스의 가속: CKY 파서 사례 분석
정보과학회논문지: 컴퓨팅의 실제 및 레터 제20권 제6호, 2014.6, 329-338
15.03.31
CSLAB
Park Se Won
Contents
I.
Method
I.
Hadoop Pipes
II.
CUDA
III.
CKY parser
II. Idea
I.
정적분할
II.
입력 전처리를 통한 부하 균등
III.
GPU 커널의 동적 수행
III. Experiment
I.
동종수행
II.
이기종 수행
IV. Summary
2
Method
Method
 Hadoop pipes
 CUDA
 CKY parser
3
Hadoop pipes
Child JVM
launch
TaskTracker
Child
Map/
Reduce
Task
Input
key/value
C++ wrapper Library
socket
C++ Map/Reduce
class
Output
key/value
그림 1 하둡 파이프의 실행 모델
4
Hadoop pipes(1)
#include <hadoop/Pipes.h>
#include <cutil.h>
Class mapper: public HadoopPipes::Mapper{
public:
void map(MapContext context){
d_abc = cudaMalloc();
cudaMemcpy(d_abc,h_abc,H2D);
PaserGPU<<blocks,threads>>(d_abc);
cudaMemcpy(h_abc,d_abbc<H2D);
cudaFree(d_abc);
}
}
그림 3 하둡 맵리듀스에서 GPU 매퍼
5
Hadoop pipes(2)
#define SPLIT_SLOP 1.1
public InputSplit[] getSplits(JObConf job, int numSplits){
totalSize = file.getLen()
goalSize = totalSize/numSplits
bytesRemaining = totalSize
}
while(bytesRemaining/goalSize > SPLIT_SLOP){
splits.add(new FileSplit(file.path,
totalSize - bytesRemaining,
goalSize))
bytesRemaining -= goalSize
}
...
return splits
6
Hadoop pipes(3)
#define SPLIT_SLOP 1.1
public InputSplit[] getSplits(JObConf job, int numSplits){
totalSize = file.getLen()
cpu_totalSize = totalSize * pf
gpu_totalSize = totalSize – cpu_totalSize
num_gpu_maptask = num_nodes
num_cpu_maptask = numSplits – num_gpu_maptask
cpu_goalSize = cpu_totalSize / num_cpu_maptask
gpu_goalSize = gpu_totalSize / num_gpu_maptask
cnt = 0
splitSize = gpu_goalSize
bytesRemaining = totalSize
#define SPLIT_SLOP 1.1
public InputSplit[] getSplits(JObConf job, int numSplits){
totalSize = file.getLen()
goalSize = totalSize/numSplits
bytesRemaining = totalSize
7
Hadoop pipes(4)
while(bytesRemaining/goalSize > SPLIT_SLOP){
if( cnt % max_maptask !=0){
splitSize = cpu_goalSize
offset = cpu_offset + (cpu_totalSize – cpu_bytesRemaining)
cpu_bytesRemaining -= splitSize
}else{
splitSize = gpu_goalSize
offset = fpu_offset + (gpu_totalSize – gpu_bytesRemaining -= splitSize
}
splits.add(new FileSplit(file.path,
totalSize - bytesRemaining,
goalSize))
bytesRemaining -= cpu_bytesRemaining + gpu_bytesRemaining
cnt++
}
}
...
return splits
}
while(bytesRemaining/goalSize > SPLIT_SLOP){
splits.add(new FileSplit(file.path,
totalSize - bytesRemaining,
goalSize))
bytesRemaining -= goalSize
}
...
return splits
8
CUDA
9
CKY parser
Cocke-Kasami-Younger, CKY
특정한 문자열에 대해 어떠한 방식으로 생성되는지를 판단
하는 파싱 알고리즘
문법에 포함된 규칙의 수: G
문장의 단어 수 n
O(|G|𝑛2 ) 복잡도
10
Idea
Idea
 정적분할
 입력 전처리를 통한 부하 균등
 GPU 커널의 동적 수행
11
Environment
CPU
2 * Intel Xeon E5-2630
(6 cores @ 2.3GHz)
GPU
Tesla K20c
(2496 cores @ 0.71 GHz)
Host Memory
64 GB
Device Memory
5 GB
System specification
WC
Bytes
CPU(ms) GPU(ms) Sp. Up
Min
1
8
3
5
0.6
Max
47
298
36398
937
43.31
Avg
22.6
124.3
6650.5
205.6
26.16
입력 문장들에 대한 정보
12
노드 수 증가에 따른 가속 정도
노드 수 증가에 따른 가속 정도
16
14
12
Speedup
10
8
6
4
2
0
1
2
4
8
14
# Nodes
CPU mapper
GPU mapper
Ideal
13
노드 당 매퍼 수에 따른 영향
셋업 시간 세부 프로파일링 결과
2.5
2
1.5
1
0.5
0
ratio
𝑡𝑖𝑚𝑒 |#𝑚𝑎𝑝𝑝𝑒𝑟 = 12
𝑡𝑖𝑚𝑒 |#𝑚𝑎𝑝𝑝𝑒𝑟 = 1
14
노드 당 매퍼 수에 따른 영향
 노드 당 매퍼 증가  I/O 병목 발생
Mapper
Mapper
Mapper
...
Hard or Memory
15
정적분할
𝑛 ∗ 𝑐𝑝𝑢
𝑝𝑓 =
𝑛 ∗ 𝑐𝑝𝑢 + 𝑚 ∗ 𝑔𝑝𝑢
전체 입력 중 CPU 매퍼 군이 처리하는 입력의 비율(partition factor)
n: CPU 매퍼 수
m: GPU 매퍼 수
cpu: 하나의 CPU매퍼가 처리하는 입력의 양
gpu: 하나의 GPU매퍼가 처리하는 입력의 양
최적의 성능: pf에 의한 양보다 더 낮게 설정
16
입력 전처리를 통한 부하 균등
단어 수에 의해 정렬
GPU1
GPU2
부하
불균형
pf
CPU1
CPU2
17
입력 전처리를 통한 부하 균등
Interleaving
단어 수에 의해 정렬
GPU1
GPU2
pf
CPU1
CPU2
18
GPU 커널의 동적 수행
CPU Mapper가 GPU Mapper에게 처리할 문장 전달 불가
통신불가
Mapper
Mapper
19
GPU 커널의 동적 수행
GPU
CPU
Mapper
MODE = CPU
wc = word_count(input_sentence)
If(MODE != GPU && wc < threshold)
Parser_CPU(input)
else
Parser_GPU(input)
Memory
Mapper
단어 개수가 역치 미만이면 CPU
그렇지 않은 경우GPU
20
Idea
Experiment
 동종 수행
 이기종 수행
21
동종 수행(Homogeneous Execution)
동종 수행 결과
45000
단일 노드 CPU 수행
단일 노드 GPU 수행
하둡 맵리듀스 이용, 14개 노드
Hadoop XXX(#매퍼)
40000
Execution Time(sec)
35000
38817
30000
25000
노드 증가
노드 당 매퍼 증가
20000
15000
10000
5000
0
x23
1686
x12
3031
12*14
= 168
x99
389
23*14
= 322
x245
x244
158
159
Single Node CPU Single Node GPU Hadoop CPU(1) Hadoop CPU(12) Hadoop GPU(1) Hadoop GPU(12)
22
이기종 수행(Heterogeneous Execution)
이기종 수행 결과
-8.86%
Execution Time(sec)
172
0%
158
3.16%
153
12.66%
138
HADOOP GPU(1)
VER. 1
VER. 2
VER. 3
23
Summary
Ver. 1~3 CPU 매퍼 11개, GPU 매퍼 1개
Ver. 1: 정적 분할 이용 (pf)
Ver. 2: Input을 단어 수대로 정렬 후 인터리빙 방식으로 매퍼에 할당
Ver. 3: Input을 정렬하지 않고 pf 기반으로 정적으로 분할 후 CPU
매퍼에서 입력에 따라 동적으로 수행  Ver .1 의 pf 값 이용
24
Summary
How to use GPU for Hadoop?
CPU + GPU
25