레이블이 NVIDIA인 게시물을 표시합니다. 모든 게시물 표시
레이블이 NVIDIA인 게시물을 표시합니다. 모든 게시물 표시

2018년 6월 20일 수요일

세계 최대의 수퍼컴 Summit에 대한 가벼운 이야기들

2018년 6월 9일, 드디어 세계 최대의 수퍼컴 Summit이 발표되었습니다.   요구되었던 '최소 150 PetaFLOPS 이상'을 훌쩍 뛰어넘은 200 PetaFLOPS을 구축했고, 이로서 중국의 TaihuLight에게 넘겨주었던 기존의 세계 최대 수퍼컴이라는 타이틀을 5년만에 미국이 되찾아 왔습니다.

수퍼컴이 사용되는 HPC (High Performance Computing)라는 분야는 과학기술 쪽의 박사님들 외에는 잘 모르시고 또 알 필요도 없는 분야입니다만, 이번 글에서는 IT가 아닌 분들도 쉽고 흥미있게 읽으실 수 있도록 이 세계 최대의 수퍼컴에 대해 써봤습니다.



(Summit에 관련된 인포그래픽입니다.   원본은 https://www.olcf.ornl.gov/wp-content/uploads/2018/06/Summit_bythenumbers_FIN.png 입니다.)


1.  CORAL project란 무엇인가 ?

전세계 수퍼컴의 연산능력은 1등부터 500등까지 순위대로 top500.org에 등재됩니다. 여기에 얼마나 많은 수퍼컴이 등재되었는지, 또 얼마나 큰 수퍼컴이 등재되는지가 월드컵 순위나 GDP 순위처럼 일종의 국력의 척도로서 자존심 싸움이 되기도 합니다.  그런데 2013년, 중국이 자체 개발한 TaihuLight라는 수퍼컴이 미국을 따돌리고 세계 최대의 수퍼컴이 되었습니다.  그 성능은 100 PetaFLOPS(Peta = 10의 15승, FLOPS = FLoating Point Operations Per Second = 초당 부동소수점 연산)였습니다.

꼭 이것 때문이라고 하기는 어렵겠으나, 미국의 수퍼컴 프로젝트를 주관하는 미국 에너지성(Department of Energy)에서는 바로 다음해인 2014년 CORAL (Collaboration of Oak Ridge, Argonne, and Livermore)이라는 이름의 프로젝트 하에 오크 릿지, 아르곤, 로렌스 리버모어의 세 국립 연구소의 수퍼컴을 업그레이드/대체하는 사업을 발표합니다.  그 중 오크 릿지와 로렌스 리버모어는 IBM와 NVIDIA, 그리고 인피니밴드 업체인 Mellanox의 OpenPOWER 컨소시엄이 수주한 것입니다.   아르곤에서는 인텔이 주사업자로서 Intel Xeon CPU와 Xeon Phi 가속기를 이용한 수퍼컴을 구축하게 되었습니다.   이 세 연구소의 수퍼컴 중 가장 큰 것은 Summit 입니다.


2.  오크 릿지 Summit 성능이 발표 되었으니, 이제 구축이 끝난 것인가 ?

아닙니다.  아직 Summit은 구축 중이며, 내년 초에나 정식 오픈하는 것으로 되어 있습니다.  물론 최근인 6월 8일, 오크 릿지는 Summit의 성능이 200 PetaFLOPS라고 발표했습니다.  원래 2014년에 나왔던 제안요청서(RFP)에는 150 PetaFLOPS 이상의 성능을 가질 것이 요구되었는데, 그 기준을 여유있게 통과한 것입니다.   다만 6월 20일 현재, 아직 top500.org에는 등재되지 않았습니다.  Top500 list는 매년 6월과 11월, 2차례에 걸쳐 등재되는데, 6월 말에나 업데이트가 될 예정입니다.


3.  최근 볼턴 미 백악관 안보 보좌관이 북한의 핵탄두를 오크 릿지로 반출해야 한다고 주장했는데, 그 오크 릿지가 이 오크 릿지인가 ?

맞습니다.  테네시 주의 오크 릿지에 위치한 오크 릿지 국립 연구소는 제2차 세계대전 당시 미국의 핵무기 개발을 위한 극비 프로젝트였던 맨하탄 계획이 수행된 곳입니다.  다만 볼턴 보좌관이 언급한 곳이 이 국립 연구소를 뜻하는 것인지 아니면 바로 옆에 있는 핵연료 처리 시설인 Y-12 National Security Complex를 가리키는 것인지는 불분명하다고 합니다.


(오크 릿지 연구소 바로 옆에 위치한 Y-12 핵시설입니다.  여기서 제2차 세계대전 때 히로시마와 나가사키에 투하된 원폭을 만들었습니다.)


4.  왜 같은 CORAL 프로젝트 중에서 오크 릿지 연구소의 Summit에 대해서만 이야기가 많고, 로렌스 리버모어 연구소의 Sierra에 대해서는 발표되는 것이 거의 없는가 ?

두가지 이유가 있습니다.  첫째, 오크 릿지의 Summit이 더 크고 더 먼저 시작했습니다.  둘째, 로렌스 리버모어의 보안이 훨씬 엄중합니다.

오크 릿지에서도 고에너지 물리학, 즉 핵물리학 연구를 계속 합니다만, 일반 민간 연구용으로도 컴퓨팅 파워를 빌려줍니다만, 로렌스 리버모어 연구소는 정말 순수하게 핵무기 등 국가 안보 관련된 연구를 하는 곳이라서 외부인들이 Sierra에 접속하여 민간용 연구를 할 일은 없을 것 같습니다.   가령 조지 클루니와 니콜 키드먼 주연의 1997년 영화 The Peacemaker에서, 니콜 키드먼이 백악관 소속 핵무기 전문가로 나오는데, 백악관에서 일하기 전에는 로렌스 리버모어에서 핵무기 개발을 했던 것으로 설정되어 있습니다.


5.  그렇다면 오크 릿지의 Summit은 일반인들도 사용이 가능한가 ?

가능은 합니다.  이 링크 https://www.olcf.ornl.gov/for-users/getting-started/#applying-for-a-user-account 를 보면 여러 가지 형태의 user account 신청이 가능합니다.  다만 이 곳은 아마존이나 MS Azure 같은 클라우드 장사하는 곳이 아니므로 '돈을 낼테니 쓰게 해달라'는 식의 요청은 안 되는 모양이고 연구 과제 등에 대해 까다로운 심사를 받아야 하는 모양입니다. 

최근 top500.org에 나온 기사 https://www.top500.org/news/openpower-gathers-momentum-with-major-deployments/ 를 보면 다음과 같이 우버도 자사의 tensorflow 기반의 신경망을 이 Summit에서 training하고자 오크 릿지와 협업 중에 있다고 합니다.

"우버는 텐서플로우에 기반한 자사의 분산 training 프레임웍인 Horovod를 Summit에서 수행하기를 원하고 있습니다.  이 딥러닝 업무에는 여러가지 우버의 앱들, 가령 자율주행 네비게이션, 여정 예측, 사기 방지 등이 포함됩니다.  우버는 특히 GPU 사용과 관련되어 Horovod의 확장성을 한단계 더 넓히는데 관심이 있습니다."


6.  Summit이라는 수퍼컴이라는 것은 어떻게 생긴 컴퓨터인가 ?

겉에서 보면 일반 데이터 센터에 있는 서버 랙들의 모양새와 별로 다를 것이 없습니다.




7.  Summit 같은 수퍼컴에도 모니터와 키보드가 달려 있는가 ?

극단적으로 한줄 요약하면 없습니다.  Summit은 4,608대의 AC922이라는 IBM GPU 서버를 모아서 만든 것이므로, 이런 수천대의 서버에 일일이 모니터와 키보드 마우스를 연결하여 제어하는 것은 무리입니다.  이런 서버에는 BMC라고 하는 이더넷 포트(RJ-45)처럼 생긴 BMC(Baseboard Management Controller)용 포트가 있는데, 이를 통해 IPMI (Intelligent Platform Management Interface)라는 것을 통해 서버를 제어합니다.





8. Summit에 사용되는 CPU는 어떤 것인가 ?

과거에는 vector processor라는, 수학 계산에 특화된 아키텍처의 프로세서가 수퍼컴의 주류를 이루었습니다만, 지금은 대부분 사라졌습니다.  수퍼컴에도 보통의 회사에서 사용하는 웹서버에 장착된 일반적인 프로세서가 주로 사용됩니다.  Summit에는 IBM의 POWER9이 사용되었습니다.  이 POWER9 프로세서도 엄청난 고가의 특수 프로세서는 아닙니다.  인터넷 쇼핑몰의 웹서버보다 훨씬 더 중요한 업무라고 할 수 있는 은행이나 증권사의 계정계 서버에는 RISC 프로세서인 IBM POWER 프로세서가 사용되는 경우가 많으며, 그런 곳에서 사용되는 것과 똑같은 프로세서입니다.


9. Summit에서는 어떤 OS를 사용하는가 ?

프로세서와 마찬가지입니다.  요즘은 수퍼컴에서도 윈도우즈도 많이 사용합니다.  물론 대세는 리눅스입니다.  이번에 Summit에 올라가는 OS도 POWER 계열 프로세서의 아키텍처인 ppc64le용 Redhat 7.5 Linux가 올라가 있습니다.


10. 똑같은 CPU와 똑같은 OS를 쓴다면, 수퍼컴은 대체 무엇이 특수한가 ?

초기의 수퍼컴은 위에서 언급한 것처럼 수학 계산용 특수 CPU를 매우 빠른 속도로 돌리는 방식이었습니다.  지금도 수퍼컴하면 흔히 생각나는 Cray가 바로 그런 수퍼컴의 선구자였지요.  그러나 무작정 CPU clock speed를 높은 GHz로 돌리는 것에는 반도체 물성에 따른 한계가 있고 또 일반 프로세서의 성능이 좋아지면서 점차 일반 프로세서의 서버들 수십~수천 대를 고성능 네트워크로 엮는 cluster 방식이 주종을 이루게 되었습니다.  이러한 cluster 방식의 수퍼컴은 그 클러스터를 이루는 개개의 서버 성능도 중요하지만, 그것을 연결하는 네트워크의 성능 및 병렬 프로그래밍을 위한 SW 기술도 중요합니다.  또한 전력을 적게 사용해야 하고, 많은 data를 고속으로 처리하기 위한 병렬 파일시스템이 필요합니다.

Summit은 IBM의 AC922이라는 2-socket 서버 4,608대로 이루어져 있는데, 이 서버들은 2장의 POWER9 프로세서 뿐만 아니라, 가속기로 NVIDIA의 최신 Telsa GPU인 V100을 6장씩 장착했습니다.  그리고 발열 문제를 효율적으로 해결하기 위해 수냉식으로 되어 있습니다.






11.  Summit은 과거의 수퍼컴과 무엇이 다른가 ?

가장 큰 차이는 GPU 기술을 본격적으로 채택한 수퍼컴이라는 점입니다.  Summit이 대체하게 되는 오크 릿지의 기존 수퍼컴인 Titian과 비교를 해보면 그 차이는 명확합니다.  Summit은 Titian보다 노드(node) 수, 즉 구성 요소인 서버 대수는 1/4 수준이면서도 성능은 7.4배를 냅니다.  덕분에 그렇게 성능을 많이 내면서도 전력소비량도 기존의 1.4배에 불과합니다.


(이 표에는 노드 당 성능이 42 TFLOPS라고 나와 있습니다만, 이는 double-precision, 즉 FP64 성능을 기준으로 한 것입니다.  또한 원래 V100 SXM2의 FP64 성능은 NVIDIA에 따르면 7.8 TFLOPS이므로, 7.8 x 6장 = 46.8 TFLOPS가 맞을텐데, Oak Ridge의 홈페이지에는 42 TFLOPS라고 나옵니다.  오타일까요 ? )


12. 결국 Summit의 핵심은 GPU인 것 같다.   요즘 Deep Learning에 GPU 서버를 많이 사용하는데, 그런 GPU 서버와 이 Summit은 무엇이 다른가 ?

기본적으로는 동일합니다.  그러나 중요한 차이가 2가지 있습니다.  하나는 NVLink이고, 다른 하나는 PCIe Gen4 입니다.  둘다 I/O 쪽 기술이지요.

NVLink는 NVIDIA가 개발한 GPU 연결 기술로서, 일반 x86 서버에서도 사용됩니다.  그러나 IBM POWER9에서만 가능한 것이 따로 있습니다.  PCIe Gen3 포트만 장착된 Intel Xeon 프로세서에서는 NVLink를 GPU간의 연결에만 사용할 수 있고, Intel Xeon 프로세서와 GPU 간의 통신은 느린 PCIe를 사용해야 합니다.  그와 달리, IBM POWER9에는 NVLink 2.0 port가 실리콘에 박혀 있습니다.  이를 통해 POWER9 프로세서는 PCIe가 아닌, NVLink를 통해 V100 GPU와 직접 통신을 합니다.  GPU 간의 peer-to-peer 통신이 NVLink로 되어 있을 경우 Caffe 등을 이용한 deep learning에서는 어느 정도 효과를 볼 수 있지만, HPC 업무에는 오로지 CPU와 GPU 간의 통신이 중요합니다.

또 있습니다.  IBM POWER9은 2018년 여름 현재, PCIe Gen4 포트가 장착된 유일한 프로세서입니다.  이를 통해 AC922은 고속 네트워크인 100Gb EDR Infiniband를 일반 x86 서버보다 2배의 대역폭으로 연결할 수 있습니다.  이 infiniband를 통해 Summit은 고속 병렬파일시스템을 연결하고, 또 Summit을 이루는 4,608대의 AC922 서버 간의 MPI (Message Passing Interface) 통신을 고속으로 수행합니다.

이러한 이유 때문에 IBM와 NVIDIA, 그리고 인피니밴드 업체인 Mellanox의 OpenPOWER 컨소시엄이  Summit과 Sierra라고 하는 2대의 수퍼컴을 개발 구매하는 CORAL project의 공급자로 채택된 것입니다.




2018년 5월 11일 금요일

ppc64le 환경에서 NVIDIA DIGITS의 설치

먼저 알아두셔야 하는 것이, NVIDIA DIGITS를 사용하기 위해서는 caffe 설치는 필수이며 또 python2만 지원된다는 것입니다.   python3는 현재 지원되지 않습니다. 

[ibm@centos01 ~]$ sudo yum install graphviz graphviz-devel gfortran libxkbcommon-x11-devel xorg-x11-server-devel

[ibm@centos01 ~]$ which pip
~/anaconda2/bin/pip

먼저 caffe를 설치한 뒤, 다음과 같이 caffe가 요구하는 python package들을 설치합니다.

[ibm@centos01 DIGITS]$ env | grep ROOT
DIGITS_ROOT=/home/ibm/DIGITS
CAFFE_ROOT=/home/ibm/caffe

[ibm@centos01 ~]$ pip install -r $CAFFE_ROOT/python/requirements.txt

특히 caffe 설치 때 make pycaffe를 수행하는 것을 잊지 마셔야 합니다.

[ibm@centos01 caffe]$ pwd
/home/ibm/caffe

[ibm@centos01 caffe]$ make pycaffe

이제 DIGITS source code를 download 받습니다.

[ibm@centos01 ~]$ git clone https://github.com/NVIDIA/DIGITS.git

[ibm@centos01 ~]$ cd DIGITS

[ibm@centos01 DIGITS]$ vi requirements.txt
...
#h5py>=2.2.1,<=2.6.0
h5py>=2.2.1,<=2.7.1
#pydot>=1.0.28,<=1.0.29
pydot>=1.2.4,<1.2.5
...

위와 같이 수정하지 않으면 다음과 같이 h5py 및 pydot에서 다음과 같은 error들을 겪게 됩니다.

    /tmp/pip-build-csqz23it/h5py/h5py/api_compat.h:27:18: fatal error: hdf5.h: No such file or directory
     #include "hdf5.h"
                      ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

      File "/tmp/pip-build-5i5hsyt1/pydot/pydot.py", line 31
        except Exception, e:
                        ^
    SyntaxError: invalid syntax
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-5i5hsyt1/pydot/

기본적으로 DIGITS는 python2로 작성된 script라 pip로 필요 package들을 다음과 같이 설치하면 됩니다.

[ibm@centos01 DIGITS]$ pip install -r ./requirements.txt

추가로 다음과 같은 python package를 수동으로 설치해야 합니다. 

[ibm@centos01 DIGITS]$ pip install scikit-fmm

그러지 않으면 다음과 같은 에러가 날 수 있습니다.

ImportError: No module named skfmm

이제 digits 서버를 구동합니다.  digits 서버는 daemon화 되어 있지 않으므로, nohup으로 돌리시는 것이 좋습니다. 

[ibm@centos01 DIGITS]$ ./digits-devserver &
  ___ ___ ___ ___ _____ ___
 |   \_ _/ __|_ _|_   _/ __|
 | |) | | (_ || |  | | \__ \
 |___/___\___|___| |_| |___/ 6.1.1

/home/ibm/anaconda2/lib/python2.7/site-packages/h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
cudaRuntimeGetVersion() failed with error #30
2018-05-11 16:09:54 [INFO ] Loaded 0 jobs.

위에서 난 cudaRuntimeGetVersion() error는 이 서버에는 GPU가 없기 때문에 발생한 것이니 무시하셔도 됩니다.

이제 5000번 port로 연결해보면 다음과 같이 메뉴가 나옵니다.  다음번에는 DIGITS를 이용하여 data preprocessing부터 해보도록 하겠습니다.



2017년 7월 24일 월요일

Minsky 서버에서 NVIDIA DIGITS로 MNIST LeNet training 해보기

이번 posting 내용은 아래 URL에 있는 것을 IBM ppc64le 아키텍처 위에서 제공되는 IBM PowerAI tool에 포함된 digits로 구현해본 것입니다.

https://github.com/NVIDIA/DIGITS/blob/master/docs/GettingStarted.md

DIGITS는 NVIDIA에서 내놓은 오픈소스 기반의 딥 러닝 toolkit입니다.  DIGITS에 대해서 NVIDIA가 소개해놓은 글 ( https://developer.nvidia.com/digits )을 읽어보면 대체 이게 뭐라는 것인지 명확하지는 않습니다.  아래와 같이 그냥 좋은 말만 나와 있거든요.  사실 이런 경향은 IBM을 포함한 모든 벤더들이 다 보여주고 있습니다.

The NVIDIA Deep Learning GPU Training System (DIGITS) puts the power of deep learning into the hands of engineers and data scientists. DIGITS can be used to rapidly train the highly accurate deep neural network (DNNs) for image classification, segmentation and object detection tasks.

결론적으로, DIGITS는 caffe나 torch와 같은 딥 러닝용 framework 자체는 아니고, caffe나 torch를 이용하여 딥 러닝을 수행할 때 좀 더 쉽고 빠르게 할 수 있게 해주는 유용한 웹 기반의 tool입니다.  아마 당장 나오는 질문이 '그럼 tensorflow는 안 되나요'라는 것일텐데, 2017년 7월 24일 현재 당장은 안 됩니다.  그러나 NVIDIA도 DIGITS에 tensorflow 지원을 추가하려고 하고 있고, 이번 달에 나온다고 합니다.

여기서는 caffe를 이용해서 가장 간단한 딥 러닝 training인 MNIST dataset에 대한 LeNet 신경망 training을 DIGITS를 통해 해보도록 하겠습니다.

nvidia-caffe와 digits의 설치는 IBM PowerAI toolkit에서 제공되는 것을 그대로 사용하겠습니다.   그 설치 방법에 대해서는 지난번 posting ( http://hwengineer.blogspot.kr/2017/05/minsky-cuda-powerai-tuning.html )을 참조하시기 바랍니다.

먼저, 그냥 caffe를 이용하여 MNIST dataset에 대한 LeNet 신경망 training을 하는 방법을 봐야 하는데, 이에 대해서는 역시 지난번 posting ( http://hwengineer.blogspot.kr/2017/06/mnist-gpu-cpu-deep-learning.html )에 잘 나와 있으니 그를 참조하시기 바랍니다.

오늘 사례는 GPU가 없는 환경에서 digits를 수행해야 합니다.

시작하기 전에 DIGITS 관련 환경변수를 setup해야 합니다.  DIGITS는 위에서 언급한 것처럼 caffe와 torch를 사용하는 것이기 때문에, "apt-get install digits" 명령만 내려도 자동으로 caffe-nv와 torch를 함께 설치합니다.  마찬가지로, DIGITS를 사용하기 위해 PowerAI에서 제공하는 환경변수 setup script인 /opt/DL/digits/bin/digits-activate를 수행해도, caffe-nv와 torch 관련 환경변수들이 함께 setup 됩니다.   먼저 기본 상태의 PATH 관련 환경 변수를 확인하겠습니다.

u0017496@sys-88165:~$ env | grep PATH
PATH=/home/u0017496/bin:/home/u0017496/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

이제 PowerAI에서 제공하는 환경변수 setup script인 /opt/DL/digits/bin/digits-activate를 수행하겠습니다.  앞에 sh 또는 .을 함께 입력하셔야 한다는 것에 유의하십시요.

u0017496@sys-88165:~$ . /opt/DL/digits/bin/digits-activate

이제 다시 환경변수를 확인하면, openblas와 nccl, cuda 등은 물론이고, torch를 위한 LUA 관련 PATH들도 자동 설정된 것을 보실 수 있습니다.

u0017496@sys-88165:~$ env | grep PATH
LD_LIBRARY_PATH=/opt/DL/openblas/lib:/opt/DL/nccl/lib:/opt/DL/caffe-nv/lib:/usr/local/cuda-8.0/lib64:/opt/DL/torch/lib:/opt/DL/torch/lib/lua/5.1
PATH=/home/u0017496/bin:/home/u0017496/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/DL/caffe-nv/bin:/opt/DL/torch/bin:/opt/DL/digits
LUA_PATH=/home/u0017496/.luarocks/share/lua/5.1/?.lua;/home/u0017496/.luarocks/share/lua/5.1/?/init.lua;/opt/DL/torch/share/lua/5.1/?.lua;/opt/DL/torch/share/lua/5.1/?/init.lua;
LUA_CPATH=/home/u0017496/.luarocks/lib/lua/5.1/?.so;/opt/DL/torch/lib/lua/5.1/?.so;
DYLD_LIBRARY_PATH=/opt/DL/torch/lib:/opt/DL/torch/lib/lua/5.1
PYTHONPATH=/opt/DL/caffe-nv/python:/opt/DL/digits

이제 python을 이용하여 홈 디렉토리 밑에 mnist dataset을 download 받겠습니다.  이때 digits의 download_data 모듈을 유용하게 사용할 수 있습니다.

u0017496@sys-88165:~$ python -m digits.download_data mnist ~/mnist
Downloading url=http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz ...
Downloading url=http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz ...
Downloading url=http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz ...
Downloading url=http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz ...
Uncompressing file=train-images-idx3-ubyte.gz ...
Uncompressing file=train-labels-idx1-ubyte.gz ...
Uncompressing file=t10k-images-idx3-ubyte.gz ...
Uncompressing file=t10k-labels-idx1-ubyte.gz ...
Reading labels from /home/u0017496/mnist/train-labels.bin ...
Reading images from /home/u0017496/mnist/train-images.bin ...
Reading labels from /home/u0017496/mnist/test-labels.bin ...
Reading images from /home/u0017496/mnist/test-images.bin ...
Dataset directory is created successfully at '/home/u0017496/mnist'
Done after 24.0719361305 seconds.

이 python 명령 한줄이면 mnist dataset이 모두 자동으로 다 준비된 것입니다.  아래에서 보시다시피 ~/mnist/train 밑에 train data가 들어가 있는 것을 확인하실 수 있습니다.  ~/mnist/test 밑의 data는 이름과는 달리 test가 아니라 validation을 위해 사용될 것입니다.

u0017496@sys-88165:~$ cd mnist

u0017496@sys-88165:~/mnist$ pwd
/home/u0017496/mnist

u0017496@sys-88165:~/mnist$ ls
t10k-images-idx3-ubyte.gz  test-images.bin  train-images.bin            train-labels-idx1-ubyte.gz
t10k-labels-idx1-ubyte.gz  test-labels.bin  train-images-idx3-ubyte.gz
test                       train            train-labels.bin

u0017496@sys-88165:~/mnist$ cd train

u0017496@sys-88165:~/mnist/train$ ls
0  1  2  3  4  5  6  7  8  9  labels.txt  train.txt


이제 digits-server를 수행합니다.  이는 shell cript로 되어 있으며, daemon화 되어 있지는 않으므로 nohup ~ & 구문을 써서 구동하시는 것이 좋습니다.

u0017496@sys-88165:~$ /opt/DL/digits/digits-devserver &
  ___ ___ ___ ___ _____ ___
 |   \_ _/ __|_ _|_   _/ __|
 | |) | | (_ || |  | | \__ \
 |___/___\___|___| |_| |___/ 5.0.0

/usr/lib/python2.7/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')
NVIDIA: no NVIDIA devices found
cudaRuntimeGetVersion() failed with error #30
2017-07-20 02:33:14 [INFO ] Loaded 0 jobs.

위에서 보시다시피 no NVIDIA devices found라고 error/warning이 있습니다만, 이는 제가 쓰는 이 시스템에 GPU가 없어서 그런 것이니 일단 무시하십시요.


이제 웹 브라우저를 이용해서 http://서버IP주소:5000/ 로 접속하십시요.   그러면 아래와 같이 'Models'라는 메뉴 화면에 접속하게 됩니다.



여기서 아래와 같이 Datasets > New Dataset > Images > Classification 순으로 click 하면 login page로 접속하게 됩니다.  사용자 id를 넣으라고 나올텐데, 이는 사용하시는 OS user명을 넣으시면 됩니다.



이제 아래와 같은 New Image Classification Dataset 메뉴에 들어왔습니다.  여기서 training images에는 위에서 보신 mnist train 디렉토리를 아래와 같이 입력하시고, image type은 Grayscale로, image size는 28 x 28로 변경하십시요.  또 'separate images validation folder'에 check 표시를 클릭해주시면 추가 메뉴가 나오는데, 거기에는 위에서 언급한 대로 mnist test 디렉토리를 입력해주시면 됩니다.  Backend DB는 LMDB로 지정하시고, dataset 이름을 적절한 것으로 지정하십시요.  여기서는 MNIST로 정하겠습니다.




그리고나서 이제 바닥의 파란색 Create 버튼을 click하시면 됩니다.  그러면 우측 상태 메뉴에서 Job Status가 running으로 나오는 것을 보실 수 있습니다.   아래 그림에서는 'Create DB (train)'이 현재 8% 진행되었고 전체적으로는 5분 34초 걸릴 것이라고 예상되어 있는 것을 보실 수 있습니다.  여기서 DB라 함은 LMDB를 말하는 것입니다.  LMDB는 Lightning Memory – Mapped Database라는 것으로서, 간단히 말하면 jpeg 등의 작은 파일로 된 data들을 담는 key-value store이며, 일반 DBMS는 아니지만 고속의 성능을 내기 때문에 이런 딥 러닝 training dataset을 저장하는데 자주 사용됩니다.



이렇게 LMDB가 생성되고 있는데, 그 data는 어떤 규칙에 의해서 만들어지고 있는 것일까요 ?  그건 오른쪽의 스크롤바를 내려 더 아래쪽으로 내려가보시면 볼 수 있습니다.  보시면 "Input File"이라는 항목에 train.txt라는 text file이 보이지요.  거기에는 각 png file 이름과 그에 따른 label이 정의되어 있고, 그에 따라 LMDB가 생성되고 있습니다.  
그 밑에는 그 카테고리, 즉 label에 해당하는 image file들의 숫자가 그래프로 표시되어 있고, 그 그래프 밑에는 'Explore DB'라는 버튼이 보입니다.



이 'Explore DB'라는 버튼을 클릭해보면 아래와 같이 0~9의 숫자마다 어떤 손글씨 그림이 들어있는지를 눈으로 보실 수 있습니다.



LMDB 생성 규칙을 담은 train.txt라는 link를 클릭해보면, 어떤 png file이 어느 숫자로 labeling되어 있는지 보실 수 있습니다.   아래 화면에서는 다 0으로 labeling 되어 있습니다.


좌측 상단의 DIGITS를 click하여 다시 홈페이지로 복귀합니다.   이제 MNIST 라는 dataset을 보실 수 있습니다.


다음으로는 model을 생성하겠습니다.   다음과 같이 Model tab에서 오른쪽 중단의 Images > Classification을 택합니다.


Dataset으로는 방금 생성한 MNIST를 선택합니다.



(여기서부터는 K80이 2장 장착된 Firestone 장비를 구했기 때문에 그것 기준으로 작성했습니다.)

더 밑으로 내려보면 아래와 같이 어떤 신경망을 이용해 training을 할 것인지 정하게 되어 있습니다.  여기서는 LeNet을 선택합니다.


그 밑으로는 몇개의 GPU를 사용하여 training할지 숫자를 적거나, 또는 현재 이 시스템에 장착된 GPU의 종류 및 개수를 보여주며 그 중 어느것을 사용할지 특정하여 선택하게 되어 있습니다.  여기서는 0번과 1번의 2개를 선택하겠습니다.  이렇게 해서 training될 모델의 이름은 LeNet으로 정하겠습니다.


'Create' 버튼을 클릭하면 training이 시작됩니다.   (위에서와는 달리 GPU가 장착된 서버이므로) 이젠 training 속도가 매우 빨라서 3분도 채 안 걸릴 것이라는 예상이 나오는 것을 보실 수 있습니다.


스크롤바를 밑으로 내려보면 accuracy와 loss가 실시간 graph로 보여집니다.  가로축은 epoch, 즉 전체 dataset을 몇번 반복해서 training했는지의 횟수인데, accuracy가 첫 epoch에서 이미 98%에 도달한 이후 더 개선이 없는 것을 보실 수 있습니다.   즉, 이런 경우는 여러번 반복 training하는 것이 큰 의미는 없습니다.  아무튼 여기서는 default인 30-epoch 반복하여 training합니다.


더 아래로 내리면 learning rate가 step size에 따라 계단식으로 줄어드는 것을 보실 수 있습니다.  또한 Caffe process ID 및 그것의 CPU 및 메모리 사용량도 보여줍니다.


아래 시점에서는 이미 19-epoch 반복 training이 끝났고, 그 snapshot이 저장되었기 때문에 'Trained Models'의 'Select Model' 항목에 Epoch #19가 display 되고 있는 것입니다.  Training이 원래대로 30회 반복되고 나면 저 숫자가 30까지 display 될 것입니다.



자, 30회 반복되어 training이 끝났습니다.  이제 trained model을 가지고 inference를 해볼 수 있습니다.  아래의 'Test a single image' 항목에서 Image Path에 실제 png file의 full path 이름을 입력합니다.






입력 후 'Classify One' 버튼을 누르면 새 tab이 생기면서 그 결과가 보여집니다.


여기서는 기존 training dataset 중 하나를 넣은 것이므로, 당연히 100% 정확한 답을 맞춥니다.


이번에는 다음과 같이 8과 1이라는 숫자의 이미지의 URL 주소를 가진 text 파일 'URL1.txt'를 upload하여 분류하도록 해보겠습니다.

http://www.clker.com/cliparts/V/1/Y/3/j/Z/blue-number-1-md.png
https://upload.wikimedia.org/wikipedia/commons/c/cf/NShw_8.png

이 URL에서 가리키는 URL은 각각 다음과 같습니다.





저 URL 주소를 가진 'URL1.txt'를 아래와 같이 'Upload Images List' 항목에 입력하고 'Classify Many'를 클릭합니다.


그 결과는 아래와 같습니다.   즉, 1과 8 대신 4와 9라고 답한 것이지요.  확실히 더 많은 image로 더 많은 training을 거쳐야 제대로 된 답을 내놓을 수 있습니다.


그렇다면 아래처럼 2글자로 된 이미지에는 뭐라고 답을 할까요 ?  참고로 이 LeNet이라는 모델은 하나의 숫자에 대해서만 training이 되어 있습니다.


이번에는 아래처럼 직접 image file을 upload하여 'Classify One' 버튼을 눌러 보겠습니다.  여기서는 특히 'Show visualizations and statistics' 체크 박스도 체크해보겠습니다.


결과는 아래와 같습니다.  3과 8에서 고민하다가 결국 3을 택한 것을 보실 수 있습니다.


그 아래로 내려보면 'Show visualizations and statistics'에 체크를 한 것 때문에 다양한 비주얼라이제이션과 통계치를 보실 수 있습니다.



digits에는 더욱 많은 기능들이 있으니 차츰 더 알아가 보시기 바랍니다.

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은 없는 점이 아쉽습니다.