2017년 2월 10일 금요일

Redhat 7.3이 설치된 Minsky 서버에 CUDA 설치하기

먼저 local disk에 Redhat 7.3의 package들을 복사해놓고 local YUM repository를 만들어야 합니다.  이를 위해 RHEL ISO image를 /mnt에 mount 합니다.

# mount -o loop ./RHEL-7.3-20161019.0-Server-ppc64le-dvd1.iso /mnt

# mkdir /home/YUM

ISO image의 Packages directory의 내용을 모두 /home/YUM으로 copy합니다.

# cp -r /mnt/Packages/* /home/YUM

그 중 먼저 YUM repository 구성에 필요한 package를 rpm으로 먼저 설치합니다.

# cd /home/YUM

# rpm -Uvh deltarpm*.rpm python-deltarpm*.rpm createrepo*.rpm

Repository를 만듭니다.

# createrepo /home/YUM

local.repo라는 이름의 repo 파일을 아래와 같이 만들어 줍니다.

# vi /etc/yum.repos.d/local.repo
[local]
name=Red Hat Enterprise Linux
failovermethod=priority
baseurl=file:///home/YUM
enabled=1
metadata_expire=0d
gpgcheck=0

다음으로는, 필요한 기초 package들을 설치합니다.

# yum install gcc openssh-server openssh-clients openssl-devel python-devel

이외에 아래 package들을 설치합니다.  

kernel kernel-devel kernel-headers gcc g++ bzip2-devel openssh-server openssh-clients openssl-devel libaio make automake wget vim-enhanced rsync zip unzip rdate lapack blas blas-devel atlas atlas-devel atlas-sse2-devel atlas-sse2 alsa-utils openmpi glibc libgomp tcsh numpy libpng libpng-devel libpng12 lapack-devel freetype-devel sqlite sqlite-devel curl curl-devel
portaudio portaudio-devel libsndfile libsndfile-devel ftp vsftpd dos2unix unix2dos python-devel


이어서 CUDA를 설치합니다.  CUDA 설치 파일은 다음과 같이 받을 수 있습니다.

# wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-rhel7-8-0-local-ga2-8.0.54-1.ppc64le-rpm

이를 rpm 명령으로 설치합니다.

# rpm -Uvh cuda-repo-rhel7-8-0-local-ga2-8.0.54-1.ppc64le-rpm

이렇게 설치된 것은 CUDA가 아니라 CUDA를 위한 local repo입니다.  이제 다시 YUM 명령으로 cuda를 설치합니다.

# yum list | grep cuda
cuda-repo-rhel7-8-0-local-ga2.ppc64le    8.0.54-1                  installed
cuda.ppc64le                             8.0.54-1                  cuda-8-0-local-ga2
cuda-8-0.ppc64le                         8.0.54-1                  cuda-8-0-local-ga2
cuda-command-line-tools-8-0.ppc64le      8.0.54-1                  cuda-8-0-local-ga2
cuda-core-8-0.ppc64le                    8.0.54-1                  cuda-8-0-local-ga2
cuda-cublas-8-0.ppc64le                  8.0.54-1                  cuda-8-0-local-ga2
cuda-cublas-dev-8-0.ppc64le              8.0.54-1                  cuda-8-0-local-ga2
cuda-cudart-8-0.ppc64le                  8.0.54-1                  cuda-8-0-local-ga2
cuda-cudart-dev-8-0.ppc64le              8.0.54-1                  cuda-8-0-local-ga2
cuda-cufft-8-0.ppc64le                   8.0.54-1                  cuda-8-0-local-ga2
cuda-cufft-dev-8-0.ppc64le               8.0.54-1                  cuda-8-0-local-ga2
cuda-curand-8-0.ppc64le                  8.0.54-1                  cuda-8-0-local-ga2
cuda-curand-dev-8-0.ppc64le              8.0.54-1                  cuda-8-0-local-ga2
cuda-cusolver-8-0.ppc64le                8.0.54-1                  cuda-8-0-local-ga2
cuda-cusolver-dev-8-0.ppc64le            8.0.54-1                  cuda-8-0-local-ga2
...


실제로 cuda를 설치하기 이전에, nvidia driver 설치에 필요한 dkms를 먼저 설치합니다.

# wget ftp://fr2.rpmfind.net/linux/fedora-secondary/development/rawhide/Everything/ppc64le/os/Packages/d/dkms-2.3-1.20161202gitde1dca9.fc26.noarch.rpm

# rpm -Uvh dkms-2.3-1.20161202gitde1dca9.fc26.noarch.rpm


이어서 실제로 cuda를 설치합니다.  대표명인 cuda package를 설치하면 모든 것이 다 설치됩니다.
중간에 아래와 같이 dkms 관련하여 non-fatal error가 하나 발생하지만 이는 무시해도 됩니다.

# yum install cuda
...
Installing : 1:nvidia-kmod-361.107-2.el7.ppc64le 26/41

Creating symlink /var/lib/dkms/nvidia/361.107/source ->
/usr/src/nvidia-361.107

DKMS: add completed.
Error! echo
Your kernel headers for kernel 3.10.0-514.el7.ppc64le cannot be found at
/lib/modules/3.10.0-514.el7.ppc64le/build or /lib/modules/3.10.0-514.el7.ppc64le/source.
Error! echo
Your kernel headers for kernel 3.10.0-514.el7.ppc64le cannot be found at
/lib/modules/3.10.0-514.el7.ppc64le/build or /lib/modules/3.10.0-514.el7.ppc64le/source.
warning: %post(nvidia-kmod-1:361.107-2.el7.ppc64le) scriptlet failed, exit status 1
Non-fatal POSTIN scriptlet failure in rpm package 1:nvidia-kmod-361.107-2.el7.ppc64le
Installing : 1:xorg-x11-drv-nvidia-361.107-1.el7.ppc64le 27/41
...

Installed:
cuda.ppc64le 0:8.0.54-1

Dependency Installed:
cuda-8-0.ppc64le 0:8.0.54-1 cuda-command-line-tools-8-0.ppc64le 0:8.0.54-1
cuda-core-8-0.ppc64le 0:8.0.54-1 cuda-cublas-8-0.ppc64le 0:8.0.54-1
cuda-cublas-dev-8-0.ppc64le 0:8.0.54-1 cuda-cudart-8-0.ppc64le 0:8.0.54-1
cuda-cudart-dev-8-0.ppc64le 0:8.0.54-1 cuda-cufft-8-0.ppc64le 0:8.0.54-1
cuda-cufft-dev-8-0.ppc64le 0:8.0.54-1 cuda-curand-8-0.ppc64le 0:8.0.54-1
cuda-curand-dev-8-0.ppc64le 0:8.0.54-1 cuda-cusolver-8-0.ppc64le 0:8.0.54-1
cuda-cusolver-dev-8-0.ppc64le 0:8.0.54-1 cuda-cusparse-8-0.ppc64le 0:8.0.54-1
cuda-cusparse-dev-8-0.ppc64le 0:8.0.54-1 cuda-demo-suite-8-0.ppc64le 0:8.0.54-1
cuda-documentation-8-0.ppc64le 0:8.0.54-1 cuda-driver-dev-8-0.ppc64le 0:8.0.54-1
cuda-drivers.ppc64le 0:361.107-1 cuda-license-8-0.ppc64le 0:8.0.54-1
cuda-misc-headers-8-0.ppc64le 0:8.0.54-1 cuda-npp-8-0.ppc64le 0:8.0.54-1
cuda-npp-dev-8-0.ppc64le 0:8.0.54-1 cuda-nvgraph-8-0.ppc64le 0:8.0.54-1
cuda-nvgraph-dev-8-0.ppc64le 0:8.0.54-1 cuda-nvml-dev-8-0.ppc64le 0:8.0.54-1
cuda-nvrtc-8-0.ppc64le 0:8.0.54-1 cuda-nvrtc-dev-8-0.ppc64le 0:8.0.54-1
cuda-runtime-8-0.ppc64le 0:8.0.54-1 cuda-samples-8-0.ppc64le 0:8.0.54-1
cuda-toolkit-8-0.ppc64le 0:8.0.54-1 cuda-visual-tools-8-0.ppc64le 0:8.0.54-1
nvidia-kmod.ppc64le 1:361.107-2.el7 xorg-x11-drv-nvidia.ppc64le 1:361.107-1.el7
xorg-x11-drv-nvidia-devel.ppc64le 1:361.107-1.el7 xorg-x11-drv-nvidia-libs.ppc64le 1:361.107-1.el7

Complete!

여기서 한번 rebooting을 한 뒤, GPU의 utilization을 모니터링 해봅니다.

$ nvidia-smi -l 5



CUDA 기본 sample 중 일부를 compile하여 수행해 봅니다.  해당 directory에서 make를 수행하면 nvcc가 수행되면서 실행 file이 만들어집니다.  그것을 수행해봅니다.

$ cd /usr/local/cuda/samples/0_Simple/simpleMultiCopy

$ sudo make
/usr/local/cuda-8.0/bin/nvcc -ccbin g++ -I../../common/inc  -m64    -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode

$ ls -ltr
total 796
-rw-r--r--. 1 root root  11855 Oct 28 17:14 simpleMultiCopy.cu
-rw-r--r--. 1 root root    566 Oct 28 17:14 readme.txt
-rw-r--r--. 1 root root   2583 Oct 28 17:14 NsightEclipse.xml
-rw-r--r--. 1 root root   9110 Nov  3 20:35 Makefile
drwxr-xr-x. 2 root root    192 Feb 10 02:58 doc
-rw-r--r--. 1 root root  66664 Feb 10 03:13 simpleMultiCopy.o
-rwxr-xr-x. 1 root root 736864 Feb 10 03:13 simpleMultiCopy

$ ./simpleMultiCopy

제대로 나오면 준비 완료입니다.

root user에서 다음과 같이 기본 tuning을 합니다.  CPU clock의 governor를 기본인 ondemand에서 performance로 바꾸고, GPU autoboost도 enable합니다. 

# cpupower frequency-set --governor performance

# nvidia-smi -pm ENABLED

# nvidia-smi -ac 715,1480


모니터링에 편리한 tool인 nmon도 download 받습니다.

# wget http://sourceforge.net/projects/nmon/files/nmon16f_power_mr_nmon.tar.gz

이 gz file 속에는 ubuntu 및 SuSE 등 모든 ppc64 용 nmon binary가 다 들어있으니, 그 중 Redhat LE에 필요한 것만 뽑아내어 /usr/bin/nmon으로 copy 합니다.

# tar -ztvf nmon16f_power_mr_nmon.tar.gz
-rwx------ nag/rtc      555016 2016-05-19 17:12 nmon16f_power_ubuntu1604
-rwx------ nag/rtc      452341 2016-05-19 17:26 nmon16f_power_sles12
-rwx------ nag/rtc      438960 2016-05-19 17:31 nmon16f_power_sles113
-rwx------ nag/rtc      411549 2016-05-19 17:39 nmon16f_power_rhel65
-rwx------ nag/rtc      462722 2016-05-19 17:48 nmon16f_power_rhel71BE
-rwx------ nag/rtc      461411 2016-05-19 17:56 nmon16f_power_rhel71LE
-rwx------ nag/rtc      541671 2016-05-19 18:14 nmon16f_power_ubuntu1404

# tar -zxvf nmon16f_power_mr_nmon.tar.gz nmon16f_power_rhel71LE
nmon16f_power_rhel71LE

# chmod a+x nmon16f_power_rhel71LE
# cp nmon16f_power_rhel71LE /usr/bin/nmon

사용방법은 AIX의 nmon과 동일합니다만, adapter stats를 보여주는 a option은 없는 점이 아쉽습니다.



댓글 1개: