2017년 3월 19일 일요일

Ubuntu 16.04 ppc64le에서, source로부터 Caffe를 build하는 방법


지난 편의 tensorflow 경우처럼, PowerAI 속에 caffe도 들어 있긴 합니다만, 간혹 customizing 때문에 source에서 build할 필요도 있을 수 있습니다.   여기서는 CUDA 8.0과 PowerAI가 이미 다 설치된 상태에서, caffe build를 시작하는 것으로 하겠습니다.  먼저, 기반 OS package를 설치합니다.

test@k8002:~$ sudo apt-get install libopencv-core-dev libopencv-dev libgflags-dev libgoogle-glog-dev libhdf5-dev libleveldb-dev liblmdb-dev libsnappy-dev libboost-python1.58-dev

이어서 github에서 caffe source를 복제합니다.

test@k8002:~$ git clone https://github.com/BVLC/caffe.git
Cloning into 'caffe'...
remote: Counting objects: 37621, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 37621 (delta 11), reused 6 (delta 6), pack-reused 37601
Receiving objects: 100% (37621/37621), 47.93 MiB | 5.27 MiB/s, done.
Resolving deltas: 100% (25123/25123), done.
Checking connectivity... done.

test@k8002:~$ cd caffe

test@k8002:~/caffe$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/device-abstraction
  remotes/origin/gh-pages
  remotes/origin/master
  remotes/origin/opencl
  remotes/origin/parallel
  remotes/origin/tutorial
  remotes/origin/williford-patch-1
  remotes/origin/windows

Caffe는 tensorflow와는 달리 1.0.0-rc5 버전을 최근 계속 유지하고 있습니다.  따라서 git checkout은 하지 않고 그대로 master 버전을 사용합니다.  make를 수행하기 전에, 먼저 Makefile.config.example을 편집하여 Makefile.config를 다음과 같이 일부 수정하여 만듭니다.  openblas는 PowerAI에 포함된 것을 사용하고, 그 이외의 것은 Ubuntu OS에 포함된 package를 사용합니다.

test@k8002:~/caffe$ cp Makefile.config.example Makefile.config

test@k8002:~/caffe$ vi Makefile.config
...
USE_CUDNN := 1   (원래 #으로 comment-out 되어 있는 것을 풀어줍니다.)
...
BLAS := open
#BLAS := atlas
...
BLAS_INCLUDE := /opt/DL/openblas/include
# BLAS_INCLUDE := /path/to/your/blas
BLAS_LIB := /opt/DL/openblas/lib
# BLAS_LIB := /path/to/your/blas
...
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/powerpc64le-linux-gnu/hdf5/serial


다음과 같이 make all을 수행하면 .build_release/tools directory 밑에 caffe가 빌드됩니다.

test@k8002:~/caffe$ make all

이와는 별도로, 다른 POWER8 서버로 배포 가능한 binary를 만드려면 다음과 같이 하면 됩니다.   빌드가 끝나면 distribute 밑에 bin과 include, lib 등의 필요 binary 파일들이 생성되므로, 이것을 tar 등으로 말아서 다른 서버로 가져가면 됩니다.

test@k8002:~/caffe$ make distribute

test@k8002:~/caffe$ ls distribute/
bin  include  lib  proto  python

test@k8002:~/caffe$ ls distribute/bin
caffe.bin               convert_mnist_siamese_data.bin  train_net.bin
classification.bin      device_query.bin                upgrade_net_proto_binary.bin
compute_image_mean.bin  extract_features.bin            upgrade_net_proto_text.bin
convert_cifar_data.bin  finetune_net.bin                upgrade_solver_proto_text.bin
convert_imageset.bin    net_speed_benchmark.bin
convert_mnist_data.bin  test_net.bin

test@k8002:~/caffe$ ls distribute/python
caffe  classify.py  CMakeLists.txt  detect.py  draw_net.py  requirements.txt  train.py

이렇게 생성된 caffe binary를 수행하려면 다음과 같이 openblas의 library path를 지정해주시고 사용하시면 됩니다.


test@k8002:~/caffe$ export LD_LIBRARY_PATH=/opt/DL/openblas/lib:$LD_LIBRARY_PATH

test@k8002:~/caffe$ .build_release/tools/caffe --version
caffe version 1.0.0-rc5




2017년 3월 16일 목요일

Ubuntu 16.04 ppc64le에서, source로부터 tensorflow를 build하는 방법

PowerAI 속에 tensorflow가 들어 있긴 합니다만, 간혹 customizing 때문에 source에서 build할 필요도 있을 수 있습니다.   여기서는 CUDA 8.0과 PowerAI가 이미 다 설치된 상태에서, build를 시작하는 것으로 하겠습니다.  먼저, 기반 OS package를 설치합니다.

test@k8002:~$ sudo apt-get install make automake autoconf gfortran-4.8-multilib-powerpc-linux-gnu libgfortran-4.8-dev-powerpc-cross gfortran libgfortran-4.8-dev gcc-powerpc-linux-gnu g++ pkg-config cmake-curses-gui zlib1g-dev zip unzip libtool openjdk-8-jdk python python-all-dev swig python-numpy g++-4.8 g++-4.8-multilib-powerpc-linux-gnu zlibc re2c libre2-dev libcupti-dev

Tensorflow를 github에서 download 받습니다.

test@k8002:~$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow

이제 tensorflow에 어떤 버전의 branch들이 있는지 확인합니다.

test@k8002:~$ cd tensorflow
test@k8002:~/tensorflow$ git branch -a
* master
  remotes/origin/0.6.0
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/r0.10
  remotes/origin/r0.11
  remotes/origin/r0.12
  remotes/origin/r0.7
  remotes/origin/r0.8
  remotes/origin/r0.9
  remotes/origin/r1.0

이중에서 일단은 master 버전을 build해보겠습니다.

test@k8002:~/tensorflow$ git checkout master
Already on 'master'
Your branch is up-to-date with 'origin/master'.

여기서 일단 환경 변수 확인을 해보겠습니다.

test@k8002:~/tensorflow$ env | grep PATH
LD_LIBRARY_PATH=/usr/local/cuDNN:/usr/local/cuda-8.0/lib64
PATH=/home/test/bin:/home/test/.local/bin:/usr/local/cuda-8.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Github에서 download 받은 tensorflow를 build할 때도, PowerAI에 포함된 bazel을 사용하면 편리합니다.  그를 위해, 현재의 PATH 환경변수들을 PowerAI 기준으로 고쳐줘야 하는데, 그를 위해서는 아래와 같이 PowerAI에 포함된 script 하나만 수행해주면 됩니다.

test@k8002:~/tensorflow$ source /opt/DL/tensorflow/bin/tensorflow-activate

이제 아래와 같이 PATH에 /opt/DL/tensorflow/bin가 추가되고, PYTHONPATH가 추가된 것을 보실 수 있습니다.

test@k8002:~/tensorflow$ env | grep PATH
LD_LIBRARY_PATH=/usr/local/cuDNN:/usr/local/cuda-8.0/lib64
PATH=/home/test/bin:/home/test/.local/bin:/usr/local/cuda-8.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/DL/tensorflow/bin
PYTHONPATH=/opt/DL/tensorflow/lib/python2.7/site-packages

여기에 추가로 bazel의 PATH도 잡아줘야 합니다.  Tensorflow의 build를 위해서는 먼저 bazel을 build해야 하는데, 사실 그것이 tensorflow build보다 더 힘듭니다.  여기서는 PowerAI에 포함된 bazel을 간편하게 사용하겠습니다.

test@k8002:~/tensorflow$ export PATH=/opt/DL/bazel/bin:$PATH

이제 configure부터 시작하여 build에 들어갑니다.

test@k8002:~/tensorflow$ ./configure
Please specify the location of python. [Default is /usr/bin/python]:
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
Do you wish to use jemalloc as the malloc implementation? [Y/n]
jemalloc enabled
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N]
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N]
No XLA support will be enabled for TensorFlow
Found possible Python library paths:
  /opt/DL/tensorflow/lib/python2.7/site-packages
  /usr/local/lib/python2.7/dist-packages
  /usr/lib/python2.7/dist-packages
Please input the desired Python library path to use.  Default is [/opt/DL/tensorflow/lib/python2.7/site-packages]
/usr/lib/python2.7/dist-packages

Do you wish to build TensorFlow with OpenCL support? [y/N]
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N] y
CUDA support will be enabled for TensorFlow
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]:
Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0
Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda-8.0
Please specify the Cudnn version you want to use. [Leave empty to use system default]: 5
Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda-8.0]: /usr/lib/powerpc64le-linux-gnu  
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
[Default is: "3.5,5.2"]: 6.0    (--> P100은 6.0, K80의 경우 3.7)
Extracting Bazel installation...
.............
INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes.
............
WARNING: /home/test/.cache/bazel/_bazel_test/3a51eda24c560ebddf29b66b8fa0460e/external/protobuf/protobuf.bzl:90:19: Variables HOST_CFG and DATA_CFG are deprecated in favor of strings "host" and "data" correspondingly.
WARNING: /home/test/.cache/bazel/_bazel_test/3a51eda24c560ebddf29b66b8fa0460e/external/protobuf/protobuf.bzl:96:28: Variables HOST_CFG and DATA_CFG are deprecated in favor of strings "host" and "data" correspondingly.
INFO: Downloading http://pilotfiber.dl.sourceforge.net/project/boost/boost/1.6\
1.0/boost_1_61_0.tar.gz: 104,733,800 bytes
...
INFO: All external dependencies fetched successfully.
Configuration finished

configure가 끝나면 이제 bazel build를 합니다.

test@k8002:~/tensorflow$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
...
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
  bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 256.806s, Critical Path: 203.45s

윗 단계가 성공적으로 끝나면 다음과 같이 /tmp/tensorflow_pkg directory에 pip package를 build합니다.

test@k8002:~/tensorflow$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Thu Mar 16 15:03:32 KST 2017 : === Using tmpdir: /tmp/tmp.LCBvnwu8ZZ
~/tensorflow/bazel-bin/tensorflow/tools/pip_package/build_pip_package.runfiles ~/tensorflow
~/tensorflow
/tmp/tmp.LCBvnwu8ZZ ~/tensorflow
Thu Mar 16 15:03:33 KST 2017 : === Building wheel
warning: no files found matching '*.dll' under directory '*'
warning: no files found matching '*.lib' under directory '*'
~/tensorflow
Thu Mar 16 15:03:44 KST 2017 : === Output wheel file is in: /tmp/tensorflow_pkg

이제 /tmp/tensorflow_pkg directory에 생성된 wheel file을 이용하여 pip install을 하면 tensorflow 설치가 완료됩니다.

test@k8002:~/tensorflow$ sudo pip install /tmp/tensorflow_pkg/tensorflow-1.0.1-cp27-cp27mu-linux_ppc64le.whl
...
  Downloading funcsigs-1.0.2-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): pbr>=0.11 in /usr/lib/python2.7/dist-packages (from mock>=2.0.0->tensorflow==1.0.1)
Installing collected packages: werkzeug, protobuf, funcsigs, mock, tensorflow
  Found existing installation: protobuf 2.6.1
    Not uninstalling protobuf at /usr/lib/python2.7/dist-packages, outside environment /usr
  Found existing installation: funcsigs 0.4
    Not uninstalling funcsigs at /usr/lib/python2.7/dist-packages, outside environment /usr
  Found existing installation: mock 1.3.0
    Not uninstalling mock at /usr/lib/python2.7/dist-packages, outside environment /usr
Successfully installed funcsigs-1.0.2 mock-2.0.0 protobuf-3.2.0 tensorflow-1.0.1 werkzeug-0.12.1
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

이제 tensorflow의 버전을 확인해보겠습니다.

test@k8002:~/tensorflow$ pip show tensorflow
---
Metadata-Version: 2.0
Name: tensorflow
Version: 0.12.0
Summary: TensorFlow helps the tensors flow
Home-page: http://tensorflow.org/
Author: Google Inc.
Author-email: opensource@google.com
Installer: pip
License: Apache 2.0
Location: /opt/DL/tensorflow/lib/python2.7/site-packages
Requires: numpy, mock, six, protobuf, wheel
Classifiers:
  Development Status :: 4 - Beta
  Intended Audience :: Developers
  Intended Audience :: Education
  Intended Audience :: Science/Research
  License :: OSI Approved :: Apache Software License
  Programming Language :: Python :: 2.7
  Topic :: Scientific/Engineering :: Mathematics
  Topic :: Software Development :: Libraries :: Python Modules
  Topic :: Software Development :: Libraries
Entry-points:
  [console_scripts]
  tensorboard = tensorflow.tensorboard.tensorboard:main
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.


위와 같이 version이 방금 설치한 v1.0이 아니라 v0.12로 나오는 것은 환경변수 PYTHONPATH가 아직 /opt/DL/tensorflow/lib/python2.7/site-packages으로 잡혀 있기 때문에, 이전에 PowerAI 설치 때 함께 설치된 tensorflow 0.12가 보이는 것입니다.  이를 configure할 때 주었던 값인 /usr/local/lib/python2.7/dist-packages으로 바꾼 뒤 다시 해보겠습니다.


test@k8002:~/tensorflow$ export PYTHONPATH=/usr/local/lib/python2.7/dist-packages:$PYTHONPATH

test@k8002:~/tensorflow$ pip show tensorflow
---
Metadata-Version: 2.0
Name: tensorflow
Version: 1.0.1
Summary: TensorFlow helps the tensors flow
Home-page: http://tensorflow.org/
Author: Google Inc.
Author-email: opensource@google.com
Installer: pip
License: Apache 2.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: werkzeug, six, protobuf, wheel, numpy, mock
Classifiers:
  Development Status :: 4 - Beta
  Intended Audience :: Developers
  Intended Audience :: Education
  Intended Audience :: Science/Research
  License :: OSI Approved :: Apache Software License
  Programming Language :: Python :: 2.7
  Topic :: Scientific/Engineering :: Mathematics
  Topic :: Software Development :: Libraries :: Python Modules
  Topic :: Software Development :: Libraries
Entry-points:
  [console_scripts]
  tensorboard = tensorflow.tensorboard.tensorboard:main
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

위와 같이 v1.0.1로 제대로 보이는 것을 보실 수 있습니다.

이번에는 r0.12를 build해보겠습니다.

test@k8002:~/tensorflow$ git checkout r0.12
Switched to branch 'r0.12'
Your branch is up-to-date with 'origin/r0.12'.

동일하게, configure부터 시작하여 build에 들어갑니다.

test@k8002:~/tensorflow$ ./configure
~/tensorflow ~/tensorflow
Please specify the location of python. [Default is /usr/bin/python]:
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N]
No Hadoop File System support will be enabled for TensorFlow
Found possible Python library paths:
  /usr/local/lib/python2.7/dist-packages
  /usr/lib/python2.7/dist-packages
Please input the desired Python library path to use.  Default is [/usr/local/lib/python2.7/dist-packages]
/usr/lib/python2.7/dist-packages
Do you wish to build TensorFlow with OpenCL support? [y/N]
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with GPU support? [y/N] y
GPU support will be enabled for TensorFlow
Please specify which gcc should be used by nvcc as the host compiler. [Default is /usr/bin/gcc]:
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0
Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]: /usr/local/cuda-8.0
Please specify the Cudnn version you want to use. [Leave empty to use system default]: 5
Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda-8.0]: /usr/lib/powerpc64le-linux-gnu
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.
[Default is: "3.5,5.2"]: 6.0    (--> P100은 6.0, K80의 경우 3.7)
............
INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes.
............
INFO: All external dependencies fetched successfully.
Configuration finished



test@k8002:~/tensorflow$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
...                                                                                                                                          ^
At global scope:
cc1plus: warning: unrecognized command line option '-Wno-self-assign'
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
  bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 306.555s, Critical Path: 273.68s



test@k8002:~/tensorflow$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Fri Mar 17 16:16:24 KST 2017 : === Using tmpdir: /tmp/tmp.L1dwTgVhwv
~/tensorflow/bazel-bin/tensorflow/tools/pip_package/build_pip_package.runfiles ~/tensorflow
~/tensorflow
/tmp/tmp.L1dwTgVhwv ~/tensorflow
Fri Mar 17 16:16:25 KST 2017 : === Building wheel
~/tensorflow
Fri Mar 17 16:16:41 KST 2017 : === Output wheel file is in: /tmp/tensorflow_pkg


이제 /tmp/tensorflow_pkg를 보시면 아까 build했던 1.0.1 버전의 wheel file과 함께 새로 0.12 버전의 wheel file이 만들어진 것을 보실 수 있습니다.

test@k8002:~/tensorflow$ ls -l /tmp/tensorflow_pkg/
total 109520
-rw-rw-r-- 1 test test 61576804 Mar 17 16:16 tensorflow-0.12.1-cp27-cp27mu-linux_ppc64le.whl
-rw-rw-r-- 1 test test 50565190 Mar 16 15:03 tensorflow-1.0.1-cp27-cp27mu-linux_ppc64le.whl

그것을 pip install 명령으로 설치합니다.   아래와 같이, 기존의 tensorflow-1.0.1을 uninstall하면서 0.12가 설치됩니다.

test@k8002:~/tensorflow$ sudo pip install /tmp/tensorflow_pkg/tensorflow-0.12.1-cp27-cp27mu-linux_ppc64le.whl
The directory '/home/test/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/test/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Processing /tmp/tensorflow_pkg/tensorflow-0.12.1-cp27-cp27mu-linux_ppc64le.whl
Requirement already satisfied (use --upgrade to upgrade): numpy>=1.11.0 in /home/test/.local/lib/python2.7/site-packages (from tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): wheel in /usr/lib/python2.7/dist-packages (from tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): mock>=2.0.0 in /usr/local/lib/python2.7/dist-packages (from tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): six>=1.10.0 in /home/test/.local/lib/python2.7/site-packages (from tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): protobuf>=3.1.0 in /usr/local/lib/python2.7/dist-packages (from tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): funcsigs>=1; python_version < "3.3" in /usr/local/lib/python2.7/dist-packages (from mock>=2.0.0->tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): pbr>=0.11 in /usr/lib/python2.7/dist-packages (from mock>=2.0.0->tensorflow==0.12.1)
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/lib/python2.7/dist-packages (from protobuf>=3.1.0->tensorflow==0.12.1)
Installing collected packages: tensorflow
  Found existing installation: tensorflow 1.0.1
    Uninstalling tensorflow-1.0.1:
      Successfully uninstalled tensorflow-1.0.1
Successfully installed tensorflow-0.12.1
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.


다음과 같이 tensorflow의 버전이 0.12.1로 변경된 것을 확인하실 수 있습니다.

test@k8002:~/tensorflow$ pip show tensorflow
---
Metadata-Version: 2.0
Name: tensorflow
Version: 0.12.1
Summary: TensorFlow helps the tensors flow
Home-page: http://tensorflow.org/
Author: Google Inc.
Author-email: opensource@google.com
Installer: pip
License: Apache 2.0
Location: /usr/local/lib/python2.7/dist-packages
Requires: numpy, wheel, mock, six, protobuf
Classifiers:
  Development Status :: 4 - Beta
  Intended Audience :: Developers
  Intended Audience :: Education
  Intended Audience :: Science/Research
  License :: OSI Approved :: Apache Software License
  Programming Language :: Python :: 2.7
  Topic :: Scientific/Engineering :: Mathematics
  Topic :: Software Development :: Libraries :: Python Modules
  Topic :: Software Development :: Libraries
Entry-points:
  [console_scripts]
  tensorboard = tensorflow.tensorboard.tensorboard:main
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

2017년 3월 6일 월요일

R Studio에서의 "Error in RStudioGD() Shadow graphics device error: r error 4"

전에 제가 올린 "Linux on POWER (ppc64le)에 R 서버 및 R-Studio 설치하기"라는 posting에 포함된 tgz 파일 속의 binary로 Rstudio를 수행할 때, R에서는 그래프가 그려져도 Rstudio에서는 그려지지 않는 경우가 있다고 합니다.  

이 경우, 다음과 같이 Rstudio에 DISPLAY 환경 변수를 설정하면 문제를 해결할 수 있습니다.

R_HOME (여기서는 /usr/local/lib/R) 밑의 etc/Renviron 이라는 파일 속에 환경 변수를 설정할 수 있습니다.  여기서는 일단 DISPLAY를 null 값으로 설정하겠습니다.

u0017496@sys-85972:/usr/local/lib/R/etc$ sudo vi Renviron
...
DISPLAY=""

그리고 나서 Rstudio server를 stop/start 시킵니다.

u0017496@sys-85972:/usr/local/lib/R/etc$ sudo systemctl stop rstudio-server

u0017496@sys-85972:/usr/local/lib/R/etc$ sudo systemctl start rstudio-server

이제 다음과 같이 Rstudio에 http://ip_address:8787로 접속하여 Sys.getenv("DISPLAY) 명령으로 확인한 뒤, capabilities() 명령을 내려보면 jpeg 및 png가 모두 FALSE로 설정되어 있는 것을 보실 수 있습니다.   이 상황에서는 plot 명령으로 그래프를 그려봐도 다음과 같은 error만 나옵니다.

> Sys.getenv("DISPLAY")
[1] ""
> capabilities()
       jpeg         png        tiff       tcltk         X11        aqua 
      FALSE       FALSE       FALSE       FALSE       FALSE       FALSE 
   http/ftp     sockets      libxml        fifo      cledit       iconv 
       TRUE        TRUE        TRUE        TRUE        TRUE        TRUE 
        NLS     profmem       cairo         ICU long.double     libcurl 
       TRUE       FALSE       FALSE        TRUE        TRUE        TRUE 
> plot(mtcars)
Error in RStudioGD() : 
  Shadow graphics device error: r error 4 (R code execution error)
In addition: Warning message:
In grDevices:::png("/tmp/RtmpYfCiVe/3183debe21b14a24a820a8ee6162a221.png",  :
  unable to open connection to X11 display ''



이제 etc/Renviron을 편집해서 다음과 같이 DISPLAY를 ":0"으로 바꾸겠습니다.

u0017496@sys-85972:/usr/local/lib/R/etc$ sudo vi Renviron
...

DISPLAY=":0"


그리고 나서 Rstudio server를 stop/start 시킵니다.

u0017496@sys-85972:/usr/local/lib/R/etc$ sudo systemctl stop rstudio-server

u0017496@sys-85972:/usr/local/lib/R/etc$ sudo systemctl start rstudio-server

이번에 접속해서 동일한 명령들을 내려보면, capabilities()에서 jpeg 및 png가 모두 TRUE로 설정되어 있는 것을 보실 수 있습니다.   이제 plot 명령으로 그래프를 그려보면 잘 나옵니다.

> Sys.getenv("DISPLAY")
[1] ":0"
> capabilities()
       jpeg         png        tiff       tcltk         X11        aqua 
       TRUE        TRUE       FALSE       FALSE        TRUE       FALSE 
   http/ftp     sockets      libxml        fifo      cledit       iconv 
       TRUE        TRUE        TRUE        TRUE        TRUE        TRUE 
        NLS     profmem       cairo         ICU long.double     libcurl 
       TRUE       FALSE       FALSE        TRUE        TRUE        TRUE 
> plot(mtcars)

더 간단하게는, Sys.setenv 명령으로 DISPLAY 변수를 설정해도 됩니다.

> Sys.setenv(DISPLAY="unix")
> x <- (1:10)
> y <- (11:20)
> plot(x,y,type='l')
Error in RStudioGD() : 
  Shadow graphics device error: r error 4 (R code execution error)
In addition: Warning message:
In grDevices:::png("/tmp/RtmpsGv8Ft/10d5f91915bc4744aa48a7fbd4806103.png",  :
  unable to open connection to X11 display ''
> Sys.setenv(DISPLAY=":0")
> plot(x,y,type='l')
>



2017년 3월 5일 일요일

ppc64le (POWER8) 기반의 Ubuntu에서 SW RAID 구성 및 복구하기

먼저, POWER8, 즉 ppc64le 아키텍처의 Ubuntu를 설치할 때, RAID adapter의 HW 기능이 아닌, Linux OS에서 지원하는 SW RAID를 이용하여 mirroring을 하면서 OS 설치하는 방법은 아래 URL을 참조하십시요.

https://wiki.kubuntu.org/ppc64el/SoftwareRAID

위 URL에서는 구성 및 설치 방법까지만 나옵니다.  특히, PReP 파티션, 즉 ppc64le의 bootloader용 파티션은 이렇게 SW RAID로는 설치가 안 된다는 이야기만 있을 뿐,  그래서 어떻게 하라는 말이 없습니다.

여기서는 이렇게 SW RAID로 Ubuntu OS 설치 후, PReP 파티션은 어떻게 보호할 것인가, 그리고 이렇게 mirroring된 HDD 2장 중 1장에 문제가 생겼을 경우 어떻게 복구하는지에 대해 간단히 정리했습니다.

요약하면 

1) PReP 파티션 부분은 OS 설치 이후, 그냥 dd 명령으로 /dev/sda1에서 /dev/sdb1으로 copy해주면 됩니다.   

2) Mirroring된 HDD 2장 중 1장에 문제가 생긴 경우, 복구는 madam 명령을 이용합니다.



먼저, 위 URL과 같이 OS를 SW RAID로 구성하여 설치를 끝내면 다음과 같이 disk가 2개 보입니다.  

/dev/sda1, sdb1  : PReP 파티션
/dev/sda2, sdb2  : 일반 Linux 파일시스템
/dev/sda3, sdb3  : Swap space용 파티션

이중 sda2와 sdb2는 뭉쳐져 md0 (mirror device 0)를 만들게 되고, sda3와 sdb3는 md1을 만들게 됩니다.


$ fdisk -l

Disk /dev/sda: 894.3 GiB, 960197124096 bytes, 1875385008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 2C810299-3222-421A-B19C-6FF8B8E8E181

Device          Start        End    Sectors   Size Type
/dev/sda1        2048      16383      14336     7M PowerPC PReP boot
/dev/sda2       16384 1799501823 1799485440 858.1G Linux RAID
/dev/sda3  1799501824 1875384319   75882496  36.2G Linux RAID


Disk /dev/sdb: 894.3 GiB, 960197124096 bytes, 1875385008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: E5BCD6F3-25B0-42B9-A0C3-87851E049FB8

Device          Start        End    Sectors   Size Type
/dev/sdb1        2048      16383      14336     7M Linux filesystem
/dev/sdb2       16384 1799501823 1799485440 858.1G Linux RAID
/dev/sdb3  1799501824 1875384319   75882496  36.2G Linux RAID


Disk /dev/md1: 36.2 GiB, 38818283520 bytes, 75816960 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/md0: 858 GiB, 921202327552 bytes, 1799223296 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


md1이 swap space인지는 swapon -s 명령으로 확인 가능합니다.


test@ubuntu:~$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/md1                                partition       37908416        0       -1


위에서 언급한 것처럼, PReP 파티션은 OS 설치시에 SWRAID로는 mirror 구성이 안 되므로, 아래와 같이 그냥 dd 명령으로 copy 해주면 됩니다.  이렇게 copy를 완료한 뒤, 실제로 /dev/sda를 뽑아 문제를 일으킨 뒤 일단 shutdown을 하고 나서, /dev/sdb만 가지고 booting을 해보면 booting도 잘 되는 것을 확인했습니다.


test@ubuntu:~$ sudo dd if=/dev/sda1 of=/dev/sdb1 bs=1024


이제 mirror device의 복구에 대해 보겠습니다.  먼저, 현재 상태가 어떤지 확인하는 방법은 아래와 같이 /proc/mdstat을 보는 것입니다.  아래는 mirror device가 정상적인 상태입니다.


test@ubuntu:~$ cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda2[0] sdb2[2]
      899611648 blocks super 1.2 [2/2] [UU]
      bitmap: 0/1 pages [0KB], 65536KB chunk

md1 : active raid1 sda3[3] sdb3[2]
      37908480 blocks super 1.2 [2/2] [UU]

unused devices: <none>


좀더 상세하게는, mdadm 명령을 써서 볼 수 있습니다.


test@ubuntu:~$ sudo mdadm --detail /dev/md0
[sudo] password for test:
/dev/md0:
        Version : 1.2
  Creation Time : Fri Dec  2 15:21:29 2016
     Raid Level : raid1
     Array Size : 899611648 (857.94 GiB 921.20 GB)
  Used Dev Size : 899611648 (857.94 GiB 921.20 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

  Intent Bitmap : Internal

    Update Time : Mon Dec  5 17:34:38 2016
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : ubuntu:0  (local to host ubuntu)
           UUID : 458b6f3e:8289b00c:a4e641ea:134631e7
         Events : 35835

    Number   Major   Minor   RaidDevice State
       0       8        2        0      active sync   /dev/sda2
       2       8       18        1      active sync   /dev/sdb2


test@ubuntu:~$ sudo mdadm --detail /dev/md1
/dev/md1:
        Version : 1.2
  Creation Time : Fri Dec  2 15:21:41 2016
     Raid Level : raid1
     Array Size : 37908480 (36.15 GiB 38.82 GB)
  Used Dev Size : 37908480 (36.15 GiB 38.82 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Mon Dec  5 16:36:22 2016
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : ubuntu:1  (local to host ubuntu)
           UUID : a6154655:667b3e4a:922a28a0:3fb5af6b
         Events : 87

    Number   Major   Minor   RaidDevice State
       3       8        3        0      active sync   /dev/sda3
       2       8       19        1      active sync   /dev/sdb3



/dev/sda를 뽑았다가 다시 꽂은 경우, "mdadm --manage  --remove" 명령으로 문제 있는 파티션을 제거한 뒤 다시 "mdadm --manage  --add" 명령으로 추가하면 됩니다.   아래는 /dev/sda를 뽑았던 경우입니다.   여기서 PReP 파티션인 /dev/sda1은 mirror device에는 참여할 수 없는 파티션이므로, mdadm 명령이 아니라 dd 명령으로 copy 해줘야 한다는 것을 잊지 마시기 바랍니다.

test@ubuntu:~$ sudo mdadm --manage /dev/md0 --remove /dev/sda2
test@ubuntu:~$ sudo mdadm --manage /dev/md1 --remove /dev/sda3

test@ubuntu:~$ sudo mdadm --manage /dev/md0 --add /dev/sda2
test@ubuntu:~$ sudo mdadm --manage /dev/md1 --add /dev/sda3

이렇게 --add 한 뒤 두 HDD 사이에 sync가 일어나게 됩니다.   /proc/mdstat을 보면 복구 작업이 몇 % 진행되었는지도 보실 수 있습니다.

2017년 2월 25일 토요일

T42 rack의 PDU 1개당 최대 kVA

한줄 요약 : PDU 1개는 한국 표준인 FC# 6658 (단상 3선식 powercord)을 사용할 경우 4.8kVA까지 지원하고, FC# 6653 (3상 4선식 powercord)을 사용하면 그 2배인 9.6kVA를 지원합니다.


1. 보통 rack의 PDU인 7188/9188은 원래 9.6kVA까지 사용 가능합니다.   같은 PDU에 대해 'PDU to Wall Powercord'는 여러가지를 사용할 수 있습니다.

2. 통상적으로는 E880/870이든 S824이건 다 6658 cable을 사용합니다.  이는 단상3선식 (그중 1선은 접지이므로, 정확한 표현은 단상2선식) cable이고, 이를 이용하면 4.8kVA, 즉 30Amp까지만 지원됩니다.

6658 PDU to Wall Powercord 14', 200-240V/24A, UTG0247, PT#KP
7188 Power Dist Unit-Side Mount, Universal UTG0247 Connector
9188 Power Distrib Unit Specify - Base/Side Mount, Universal UTG0247 Connector

3. 그러나 P100 GPU 4장을 장착한 Minsky 서버의 경우, 최대 2.55kW를 사용하므로, 이런 PDU를 rack에 4개만 장착하면 (전원 이중화를 고려하지 않더라도) rack 하나에 8대 정도를 최대 수용 가능합니다.

4. PDU 4개만 이용하여 Minsky 서버를 최대 16대까지 장착하려면 powercord로 FC# 6653을 선택하시면 됩니다.   이는 3상4선식 cable이고, 이를 이용하면 PDU 1개에서 9.6kVA, 즉 60Amp를 지원합니다.

5. 단, 대부분의 rack 전원은 단상3선식입니다.  따라서 FC# 6653를 선택할 경우, 미리 고객에게 이것이 3상4선식이므로 그에 맞춰 배전반으로부터 인입선을 준비해줄 것을 요청해 놓아야 합니다.


더 자세한 내용은 아래 link를 참조...

https://www.ibm.com/support/knowledgecenter/HW4L4/p8had/p8had_pduloadcalculator.htm

http://www.ibmsystemsmag.com/linuxonpower/tipstechniques/Systems-Management/pdu-rules/?page=1

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



2017년 2월 9일 목요일

Linux on POWER(ppc64le) 서버에 Spark 및 SparkR 설치하기

앞선 포스팅과 마찬가지로, Spark를 Ubuntu 16.04 LTS ppc64le 환경에서 build한 뒤, 동일한 OS의 다른 POWER 서버로 그 binary들을 가져가서 제대로 구동되는지 보겠습니다.

다음과 같이 필요한 기본 OS fileset을 설치합니다. 

u0017496@sys-85548:~/spark$ sudo apt install openjdk-8-jdk cmake automake autoconf texlive-latex-base maven

그리고, 먼저 R을 설치해야 합니다.  그에 대해서는 앞의 포스팅을 참조하십시요.  R 설치가 끝나면, 다음과 같이 SparkR build를 위한 R package들을 download 받습니다.  (앞선 포스팅에 올려진 R.tgz 속에는 이 R package들이 이미 포함되어 있으니, 그냥 그걸 쓰셔도 됩니다.)

u0017496@sys-85548:/usr/local/lib/R$ sudo R

> install.packages("knitr")
Installing package into '/usr/local/lib/R/site-library'

> install.packages("e1071")
Installing package into '/usr/local/lib/R/site-library'

> install.packages('survival')
Installing package into '/usr/local/lib/R/site-library'

> install.packages('rmarkdown')
Installing package into '/usr/local/lib/R/site-library'

> install.packages('testthat')
Installing package into '/usr/local/lib/R/site-library'

> install.packages("rJava")
Installing package into '/usr/local/lib/R/site-library'


u0017496@sys-85548:/usr/local/lib/R$ ls -l site-library/
total 120
drwxrwxr-x  7 root staff 4096 Feb  6 23:54 mime
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 stringi
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 magrittr
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 digest
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 highr
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 yaml
drwxrwxr-x 11 root staff 4096 Feb  6 23:56 markdown
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 stringr
drwxrwxr-x  6 root staff 4096 Feb  6 23:56 evaluate
drwxrwxr-x 14 root staff 4096 Feb  6 23:57 knitr
drwxrwxr-x 10 root staff 4096 Feb  7 02:12 MASS
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 class
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 e1071
drwxrwxr-x 10 root staff 4096 Feb  7 04:33 lattice
drwxrwxr-x 12 root staff 4096 Feb  7 04:34 Matrix
drwxrwxr-x  9 root staff 4096 Feb  7 04:35 survival
drwxrwxr-x 16 root staff 4096 Feb  7 04:37 Rcpp
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 bitops
drwxrwxr-x  6 root staff 4096 Feb  7 04:37 backports
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 base64enc
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 jsonlite
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 htmltools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 caTools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 rprojroot
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 rmarkdown
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 crayon
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 praise
drwxrwxr-x  7 root staff 4096 Feb  7 07:03 R6
drwxrwxr-x  9 root staff 4096 Feb  7 07:04 testthat
drwxrwxr-x 10 root staff 4096 Feb  7 21:19 rJava



그 다음에 spark build를 시작합니다.  

u0017496@sys-85548:~$ git clone https://github.com/apache/spark.git

u0017496@sys-85548:~$ cd spark

먼저 다음과 같이 JAVA_HOME을 선언해줍니다.

u0017496@sys-85548:~/spark$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el


Distribution을 위한 package를 만드려면 dev 밑에 있는 make-distribution.sh을 사용합니다.  먼저, MAKE_R이 default로는 false이므로, Spark에서 R과 함께 사용하려고 한다면 --r option을 쓰셔야 합니다.  그리고 미리 다음과 같이 tar directory 이름을 간단한 것으로 바꿔 둡니다.  


u0017496@sys-85548:~/spark$ vi dev/make-distribution.sh
...
  TARDIR_NAME=spark-bin
#  TARDIR_NAME=spark-$VERSION-bin-$NAME
...
  tar czf "spark-$VERSION-bin.tgz" -C "$SPARK_HOME" "$TARDIR_NAME"
#  tar czf "spark-$VERSION-bin-$NAME.tgz" -C "$SPARK_HOME" "$TARDIR_NAME"

...

그리고, hive와의 연동에 사용되는 zinc 서버의 실행 파일인 ng가 다음과 같이 x86용 binary로 들어있기 때문에 이대로 수행하면 error가 발생합니다.

root@sys-85548:/home/u0017496/spark# file ./build/zinc-0.3.11/bin/ng/linux32/ng
./build/zinc-0.3.11/bin/ng/linux64/ng: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=8946a7b64cafd2b99faac05b088b8943aa0ec2e6, stripped

이를 ppc64le용으로 새로 build해야 합니다.  그런데 그를 위해서는 또 sbt부터 설치해야 합니다. 이는 다음과 같이 하시면 됩니다.

u0017496@sys-85548:~$ wget https://dl.bintray.com/sbt/native-packages/sbt/0.13.13/sbt-0.13.13.tgz
u0017496@sys-85548:~$ tar -zxvf sbt-0.13.13.tgz
u0017496@sys-85548:~$ export PATH=$PATH:~/sbt-launcher-packaging-0.13.13/bin
u0017496@sys-85548:~$ which sbt
/home/u0017496/sbt-launcher-packaging-0.13.13/bin/sbt

이제 sbt가 사용 준비 되었습니다.  이제 zinc를 설치합니다.

u0017496@sys-85548:~$ git clone https://github.com/typesafehub/zinc.git
u0017496@sys-85548:~$ cd zinc/
u0017496@sys-85548:~/zinc$ sbt universal:packageZipTarball

이렇게 해서 build된 것 중 linux32 directory에 생성된 ng를 spark build directory의 ng에 overwrite합니다.

u0017496@sys-85548:~/zinc$ cp ./src/universal/bin/ng/linux32/ng ~/spark/build/zinc-0.3.11/bin/ng/linux32/ng

u0017496@sys-85548:~$ file ./spark/build/zinc-0.3.11/bin/ng/linux32/ng
/home/u0017496/spark/build/zinc-0.3.11/bin/ng/linux32/ng: ELF 64-bit LSB executable, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=142230d9ad8099f606dcf8144b308bc938915812, stripped

유의)  이대로 build를 수행하면 도중에 다음의 'Required file not found: scala-compiler-2.11.8.jar'라는 error가 날 수 있습니다.  실제로는 file이 있는데도요.  이는 다음과 같이 zinc 서버를 shutdown 하시면 해결됩니다.

u0017496@sys-85548:/home/u0017496/zinc# ./src/universal/bin/zinc -shutdown

이제 준비가 끝났습니다.  다음과 같이 dev/make-distribution.sh script를 수행하면 됩니다.  이 build 과정은 시간이 매우 오래 걸리는데, virtual CPU 2개짜리인 IBM Power Cloud에서는 무려 140분 정도 걸립니다.

u0017496@sys-85548:~/spark$ ./dev/make-distribution.sh --name spark-ppc64le --tgz -Psparkr  -Phive -Phive-thriftserver

build가 끝나면 다음과 같은 tgz file이 생깁니다.

u0017496@sys-85548:~/spark$ ls -l *.tgz
-rw-r--r--  1 root     root     177688849 Feb  9 10:12 spark-2.2.0-SNAPSHOT-bin.tgz

이를 먼저 /usr/local directory에 풀어준 뒤, 그 결과 생긴 spark-bin directory를 SPARK_HOME으로 export 하십시요.

u0017496@sys-85548:/usr/local$ sudo tar -zxvf ~/spark/spark-2.2.0-SNAPSHOT-bin.tgz

u0017496@sys-85548:/usr/local$ tail ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
export R_HOME=/usr/local/lib/R
export SPARK_HOME=/usr/local/spark-bin
export PATH=$SPARK_HOME/bin:$R_HOME/bin:$PATH

그리고, 원래의 spark directory 밑의 R directory에는 R을 위한 SparkR package가 다음과 같이 gz file로 생성되어 있습니다.

u0017496@sys-85548:~/spark$ ls R/*.gz
R/SparkR_2.2.0-SNAPSHOT.tar.gz

R에 이 SparkR package를 설치하겠습니다.

u0017496@sys-85548:/usr/local/spark-bin$ sudo R

> pkgPath <- '/home/u0017496/spark/R/SparkR_2.2.0-SNAPSHOT.tar.gz'
> install.packages(pkgPath)
Installing package into '/usr/local/lib/R/site-library'
..

그 결과는 /usr/local/lib/R/site-library에서 보실 수 있습니다.  아래 보이는 SparkR 패키지가 설치된 R.tgz가 앞선 포스팅에 올려져 있으니, 이 과정을 굳이 거치실 필요없이 그걸 그대로 쓰셔도 됩니다.

u0017496@sys-85548:/usr/local/spark-bin$ ls -ltr /usr/local/lib/R/site-library
total 124
drwxrwxr-x  7 root staff 4096 Feb  6 23:54 mime
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 stringi
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 magrittr
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 digest
drwxrwxr-x  7 root staff 4096 Feb  6 23:56 highr
drwxrwxr-x  8 root staff 4096 Feb  6 23:56 yaml
drwxrwxr-x 11 root staff 4096 Feb  6 23:56 markdown
drwxrwxr-x  9 root staff 4096 Feb  6 23:56 stringr
drwxrwxr-x  6 root staff 4096 Feb  6 23:56 evaluate
drwxrwxr-x 14 root staff 4096 Feb  6 23:57 knitr
drwxrwxr-x 10 root staff 4096 Feb  7 02:12 MASS
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 class
drwxrwxr-x  8 root staff 4096 Feb  7 02:12 e1071
drwxrwxr-x 10 root staff 4096 Feb  7 04:33 lattice
drwxrwxr-x 12 root staff 4096 Feb  7 04:34 Matrix
drwxrwxr-x  9 root staff 4096 Feb  7 04:35 survival
drwxrwxr-x 16 root staff 4096 Feb  7 04:37 Rcpp
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 bitops
drwxrwxr-x  6 root staff 4096 Feb  7 04:37 backports
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 base64enc
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 jsonlite
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 htmltools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 caTools
drwxrwxr-x  7 root staff 4096 Feb  7 04:37 rprojroot
drwxrwxr-x  8 root staff 4096 Feb  7 04:37 rmarkdown
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 crayon
drwxrwxr-x  6 root staff 4096 Feb  7 07:03 praise
drwxrwxr-x  7 root staff 4096 Feb  7 07:03 R6
drwxrwxr-x  9 root staff 4096 Feb  8 02:56 testthat
drwxrwxr-x 10 root staff 4096 Feb  8 02:57 rJava
drwxrwxr-x 10 root staff 4096 Feb  9 19:39 SparkR



이제 이 binary들을 별도의 서버에 옮겨서 설치하겠습니다.

먼저, 저 SparkR package가 설치된 /usr/local/lib/R directory 전체를 tar로 말아서 설치하려는 서버로 옮기시고, 같은 /usr/local/lib/ 밑에 풀어 놓습니다.

u0017496@sys-85549:/usr/local/lib$ tar -zxvf R.tgz R

이어서, 위에서 만들어진 spark-2.2.0-SNAPSHOT-bin.tgz를 설치하려는 서버로 옮기시고, /usr/local directory에 풀어 넣으시면 됩니다.  그러면 다음과 같이 spark-bin directory가 생깁니다.  이를 SPARK_HOME으로 export 하십시요.

u0017496@sys-85549:/usr/local$ sudo tar -zxvf /tmp/spark-2.2.0-SNAPSHOT-bin.tgz

u0017496@sys-85549:/usr/local$ tail ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
export R_HOME=/usr/local/lib/R
export SPARK_HOME=/usr/local/spark-bin
export PATH=$SPARK_HOME/bin:$R_HOME/bin:$PATH

u0017496@sys-85549:/usr/local$ cd spark-bin

Spark 구동을 위해서는 local 서버 자체에서도 passwd 없이 ssh가 가능해야 합니다.  이를 위한 준비를 합니다.

u0017496@sys-85549:/usr/local/spark-bin/sbin$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/u0017496/.ssh/id_rsa):
Created directory '/home/u0017496/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

u0017496@sys-85549:/usr/local/spark-bin/sbin$ ssh-copy-id localhost

이제 spark master를 구동합니다.

u0017496@sys-85549:/usr/local/spark-bin/sbin$ sudo mkdir /usr/local/spark-bin/logs
u0017496@sys-85549:/usr/local/spark-bin/sbin$ sudo chown -R u0017496:u0017496 /usr/local/spark-bin/logs
u0017496@sys-85549:/usr/local/spark-bin/sbin$ ./start-all.sh

sparkR을 구동해서 이 spark master에 연결되는지 확인합니다.

u0017496@sys-85549:/usr/local/spark-bin/bin$ sparkR
 Welcome to
    ____              __
   / __/__  ___ _____/ /__
  _\ \/ _ \/ _ `/ __/  '_/
 /___/ .__/\_,_/_/ /_/\_\   version  2.2.0-SNAPSHOT
    /_/


 SparkSession available as 'spark'.
>

성공했습니다.

이제 sparkR에서 그래프를 그려봅니다.  그를 위해서 먼저 DISPLAY를 Xmanager를 띄워놓은 PC client로 세팅합니다.

u0017496@sys-85549:/usr/local/spark-bin/bin$ who
u0017496 pts/0        2017-02-09 19:21 (172.29.97.138)

u0017496@sys-85549:/usr/local/spark-bin/bin$ export DISPLAY=172.29.97.138:0

u0017496@sys-85549:/usr/local/spark-bin/bin$ sparkR

> plot(BOD, type = 'l')

다음과 같이 PC client에 Xmanager를 통해서 그래프가 그려지는 것을 보실 수 있습니다.




여기서 build된 tgz 파일들은 아래 URL에 올려 놓았으니 그대로 쓰셔도 됩니다.  역시 제가 법적, 기술적 책임은 못 진다는 것은 유의하시기 바랍니다.

https://drive.google.com/drive/folders/0B-F0jEb44gqUN3cxaGVDdklwdWc?usp=sharing