AWS-GPU와 크로스보드 방법 비교(P2 실례편) - 크로스보드 기준 소프트웨어 이동

16395 단어 LINPACKAWS
전에 나는 핸드 머신과 컴퓨터를 비교하는 방법라는 어리석은 기사를 썼다.
아울러 aws의 g2 실례 사용 여부를 GPU로 평가한다는 취지AWS-GPU 및 보드 간 비교 방법로 기사를 썼다.당시에는 g2 사례였으나 최근 AWS에 새로운 GPU 사례p2 실례가 추가됐다.그나저나 우리도 평가해 봅시다.
이전 보도와 마찬가지로 awsp2 실례(CUDA)에서 LINPACK 기준을 이동해 봤습니다.
슈퍼컴퓨터는 메모리, 저장 및 네트워크 성능이 매우 높기 때문에 정말로 받아들이지 마세요.
기준의 내용을 잘 모르기 때문에 틀렸을 수도 있다.
많은 메커니즘이 이전 문장AWS-GPU 및 보드 간 비교 방법을 참고했다.

AWS p2.LINPACK 데이텀을 xlarge로 이동합니다.


AWS에서 CPU 속도가 가장 빠른 기기를 사용해 컴퓨터와 성능을 비교해 본 것이다.
이번에 사용한 기계가 여기 있어요.
p2.xlarge
모델
vCPU
메모리
GPU
p2.xlarge
4core
62GB
1
4992 NVIDIA CUDA cores with a dual-GPU design
Up to 2.91 Teraflops double-precision performance with NVIDIA GPU Boost - See more at: http://www.nvidia.com/object/tesla-k80.html#sthash.K2miMs1X.dpuf

LINPACK 데이텀 환경 구축


CUDA 실행 환경의 구축은 상당히 어렵다.
참조AWS-GPU 및 보드 간 비교 방법

linpack 프로그램 준비


https://devtalk.nvidia.com/default/topic/819284/linpack-benchmark-for-cuda/
여기 참고로CUDA Registerd Developer Program에 들어가면 위의 링크
https://developer.nvidia.com/rdp/assets/cuda-accelerated-linpack-linux64
여기서 얻기hpl-2.0_FERMI_v15.tgz.

인스턴스 시작


nvidia가 준비한 CUDA 드라이버가 미리 들어오는 환경을 활용합니다.
AWS 마켓플레이스에서 "grid"로 검색하면 나와요.

Amazon Linux AMI with NVIDIA GRID GPU 드라이브를 활용합니다.
오레곤주에만 있으므로 AMI ID amzn-ami-graphics-hvm-206.09.2016128-x8664-ebs-d3fbf14b-243d-46e0-916c-82a8bf6955b4-ami-0d38601a.이용 3 (ama-caf253aa).

초기 설정


다음 거 넣을게요.
sudo yum groupinstall -y "Development Tools"
sudo yum install -y emacs
sudo yum install -y tmux
sudo yum install -y openmpi openmpi-devel
sudo ln -s /opt/nvidia/cuda /usr/local/cuda

INTEL MKL을 활용합니다.


Intel의 Math Library는 다음 페이지에서 제공됩니다.겸사겸사 사용할 서열 번호를 준비하다.
https://software.intel.com/en-us/qualify-for-free-software
등록하면 일련 번호 보내니까 그거 준비할게요.l_mkl_2017.0.098.tgz 등이 받았기 때문에 집행을 전개한다install.sh.대화를 진행합니다(일련 번호 입력).일련 번호를 입력하는 것 이외에 오락 버튼을 누르면 된다.펼칠 때 펼치기silent.cfg 때문에 거기도 설정할 수 있어요.방법은여기.이다.
Math Kernel의 버전이 변경되면 일련 번호가 변경되어야 합니다.
기본값은 /opt/intel 이하입니다.

LINPACK 데이텀 생성하기


관련이 있다여기..

hpl-2.0_FERMI_v15.확장성


hpl-2.0_FERMI_v15.tgz를 펼치다.
아래에서 전개합니다(이하, 전제).
[ec2-user@ip-xxx-xxx-xxx-xxx hpl-2.0_FERMI_v15]$ ls
bin                      HISTORY  Make.CUDA      makes     setup    TUNING
BUGS                     include  Make.CUDA~     Make.top  src      www
COPYRIGHT                INSTALL  Make.CUDA.org  man       testing
CUDA_LINPACK_README.txt  lib      Makefile       README    TODO

환경 설정 작성


~/.bashrc에 다음 내용 추가
# User specific aliases and functions
export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/opt/intel/compilers_and_libra
ries/linux/lib/intel64:/home/ec2-user/hpl-2.0_FERMI_v15/src/cuda:/usr/lib64/open
mpi/lib:/opt/intel/compilers_and_libraries_2017.0.098/linux/compiler/lib/intel64
_lin
export PATH=/usr/lib64/openmpi/bin:$PATH
[ec2-user@ip-10-0-0-192 ~]$
지난번과 달리 추가/home/ec2-user/됐다.
source ~/.bashrc

Make.CUDA의 편집


대부분 메이크다.큐다를 편집하시면 됩니다.
샘플은 여기.
위의 컨텐트를 편집하는 방법은 마지막과 다릅니다./opt/intel/compilers_and_libraries_2017.0.098/linux/compiler/lib/intel64_lin이(가) 추가되었습니다.
make
이면
LAMP5dir= /opt/intel/compilers_and_libraries_2017.0.098/linux/compiler/lib/intel64_lin
완성됩니다.독일에서 so의 경로를 통과했는지 확인하세요.

run_linpack 편집


bin/CUDA 이하 runlinpack 편집
#location of HPL
HPL_DIR=/home/ec2-user/hpl-2.0_FERMI_v15
bin/CUDA설정GPU가 하나이고 CPU가 네 개이기 때문에 네 개를 지정합니다.

HPL.데이터 편집


기준은 HPL입니다.데이터를 편집합니다.그냥 가만히 있어.Ps와 Qs를 1로 지정합니다.
샘플은 여기.
2           # of problems sizes (N)
65536 81920 100000 110000 160000 180000 39007 39000  20960 364160 359424 276480 138240 115200 23040 354432 236160 95040 9600 20737 16129 16128 Ns
2             # of NBs
768 1536 640 768 896 960 1024 1152 1280 384 640 960 768 640 256 960 512 768 11\52 NBs
위 2는 65536 81920까지 하겠다는 뜻인 것 같아요.
7681536까지 하겠다는 뜻이야.
가장 적합한 곳을 찾으면 GFloss의 최적치를 알 수 있을 것 같아요.

LINACK 벤치 실행

mpirun -np 1 -host localhost ./run_linpack
만약 이렇게 한다면 기준은 도망갈 것이다

실행 결과

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       65536   768     1     1             242.50              7.738e+02
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0038208 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       65536  1536     1     1             235.32              7.975e+02
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0043131 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       81920   768     1     1             449.06              8.162e+02
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0040796 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       81920  1536     1     1             454.85              8.058e+02
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0047358 ...... PASSED
================================================================================

길어서 생략했습니다.모든 결과가 이쪽 기스트.에 있다.
결과적으로 800GFloss 비트인 것 같습니다.실제로 GPU는 여력이 있는 것 같지만 N이 8만 개를 넘으면 메인 메모리가 터진다.이론적 값은 2.91TFBops까지이기 때문에 메모리가 허락한다면 성능이 나올 것이다.
참고로 당시 GPU 사용률은 이랬다.nvidea-smi로 상태를 파악합니다.
$nvidia-smi -q  -d UTILIZATION -l

CPU만 있는 경우


GPU를 사용하지 않고 CPU만 사용하는 GFloss는 얼마나 됩니까?xhpl에서 다음과 같이 설정합니다.
CPU_CORES_PER_GPU=4
에서 0.0을 설정합니다.
# hint: for 2050 or 2070 card
#       try 350/(350 + MKL_NUM_THREADS*4*cpu frequency in GHz)
export CUDA_DGEMM_SPLIT=0.00

# hint: try CUDA_DGEMM_SPLIT - 0.10
export CUDA_DTRSM_SPLIT=0.00
실행 결과
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       32032   512     1     1             307.91              7.117e+01
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0046919 ...... PASSED
================================================================================
CPU만 있습니다.71GFlops
p2.xlarge의 cpurun_linpack는 4core입니다.
E5-2686 자체에 대한 자료는 없지만 이쪽 자료와 비교하면 이론값은 대체로 211GFloss다.측정치는 71GFloss이기 때문에 대략 33% 정도입니다.

추기8xlarge 해볼게요.


위의 예에서 p2.xlarge로 시험해 봤어요.저기 GPU가 I야.GPU를 추가해보면 어떨까.
p2 실례는 p2다.xlarge 이외에 p2.8xlarge(8GPU),p2.16xlarge(16GPU) 인스턴스가 있습니다.p2.8xlarge로 시험해 봤어요.
p2.8xlarge의 규격은 여기에 있습니다.
모델
vCPU
메모리
GPU
GPU 메모리
p2.8xlarge
32core
488GB
8
96GB
4992 NVIDIA CUDA cores with a dual-GPU design
Up to 2.91 Teraflops double-precision performance with NVIDIA GPU Boost - See more at: http://www.nvidia.com/object/tesla-k80.html#sthash.K2miMs1X.dpuf
따라서 2.91*8=24TFBOps가 가장 크다.

p2.xlarge로 변경된 점


하나의 프로세스라면 GPU를 하나만 사용합니다.또한 HPL의 Ps와 Qs도 1×1로 지정해야 합니다.하지만 이번에는 8개의 GPU가 있어 다음과 같이 지정했다.
mpirun -np 8 -host localhost ./run_linpack
프로세스 수는 8입니다.그리고 HPL.데이터는 다음과 같이 변경되었다.
0            PMAP process mapping (0=Row-,1=Column-major)
1            # of process grids (P x Q)
2       Ps
4       Qs
16.0         threshold
Ps=2xQs=4=>8이기 때문에 지정CUDA_DGEMM_SPLIT하면 8개의 GPU로 나누어 계산할 수 있을 것 같습니다.
GPU 8개가 이동 중Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz을 보면 정상적으로 움직이고 있음을 알 수 있다.

p2.8xlarge에서 Linkpack을 실행한 결과

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       65536   768     2     4             126.13              1.488e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0030666 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       65536  1536     2     4             106.63              1.760e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0033980 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       65536  2048     2     4              90.45              2.075e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0032682 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       81920   768     2     4             231.72              1.582e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0029593 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       81920  1536     2     4             184.96              1.982e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0031443 ...... PASSED
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR10L2L4       81920  2048     2     4             151.98              2.412e+03
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0030877 ...... PASSED
================================================================================
드디어 2412 GFlost=2.4 TeraFlowps가 됐다.2TFBops를 넘으면 늘 슈퍼컴퓨터 같은 느낌이 든다.그나저나 맥북에서 놀 때.에서는 37GFloss이기 때문에 GPU를 활용하면 대략 65배가량 앞당겨진다.
benchmark의 상세한 내용여기..

16년 전 컴퓨터와 어깨를 나란히 하다


위의 예에서 링크의 기준에는 2412GFloss가 나왔다.이것 괜찮아요?슈퍼컴퓨터의 세계에서 반년에 한 번top500은 슈퍼컴퓨터의 최초 랭킹 500위를 열거한다.찾아보니 딱2000년 6월 목록 1위는 산디아 내셔널 Laboratories(US)였고 시스템은 ASCI Red였다. 그때 계산 속도는 2375GFloss로 거의 비슷했다.16년 전쯤 컴퓨터 수준의 컴퓨팅 능력은 아마존에서도 빌릴 수 있는 거죠(도대체 CUDA와 GPU를 사용해 이 정도의 연산 성능을 달성했을 뿐 메모리와 메모리 등 다른 신뢰성은 전혀 다르니 받아들이지 말아 달라.)

NBs 정보


NBS가 확대되면서 속도가 빨라졌기 때문에 나는 욕망이 생겨서 NBS 4096에 가지 않으려고 시도했다.
N
NBs
GFlops
65536
4096
1437
65536
3072
1993
65536
2048
2162
65536
1536
2079
65536
768
1482
NBS의 값은 2048이 가장 좋은 성적이다.무엇이든 욕심을 부리면 안 된다.

관련 항목


AWS와 크로스보드 방법 비교 - 크로스보드용 기준 소프트웨어 이동
핸드메이드와 컴퓨터를 비교하는 방법. - 컴퓨터용 기준 소프트웨어를 돌려보도록 하겠습니다.
AWS-GPU 및 보드 간 비교 방법

좋은 웹페이지 즐겨찾기