2018년 2월 28일 수요일

AC922의 기본 setup 및 anaconda virutalenv, tensorflow 등의 설치

먼저, AC922에서 CUDA 버전이 아직 불안정한 관계로 일부 손볼 부분이 있습니다.  혹시 그것이 아직 설정되어 있지 않다면 아래 link를 참조하시어 설정하시기 바랍니다.  설정이 제대로 되었다면 "nvidia-smi -l 3" 명령으로 볼 때 아무 문제가 없을 것입니다.  혹시 GPU 사용%에 UNKNOW ERROR 등이 표시된다면 그 설정이 안 된 것입니다.

https://hwengineer.blogspot.kr/2018/01/ac922-ubuntu-container-image-caffe.html

ppc64le 환경에서 EPEL의 rpm은 다음과 같이 download 받습니다.

[root@ac922 ~]$ wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

이걸 다음과 같이 설치하면 /etc/yum.repos.d/epel.repo 등 epel repository 관련 file들이 설치됩니다.

[root@ac922 ~]# rpm -Uvh epel-release-latest-7.noarch.rpm

[root@ac922 ~]# rpm -ql epel-release-7-11.noarch
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
/etc/yum.repos.d/epel-testing.repo
/etc/yum.repos.d/epel.repo
/usr/lib/systemd/system-preset/90-epel.preset
/usr/share/doc/epel-release-7
/usr/share/doc/epel-release-7/GPL

/etc/yum.repos.d/epel.repo의 내용을 보면 아래와 같습니다.

[root@ac922 ~]# vi /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

이제 yum update를 수행한 뒤 yum list를 해보면 epel repository에 python34.ppc64le 등이 보입니다.  이걸 설치하시면 됩니다.

[root@ac922 ~]# yum update

[root@ac922 ~]# yum list | grep python34 | more
python34.ppc64le                           3.4.5-5.el7             epel
python34-libs.ppc64le                      3.4.5-5.el7             epel
libpeas-loader-python34.ppc64le            1.20.0-1.el7            epel
python34-Cython.ppc64le                    0.23.5-1.el7            epel
...

[root@ac922 ~]# yum install python34
...
Running transaction
  Installing : python34-3.4.5-5.el7.ppc64le                                                             1/2
  Installing : python34-libs-3.4.5-5.el7.ppc64le                                                        2/2
  Verifying  : python34-libs-3.4.5-5.el7.ppc64le                                                        1/2
  Verifying  : python34-3.4.5-5.el7.ppc64le                                                             2/2

Installed:
  python34.ppc64le 0:3.4.5-5.el7

Dependency Installed:
  python34-libs.ppc64le 0:3.4.5-5.el7

Complete!

다만 보통 Redhat OS에 포함된 python34를 이용하기보다는 Anaconda를 많이 이용합니다.
Anaconda 설치는 이미 되어 있다고 가정하겠습니다.  안 되어 있다면 다음과 같이 받아서 저 file을 수행하시면 됩니다.

$ wget https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-ppc64le.sh
$ wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-ppc64le.sh

여기서는 Anaconda2를 사용한다고 가정하겠습니다.

[user1@ac922 ~]$ which conda
~/anaconda2/bin/conda

virutalenv는 다음과 같이 x86과 동일하게 생성하시면 됩니다.  여기서는 python 3.6 환경을 만들겠습니다.

[user1@ac922 ~]$ conda create -n env_py36 python=3.6 anaconda
...
isort 4.2.15: ###################################################################################### | 100%
six 1.11.0: ######################################################################################## | 100%
conda-build 3.4.1: ################################################################################# | 100%
numpy 1.13.3: ###################################################################################### | 100%
click 6.7: ######################################################################################### | 100%
send2trash 1.4.2: ################################################################################## | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use:
# > source activate env_py36
#
# To deactivate an active environment, use:
# > source deactivate
#

virtualenv의 사용법도 x86에서와 동일합니다.  다만 pip 등의 이름이 pip3가 아니라 그냥 pip일 뿐입니다.  pip 버전은 물론 python 3.6에 딸린 버전입니다.

[user1@ac922 ~]$ source activate env_py36

(env_py36) [user1@ac922 ~]$ which python
~/anaconda2/envs/env_py36/bin/python

(env_py36) [user1@ac922 ~]$ which pip
~/anaconda2/envs/env_py36/bin/pip

(env_py36) [user1@ac922 ~]$ pip --version
pip 9.0.1 from /home/user1/anaconda2/envs/env_py36/lib/python3.6/site-packages (python 3.6)

이제 jupyterhub나 sudospawner 등 필요하신 것을 그대로 설치하시면 됩니다.

(env_py36) [user1@ac922 ~]$ pip install jupyterhub
...
Successfully built alembic python-oauth2 Mako python-editor
Installing collected packages: pamela, Mako, python-editor, alembic, python-oauth2, jupyterhub
Successfully installed Mako-1.0.7 alembic-0.9.8 jupyterhub-0.8.1 pamela-0.3.0 python-editor-1.0.3 python-oauth2-1.1.0

(env_py36) [user1@ac922 ~]$ pip install sudospawner
...
Requirement already satisfied: parso==0.1.* in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from jedi>=0.10->ipython>=4.0.0->ipykernel->notebook->sudospawner)
Requirement already satisfied: wcwidth in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from prompt_toolkit<2.0.0,>=1.0.4->ipython>=4.0.0->ipykernel->notebook->sudospawner)
Installing collected packages: sudospawner
Successfully installed sudospawner-0.5.1


다만, tensorflow도 그대로 설치하시려 하면 아래처럼 error가 날 겁니다. 

(env_py36) [user1@ac922 ~]$ pip install tensorflow
Collecting tensorflow
  Could not find a version that satisfies the requirement tensorflow (from versions: )
No matching distribution found for tensorflow

이는 아직 ppc64le 환경에서는 CUDA 9을 위한 tensorflow 1.4.1은 없기 때문입니다.  대신 제가 source에서 빌드해놓은 wheel file이 있습니다.  (혹시 필요하실 경우) tensorflow 1.4.1을 source에서 빌드하는 방법은 이 link를 참조하시면 됩니다.  제가 빌드한 tensorflow-1.4.1-cp36-cp36m-linux_ppc64le.whl 파일은 여기서 download 받으시면 됩니다.

(env_py36) [user1@ac922 ~]$ ls files
...
tensorflow-1.4.1-cp36-cp36m-linux_ppc64le.whl

이 wheel 파일을 다음과 같이 pip로 설치하시면 됩니다.

(env_py36) [user1@ac922 ~]$ pip install ./files/tensorflow-1.4.1-cp36-cp36m-linux_ppc64le.whl
Processing ./files/tensorflow-1.4.1-cp36-cp36m-linux_ppc64le.whl
Requirement already satisfied: six>=1.10.0 in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from tensorflow==1.4.1)
Requirement already satisfied: numpy>=1.12.1 in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from tensorflow==1.4.1)
Collecting protobuf>=3.3.0 (from tensorflow==1.4.1)
  Downloading protobuf-3.5.1-py2.py3-none-any.whl (388kB)
    100% |████████████████████████████████| 389kB 1.5MB/s
Collecting tensorflow-tensorboard<0.5.0,>=0.4.0rc1 (from tensorflow==1.4.1)
  Downloading tensorflow_tensorboard-0.4.0-py3-none-any.whl (1.7MB)
    100% |████████████████████████████████| 1.7MB 629kB/s
Collecting enum34>=1.1.6 (from tensorflow==1.4.1)
  Downloading enum34-1.1.6-py3-none-any.whl
Requirement already satisfied: wheel>=0.26 in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from tensorflow==1.4.1)
Requirement already satisfied: setuptools in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from protobuf>=3.3.0->tensorflow==1.4.1)
Collecting bleach==1.5.0 (from tensorflow-tensorboard<0.5.0,>=0.4.0rc1->tensorflow==1.4.1)
  Downloading bleach-1.5.0-py2.py3-none-any.whl
Collecting html5lib==0.9999999 (from tensorflow-tensorboard<0.5.0,>=0.4.0rc1->tensorflow==1.4.1)
  Downloading html5lib-0.9999999.tar.gz (889kB)
    100% |████████████████████████████████| 890kB 1.2MB/s
Collecting markdown>=2.6.8 (from tensorflow-tensorboard<0.5.0,>=0.4.0rc1->tensorflow==1.4.1)
  Downloading Markdown-2.6.11-py2.py3-none-any.whl (78kB)
    100% |████████████████████████████████| 81kB 1.5MB/s
Requirement already satisfied: werkzeug>=0.11.10 in ./anaconda2/envs/env_py36/lib/python3.6/site-packages (from tensorflow-tensorboard<0.5.0,>=0.4.0rc1->tensorflow==1.4.1)
Building wheels for collected packages: html5lib
  Running setup.py bdist_wheel for html5lib ... done
  Stored in directory: /home/user1/.cache/pip/wheels/6f/85/6c/56b8e1292c6214c4eb73b9dda50f53e8e977bf65989373c962
Successfully built html5lib
Installing collected packages: protobuf, html5lib, bleach, markdown, tensorflow-tensorboard, enum34, tensorflow
  Found existing installation: html5lib 1.0.1
    Uninstalling html5lib-1.0.1:
      Successfully uninstalled html5lib-1.0.1
  Found existing installation: bleach 2.1.2
    Uninstalling bleach-2.1.2:
      Successfully uninstalled bleach-2.1.2
Successfully installed bleach-1.5.0 enum34-1.1.6 html5lib-0.9999999 markdown-2.6.11 protobuf-3.5.1 tensorflow-1.4.1 tensorflow-tensorboard-0.4.0

(env_py36) [user1@ac922 ~]$ pip list | grep tensorflow
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
tensorflow (1.4.1)
tensorflow-tensorboard (0.4.0)

이 tensorflow의 이름이 tensorflow-gpu가 아니라고 해서 이것이 CPU 버전의 tensorlfow인 것은 아닙니다.   Source로부터 build한 것은 tensorlfow-gpu와 tensorflow가 따로 있진 않고, 이것도 GPU를 이용하도록 opt=cuda로 build한 것입니다.  다음과 같이 간단한 test로 tensorlfow가 V100 GPU를 제대로 물고 오는 것을 확인하실 수 있습니다.

(env_py36) [user1@ac922 ~]$ python
Python 3.6.4 |Anaconda, Inc.| (default, Feb 11 2018, 08:19:13)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> sess=tf.Session()
2018-02-28 15:08:07.063120: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0004:04:00.0
totalMemory: 15.75GiB freeMemory: 15.33GiB
2018-02-28 15:08:07.432906: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 1 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0004:05:00.0
totalMemory: 15.75GiB freeMemory: 15.34GiB
2018-02-28 15:08:07.856193: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 2 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0035:03:00.0
totalMemory: 15.75GiB freeMemory: 15.33GiB
2018-02-28 15:08:08.288151: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 3 with properties:
name: Tesla V100-SXM2-16GB major: 7 minor: 0 memoryClockRate(GHz): 1.53
pciBusID: 0035:04:00.0
totalMemory: 15.75GiB freeMemory: 15.34GiB
2018-02-28 15:08:08.292038: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Device peer to peer matrix
2018-02-28 15:08:08.295822: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1051] DMA: 0 1 2 3
2018-02-28 15:08:08.295838: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1061] 0:   Y Y N N
2018-02-28 15:08:08.295851: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1061] 1:   Y Y N N
2018-02-28 15:08:08.295863: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1061] 2:   N N Y Y
2018-02-28 15:08:08.295874: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1061] 3:   N N Y Y
2018-02-28 15:08:08.295894: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla V100-SXM2-16GB, pci bus id: 0004:04:00.0, compute capability: 7.0)
2018-02-28 15:08:08.295909: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:1) -> (device: 1, name: Tesla V100-SXM2-16GB, pci bus id: 0004:05:00.0, compute capability: 7.0)
2018-02-28 15:08:08.295921: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:2) -> (device: 2, name: Tesla V100-SXM2-16GB, pci bus id: 0035:03:00.0, compute capability: 7.0)
2018-02-28 15:08:08.295933: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:3) -> (device: 3, name: Tesla V100-SXM2-16GB, pci bus id: 0035:04:00.0, compute capability: 7.0)


이때 nvidia-smi로 다음과 같이 tensorflow가 GPU를 점유하는 것을 보실 수 있습니다.

Wed Feb 28 15:08:17 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.36                 Driver Version: 387.36                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000004:04:00.0 Off |                    0 |
| N/A   37C    P0    51W / 300W |  15340MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-SXM2...  On   | 00000004:05:00.0 Off |                    0 |
| N/A   42C    P0    52W / 300W |  15345MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-SXM2...  On   | 00000035:03:00.0 Off |                    0 |
| N/A   39C    P0    51W / 300W |  15343MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-SXM2...  On   | 00000035:04:00.0 Off |                    0 |
| N/A   43C    P0    52W / 300W |  15344MiB / 16128MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     10141      C   python                                     15336MiB |
|    1     10141      C   python                                     15334MiB |
|    2     10141      C   python                                     15332MiB |
|    3     10141      C   python                                     15338MiB |
+-----------------------------------------------------------------------------+

2018년 2월 20일 화요일

ppc64le용 docker 및 nvidia-docker repository 주소 (Redhat과 Ubuntu)

nvidia-docker version2는 아직 ppc64le에서 테스트되지 않았습니다.  현재는 기존 version1을 쓰시면 됩니다.  그 설치는 기존처럼 source에서 빌드하실 필요가 없고, 아래의 repository를 등록해서 YUM(redhat)과 APT(ubuntu)에서 각각 설치하시면 됩니다.


1. Redhat 환경의 경우

[root@ac922 ~]# cat /etc/yum.repos.d/docker.repo
[docker]
name=Docker
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7/docker-ppc64el/
enabled=1
gpgcheck=0

[root@ac922 ~]# cat /etc/yum.repos.d/nvidia-docker.repo
[nvidia-docker]
name=nvidia-docker
baseurl=https://nvidia.github.io/nvidia-docker/centos7/ppc64le
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://nvidia.github.io/nvidia-docker/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

[root@ac922 ~]# yum list | grep nvidia-docker
Repository 'local' is missing name in configuration, using id
nvidia-docker.ppc64le                     1.0.1-1                  @nvidia-docker



2. Ubuntu 환경의 경우

u0017649@sys-91795:~$ cat /etc/apt/sources.list.d/docker.list
deb http://ftp.unicamp.br/pub/ppc64el/ubuntu/16_04/docker-17.06.1-ce-ppc64el xenial Release

u0017649@sys-91436:~$ cat /etc/apt/sources.list.d/nvidia-docker.list
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/ppc64el /

u0017649@sys-91436:~$ sudo apt-get update

u0017649@sys-91436:~$ sudo apt-get install docker.io nvidia-docker

2018년 2월 19일 월요일

Deep Learning 하는 사람들은 얼마나 벌까 ?

최근 Deep Learning 등 AI 관련 전공하신 분들, 즉 컴공은 물론 평소 그렇게 잘 팔리는 학과는 아니었던 수학과 물리학 석박사들도 날개 돋친 듯 팔려나가신다고 들었습니다.

그러나, 잘 팔린다는 것과 월급 봉투가 두툼하다는 것이 꼭 100% 일치하는 이야기는 아닙니다.   과연 이렇게 Deep Learning 하시는 분들의 연봉은 대략 어떨까요 ?   국내 상황은 저도 잘 모르겠고, 해외 상황에 대해서는 (신뢰성 여부는 확실치 않지만) 아래 레딧 쓰레드가 하나 있습니다.

https://www.reddit.com/r/MachineLearning/comments/7yde11/d_salaries_for_ml/

위 쓰레드에서 '대체 이 바닥에서 얼마씩들 받아요?'라는 질문이 올라왔고, 거기에 댓글이 수백개 달렸습니다.  먼저 요약부터 하자면 아래와 같습니다.

- 생각보다는 그렇게까지 많진 않더라
- 그나마 미국이 좀 낫고, 유럽은 그냥 한국 수준 같고, 일본은 아주 영...

그 중 대표적인 답변들 몇 개 정리했습니다.


. 워싱턴 DC 지역의 연방 정부 연구소, 박사 졸업 후 5년 경력
135K  (1억4천만원),  보너스는 금전적으로는 없지만 복리후생이 좋고, 휴가도 많고, 원격지 근무도 많음.  박사 학위도 여기서 일하면서 땄음.

. 샌프란시스코의 핀테크 스타트업, 박사 학위
150K (1억6천만원),  RSU(일정 근무 이후 받을 수 있는 자사 주식) 75K (8천만원), 보너스는 25K ~ 125K (목표는 75K)

. 중간크기 미국 도시의 대기업, 석사 학위에 4년 경력
101K (1억1천만원), 복리후생 완벽

. 뉴욕 대형기술기업, 박사 학위 취득 직후임
140K (1억5천만원), RSU(4년 후 240K), 보너스는 기본급의 10%, 입사 계약시 100K 받았음
--> 여기에는 '페이스북인 모양이군' '아마 구글일거야, 하지만 걔들도 사이닝 보너스를 저렇게 많이 주진 않는데' 등의 댓글이 달렸습니다.

. 버지니아 리치몬드에서 초급 Data Scientist, 재무 쪽 석사 이후 머신러닝으로 컴공쪽 석사 또 했음 + SW 개발자로 1.5년 경력
75K (8천만원), 보너스 5~10%, 옵션 없음.  한 절반은 재택근무(WFH : Work From Home)하는데 아주 좋아


석박사님들만 있는 것은 아닙니다.  아래와 같은 댓글도 달렸습니다.

. 박사학위 같은 거 없고 독학해서 배웠는데, 23년 사이버 보안 관련 경력이 있어.  180K (1억9천)에 퇴직연금/휴가 등의 복리후생으로 40K를 더 받아.

. 워싱턴 DC 지역, Data Scientist/Engineer, 통계 쪽으로 Top 10 대학에서 학부 졸업 + 2년 경력
88K (9천만원), 옵션으로는 10% 퇴직금(401K) 적립과 점심때 맥주 + 보드 게임 정도야.  절반은 재택근무해.
지금 초급 수준의 신경망 일 하고 있는데 내가 많이 받는건지 적게 받는건지 감이 안 잡혀.
--> 여기에는 "그럼 넌 니 생각보단 많이 받는 거야" 라는 댓글이 달렸습니다.


미국 말고 다른 나라는 어떨까요 ?

. 이스라엘 네타냐의 작은 기계학습 스타트업 (40인 수준), 석사 후 2년 경력
95K (1억원), 괜찮은 조건의 스톡옵션 있음.  기타 복리후생 (음식, 자동차 연료비 등) 좋음

. 캐나다 Data Scientist, 석사 후 1년 경력
60K CAD (5천만원), 스톡옵션 따위 없음.  보너스는 1K 미만

. 일본 대학, 석사 후 5년 경력
30K (3천2백만원), 건강보험 (어차피 일본에선 강제규정임), 근무시간 자유로운 편
--> 여기에는 "나도 일본에서 일하는데, 이유는 모르겠지만 이 나라는 정말 급여가 짜.  그런데도 생활비는 너무 비싸.  삶은 건강하긴 해"라는 댓글이 붙었습니다.   일본이 호황이고 실업률도 낮긴 하지만 급여가 오르지 않아서 골치라는 뉴스들 보셨을 겁니다.

. 호주 브리스베인, Data Scientist, IT와 물리학으로 2개 학위 있음, SW 개발자로 10년 이상의 경력
60K (6천4백만원), 보너스 없음, 대부분 재택근무함.

. 독일, Data Scientist & 전략 컨설팅, 공학 석사
65K 유로 (8천6백만원), 보너스 8%, 교통수당 12K, 휴가 25일

. 프랑스 파리, Data Scientist & Big Data Engineer, 석사 학위 후 막 취업한 상태
43K 유로 (5천7백만원), 보너스 3K유로, 휴가 5주 + 4일 더, 무제한의 과일과 커피, 프랑스 의료보험 (모든게 무료)
--> 여기에는 "파리는 생활비가 너무 비싸, 난 바르셀로나에서 그것과 비슷하게 받는데, 여긴 물가가 더 싸"라는 댓글이 달렸습니다.


한가지 놀란 점 - 영국도 한국 못지 않게 박사과정 학생들이 이래저래 매우 고된 착취의 삶을 사는 모양입니다.  덴마크나 독일은 좀 낫답니다.

. 영국, 대학, 아직 박사 과정 중
16K (1천7백만원), 옵션 따위 없음, 보너스는 세미나에서 먹을 수 있는 샌드위치와 음료수
--> 여기에는 "우울증은 덤"  "이게 재미있는 것 같지는 않아, 하지만 많은 이들의 현실이야"  "알아, 사실인 걸 아니까 웃는 거야"  "미국으로 건너와 !  여긴 샌드위치 말고 피자를 준다구" 등의 댓글이 달렸습니다.

. 영국, 대학, 아직 박사 과정 중
15K (1천6백만원), 옵션 따위 없음, 보너스로는 '컨설팅 부업 같은 걸 해보지 그래'라는 권유를 많이 받음, 그러나 이 노비생활(servitude)을 확실히 하게 만들려고 학위 과정 중에 부업을 못하게 되어있음,

. 덴마크, 대학, 아직 박사 과정 중
69K (7천3백만원), 퇴직연금 적립액이 포함된 금액임
--> 여기엔 "야, 이건 불공평해"라는 댓글이 달렸습니다.

. 독일 대학, 아직 박사 과정 중
46K ~ 54K 유로 (6천 ~ 7천만원), 연차별로 오름.
--> 여기엔 "뭐??? 박사 과정 학생에게 50K나 준다고 ?  여기 있는 독일 학생에게 대체 여기에 왜 있느냐고 물어 봐야겠네" 라는 댓글이 달렸습니다.

2018년 2월 13일 화요일

IBM Java의 source code 수정없는 GPU 가속 기능

아래 Redbook의 "8.4.5 CUDA and IBM Java"라는 항목을 보면 IBM JDK에서는 "-Dcom.ibm.gpu.enable" 옵션을 제공하는 것으로 나옵니다.  이를 이용하면 GPU로 source code 변환없이도 java application을 쉽게 가속할 수 있습니다.

https://www.redbooks.ibm.com/redbooks/pdfs/sg248263.pdf

아래의 BuiltInSort.java은 위 redbook에 나오는 sample code입니다.  보시다시피 특별히 CUDA를 이용하는 구간은 없습니다.

root@45e1670c8bc9:/java# cat BuiltInSort.java
import java.util.Arrays;
import java.util.Random;
public class BuiltInSort {
public static void main(String[] args) {
int N = 128*512*256;
//int N = 128*1024*1024;  --> 원래의 N size는 이것인데, 이를 위줄 같이 줄이지 않으면 invalid argument error가 나더군요.
int[] toSort = new int[N];
Random rnd = new Random();
for (int i = 0; i < N; ++i) {
toSort[i] = rnd.nextInt();
}
long startTime = System.nanoTime();
Arrays.sort(toSort);
long estimatedTime = System.nanoTime() - startTime;
System.out.println("CPU\t" + N + '\t' + estimatedTime * 1e-9 + " seconds");
}
}

설치된 java 환경은 다음과 같은 IBM Java입니다.

root@45e1670c8bc9:/java# which java
/opt/ibm/java-ppc64le-80/bin/java

root@45e1670c8bc9:/java# java -fullversion
java full version JRE 1.8.0 IBM Linux build 8.0.5.7 - pxl6480sr5fp7-20171216_01(SR5 FP7)

IBM javac를 이용하여 위 code를 아래와 같이 compile 합니다.

root@45e1670c8bc9:/java# javac BuiltInSort.java

그리고 이제 수행합니다.  여기서는 그냥 평범하게 수행합니다.

root@45e1670c8bc9:/java# time java -Xmx12g BuiltInSort
CPU     16777216        2.6369640330000004 seconds

real    0m3.649s
user    0m5.066s
sys     0m0.101s

이번에는 GPU를 이용하도록 '-Dcom.ibm.gpu.enable=sort'라는 옵션을 주어 수행합니다.

root@45e1670c8bc9:/java# time java -Xmx12g -Dcom.ibm.gpu.verbose -Dcom.ibm.gpu.enable=sort BuiltInSort
[IBM GPU]: [time.ms=1518500997649]: Discovered 4 device(s)
[IBM GPU]: [time.ms=1518500997655]: Acquired device: 0
[IBM GPU]: [time.ms=1518500997656]: Using device: 0 to sort int array; elements 0 to 16777216
[IBM GPU]: [time.ms=1518500998115]: Sorted ints on device 0 successfully
[IBM GPU]: [time.ms=1518500998116]: Released device: 0
CPU     16777216        0.5533952480000001 seconds

real    0m1.587s
user    0m1.311s
sys     0m0.475s

보시다시피 빠르며, 특히 compute 구간만 측정하면 5배 정도로 매우 빠릅니다.  이때 nvidia-smi에서도 java가 GPU를 사용하는 모습이 관측됩니다.

다만, 이를 다른 heavy compute 용도에 사용할 수 없을까 다른 sample을 몇개 돌려보니, GPU를 사용하지 않습니다.  이는 그 정도의 연산은 JVM이 GPU를 이용하는 것이 더 이익이냐 아니냐 판단 기준이 되는 threshold를 못 넘기 때문에 GPU를 안 쓰는 것으로 판단됩니다.

위에 언급한 IBM Redbook site의 문서를 보면 IBM JVM이 GPU를 이용하는데는 다음과 같이 세가지 방법이 있습니다.  그런데, 2번째와 3번째 방법도 사실상 java sort() 에 대한 것 외에는 따로 usage가 없는 것으로 보입니다.

1) Let the Java virtual machine (JVM) decide when to offload processing to a GPU.
2) Use the com.ibm.gpu classes to offload specific tasks.
3) Use the CUDA4J API to specify in the application exactly when to use the GPU.

However, to benefit from this type of processing, the array must be of a sufficient size. This size is required to justify the time of data movement between the CPU and
the GPU.  JVM, which is shipped with IBM SDK, Java Technology Edition, is able to automatically offload certain Java functions. This offload happens when the JVM expects that the speed of data processing at the GPU outweighs the cost of data movement from main memory to the GPU.

특히 아래의 문서를 보면,  -Dcom.ibm.gpu.enable=[]에서 []에 들어갈 keyword는 sort와 all 두가지 밖에 없습니다.  그리고 all로 수행하면 뭐 딱히 잘 먹히는 경우를 아직 저는 못 찾았습니다.

https://www.ibm.com/support/knowledgecenter/SSYKE2_7.1.0/com.ibm.java.lnx.71.doc/diag/appendixes/cmdline/Dcomibmgpuenable.html

-Dcom.ibm.gpu.enable=[all|sort]
Where:
all      Turns on GPU processing for all possible Java functions.
sort    Turns on GPU processing only for the Java sort() function.

결론적으로, 아직 sort 외의 use case에는 제한이 있긴 합니다만, 그래도 IBM JDK에서는 source code 변경 없이도 일부 code의 GPU 가속이 가능합니다.

2018년 2월 6일 화요일

Minsky 등 Linux on POWER 서버에서의 nmon을 이용한 자원 모니터링

nmon은 실시간 모니터링은 물론, CSV 포맷의 log를 남겨 장단시간에 걸친 사용률 추이를 볼 수 있는 유용한 freeware입니다.  원래 AIX용으로 개발되었으나, 지금은 Linux on POWER는 물론 Linux on x86도 지원됩니다.

nmon binary는 아래 site에서 download 받으실 수 있습니다.

http://nmon.sourceforge.net/pmwiki.php?n=Site.Download

위 site에서, IBM Minsky 또는 AC922인 경우는 nmon16g_power.tar.gz를 download 받으시면 됩니다.  이 속에는 Ubuntu와 SuSE, Redhat을 위해 compile된 binary들이 각각 들어있습니다.

nmon16g_power_ubuntu1604
nmon16g_power_sles122
nmon16f_power_rhel73LE

윗 파일을 PC에서 download 받아 Minsky 또는 AC922 서버에 upload하거나, 만약 서버가 internet에 연결되어 있다면 다음과 같이 직접 download 받으시면 됩니다.

u0017649@sys-91436:~$ wget http://sourceforge.net/projects/nmon/files/nmon16g_power.tar.gz

이 중에서 원하는 파일을 풀어냅니다.  가령 Minsky인 경우 Ubuntu일테니 다음과 같이 Ubuntu용 binary만 골라 풀어냅니다.

u0017649@sys-91436:~$ tar -zxvf nmon16g_power.tar.gz nmon16g_power_ubuntu1604
nmon16g_power_ubuntu1604

이제 이 파일에 실행 permission을 준 뒤, /usr/bin/nmon으로 copy를 하시면 됩니다.  꼭 /usr/bin 밑이 아니어도 상관없습니다.

u0017649@sys-91436:~$ chmod a+x nmon16g_power_ubuntu1604
u0017649@sys-91436:~$ sudo cp nmon16g_power_ubuntu1604 /usr/bin/nmon

실시간 모니터링을 위한 실행은 그냥 nmon이라고 치시면 됩니다.  이어서 키워드 문자를 입력하여 보고 싶은 패널을 보면 되는데, 기본적으로는 l (long term usage)와 t (top process), m (memory)과 d (disk) 등을 많이 사용합니다.   c (CPU usage)를 치면 SMT의 많은 logical HW thread가 다 display되므로 c는 잘 안 씁니다.




일정한 시간에 걸친 시스템 자원 사용률 모니터링을 위해 nmon을 사용하려면 다음과 같이 합니다.

u0017649@sys-91436:~$ nmon -f -s 120 -c 720 -m /tmp/nmon

위에서 -f는 csv의 spreadsheet 형태로 log를 받으라는 뜻이고, -s는 초 단위 간격, 그리고 -c는 그 간격으로 몇 번 받으라는 count입니다.  즉, 2분 단위로 720번, 즉 24시간을 받게 됩니다.  -m은 log를 떨어뜨릴 directory를 지정하는 옵션입니다.

여기서는 아래와 같이 떨군 경우의 log를 보겠습니다.
u0017649@sys-91436:~$ nmon -f -s 2 -c 720 -m /tmp/nmon

u0017649@sys-91436:~$ ls -l /tmp/nmon
-rw-rw-r-- 1 u0017649 u0017649  87917 Feb  5 20:45 sys-91436_180205_2042.nmon

이것을 PC로 download 받으신 뒤, 아래 site에서 nmon analyzer를 PC에 download 받으십시요.

https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+Systems/page/nmon_analyser

이 nmon analyzer는 Excel macro입니다.  이걸 열어보면 아래와 같이 버튼이 보이는데, 이걸 클릭한 뒤 아까 download 받은 *.nmon 파일을 선택하면 됩니다.  그러면 자동으로 로그를 분석하여 각종 그래프가 그려진 *.xls를 만들어 줍니다.





CPU나 disk는 직관적으로 보실 수 있습니다만, memory는 거의 언제나 free memory가 부족한 상태로 보일 겁니다.  이는 다른 OS들과 마찬가지로 Linux도 남는 free memory를 항상 file cache로 사용하기 때문입니다.  그러니 저 뒤쪽의 'VM' tab에 있는 'Swap space activity'가 0으로 유지된다면 memory 문제는 없다고 생각하셔도 됩니다.





단, 아직까지는 nmon에서 GPU에 대한 모니터링을 정식으로 지원하지는 않습니다.   일부 버전에서는 nvidia-smi에서 가져오는 정보를 이용하여 GPU usage를 display 해주기도 하는데 (a 옵션), 위와 같이 log를 받는 옵션은 없고, 또 nvidia-smi에서 보여주는 정보와 좀 다른 수치를 보여주는 등 아직 문제가 좀 있습니다.   현재 최신 nmon 버전에서는 이 GPU 모니터링 옵션은 빠져 있습니다.  GPU 자원에 대한 모니터링은 아직까지는 nvidia-smi를 이용하셔야 합니다.