2018년 1월 17일 수요일

bvlc-caffe를 RHEL 용으로 빌드하기 (POWER9, ppc64le)

Github에 있는 bvlc-caffe 소스를 이용해서 RHEL 7.4 환경(ppc64le)에서 빌드, 설치해보겠습니다. 상세 내용은 아래 링크를 참조하였습니다.
https://github.com/BVLC/caffe
http://caffe.berkeleyvision.org/installation.html#prerequisites
http://caffe.berkeleyvision.org/install_yum.html


설치에 앞서, bvlc-caffe의 prerequisite이 존재합니다. 필요한 패키지들을 미리 설치, 버전을 맞춰주어야 합니다. 현재 bvlc-caffe를 빌드하는 시스템 환경은 POWER9 AC922 서버, RHEL 7.2(ppc64le), CUDA-9.1 환경입니다. => 향후 업데이트할 환경의 내용입니다. 우선은 GPU가 없는 Power8 RHEL 7.4 환경에서 CPU-ONLY caffe로 빌드하였습니다.

[root@sys-90994 ~]# yum install git protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel gcc gcc-c++ python-devel python-enum34 numpy cmake
[root@sys-90994 usr]# yum install blas-devel blas64-devel atlas-devel
[root@sys-90994 ~]# cd /home/imsi


Prerequisites 중에 하나인 Boost를 빌드해보겠습니다.
Boost >= 1.55

[root@sys-90994 imsi]# wget https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.gz
[root@sys-90994 imsi]# tar -xvzf boost_1_66_0.tar.gz
[root@sys-90994 imsi]# cd boost_1_66_0
[root@sys-90994 boost_1_66_0]# ls
boost            boostcpp.jam  boost.png      bootstrap.sh  index.htm   INSTALL  libs             more     status
boost-build.jam  boost.css     bootstrap.bat  doc           index.html  Jamroot  LICENSE_1_0.txt  rst.css  tools
[root@sys-90994 boost_1_66_0]# ./bootstrap.sh --prefix=/usr/local --with-toolset=gcc    => prefix를 /usr/local/boost로 설정하면, /usr/local/boost/include, /usr/local/boost/lib 가 각각 생성됩니다. 이를 나중에 옮겨주어야 하므로, 처음부터 /usr/local로 설정하면, /usr/local/include, /usr/local/lib에 boost header, library가 각각 생성되어 들어가게 됩니다.

[root@sys-90994 boost_1_66_0]# ./b2
...updated 60 targets...

The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

    /home/imsi/boost_1_66_0

The following directory should be added to linker library paths:

    /home/imsi/boost_1_66_0/stage/lib

Build 과정은 잘 완료되었고, PDP VM 환경에서 약 30분 정도 소요되었습니다. 이어서 Boost 를 설치합니다.

[root@sys-90994 boost_1_66_0]# ./b2 install
(생략)
ommon.copy /usr/local/boost/lib/libboost_exception.a
common.copy /usr/local/boost/lib/libboost_system.a
common.copy /usr/local/boost/lib/libboost_chrono.a
common.copy /usr/local/boost/lib/libboost_timer.a
common.copy /usr/local/boost/lib/libboost_test_exec_monitor.a
...updated 14124 targets...

위 명령이 완료되면, 이전에 지정한 prefix 경로(/usr/local/boost)에 lib/ , include/를 생성합니다.

Boost 구성이 완료되었으면, 또 다른 prerequisites 중에 하나인 glog 를 설치합니다.

[root@sys-90994 imsi]# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/google-glog/glog-0.3.3.tar.gz
[root@sys-90994 imsi]# tar zxvf glog-0.3.3.tar.gz
[root@sys-90994 imsi]# cd glog-0.3.3
[root@sys-90994 glog-0.3.3]# rpm --eval %{_host}
powerpc64le-redhat-linux-gnu
[root@sys-90994 glog-0.3.3]# ./configure --build=powerpc64le-redhat-linux-gnu
[root@sys-90994 glog-0.3.3]# make && make install
(생략)
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
test -z "/usr/local/share/doc/glog-0.3.3" || /bin/mkdir -p "/usr/local/share/doc/glog-0.3.3"
 /bin/install -c -m 644 AUTHORS COPYING ChangeLog INSTALL NEWS README README.windows doc/designstyle.css doc/glog.html '/usr/local/share/doc/glog-0.3.3'
test -z "/usr/local/include/glog" || /bin/mkdir -p "/usr/local/include/glog"
 /bin/install -c -m 644 src/glog/log_severity.h '/usr/local/include/glog'
test -z "/usr/local/include/glog" || /bin/mkdir -p "/usr/local/include/glog"
 /bin/install -c -m 644 src/glog/logging.h src/glog/raw_logging.h src/glog/vlog_is_on.h src/glog/stl_logging.h '/usr/local/include/glog'
test -z "/usr/local/lib/pkgconfig" || /bin/mkdir -p "/usr/local/lib/pkgconfig"
 /bin/install -c -m 644 libglog.pc '/usr/local/lib/pkgconfig'
make[1]: Leaving directory `/home/imsi/glog-0.3.3'


다음은 gflags 를 설치합니다.
[root@sys-90994 imsi]# wget https://github.com/schuhschuh/gflags/archive/master.zip
[root@sys-90994 imsi]# unzip master.zip
[root@sys-90994 imsi]# cd gflags-master/
[root@sys-90994 gflags-master]# mkdir build && cd build
[root@sys-90994 build]# export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
[root@sys-90994 build]# make && make install
[ 50%] Built target gflags_nothreads_static
[100%] Built target gflags_static
[ 50%] Built target gflags_nothreads_static
[100%] Built target gflags_static
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libgflags.a
-- Installing: /usr/local/lib/libgflags_nothreads.a
-- Installing: /usr/local/include/gflags/gflags.h
-- Installing: /usr/local/include/gflags/gflags_declare.h
-- Installing: /usr/local/include/gflags/gflags_completions.h
-- Installing: /usr/local/include/gflags/gflags_gflags.h
-- Installing: /usr/local/lib/cmake/gflags/gflags-config.cmake
-- Installing: /usr/local/lib/cmake/gflags/gflags-config-version.cmake
-- Installing: /usr/local/lib/cmake/gflags/gflags-targets.cmake
-- Installing: /usr/local/lib/cmake/gflags/gflags-targets-noconfig.cmake
-- Installing: /usr/local/bin/gflags_completions.sh
-- Installing: /usr/local/lib/pkgconfig/gflags.pc
-- Installing: /root/.cmake/packages/gflags/e5f7ce61772240490d3164df06f58ce9

gflags 설치도 완료되었습니다. 다음으로 lmdb를 설치합니다.
[root@sys-90994 build]# cd /home/imsi
[root@sys-90994 imsi]# git clone https://github.com/LMDB/lmdb
Cloning into 'lmdb'...
remote: Counting objects: 7846, done.
remote: Total 7846 (delta 0), reused 0 (delta 0), pack-reused 7845
Receiving objects: 100% (7846/7846), 1.76 MiB | 0 bytes/s, done.
Resolving deltas: 100% (3372/3372), done.
[root@sys-90994 imsi]# cd lmdb/libraries/liblmdb
[root@sys-90994 liblmdb]# make && make install
(생략)
for f in mdb_stat mdb_copy mdb_dump mdb_load; do cp $f /usr/local/bin; done
for f in liblmdb.a liblmdb.so; do cp $f /usr/local/lib; done
for f in lmdb.h; do cp $f /usr/local/include; done
for f in mdb_stat.1 mdb_copy.1 mdb_dump.1 mdb_load.1; do cp $f /usr/local/share/man/man1; done

이번엔 hdf5를 설치합니다. 
[root@sys-90994 imsi]# wget http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.10.1.tar.gz
[root@sys-90994 imsi]# tar xvfz hdf5-1.10.1.tar.gz
[root@sys-90994 imsi]# cd hdf5-1.10.1

아래 --prefix는 설치 경로를 지정해줍니다.
[root@sys-90994 hdf5-1.10.1]# ./configure --prefix=/usr/local/hdf5 --enable-fortran --enable-cxx --build=powerpc64le-linux-gnu

수행이 잘 완료되면 make 명령으로 소스를 빌드하는데, 시간이 좀 걸리며 일부 warning이 발생하지만 에러 없이 수행됩니다. 
[root@sys-90994 hdf5-1.10.1]# make
[root@sys-90994 hdf5-1.10.1]# make install

필요한 경우, leveldb도 설치해줍니다. leveldb는 rpm 패키지를 다운로드 받아서 설치할 수 있습니다.
[root@sys-90994 imsi]# wget https://rpmfind.net/linux/epel/7/ppc64le/Packages/l/leveldb-1.12.0-11.el7.ppc64le.rpm
[root@sys-90994 imsi]# rpm -Uvh leveldb-1.12.0-11.el7.ppc64le.rpm
[root@sys-90994 imsi]# wget https://www.rpmfind.net/linux/epel/7/ppc64le/Packages/l/leveldb-devel-1.12.0-11.el7.ppc64le.rpm
[root@sys-90994 imsi]# rpm -Uvh leveldb-devel-1.12.0-11.el7.ppc64le.rpm

완료되었습니다. /usr/local/include, /usr/local/lib 경로를 확인해보면, 위에서 설치한 boost, glog, gflags, lmdb, hdf5 관련 헤더와 라이브러리가 생성된 것이 보입니다.
[root@sys-90994 liblmdb]# ls /usr/local/include
boost  gflags  glog  lmdb.h
[root@sys-90994 lib]# ls /usr/local/lib | grep boost | wc -l
107
[root@sys-90994 lib]# ls /usr/local/lib | grep glog | wc -l
5
[root@sys-90994 lib]# ls /usr/local/lib | grep gflags | wc -l
2
[root@sys-90994 lib]# ls /usr/local/lib | grep lmdb | wc -l
2


또다른 prerequisites인 OpenCV >= 2.4 가 설치되어 있는지 확인합니다.
[root@sys-90994 ~]# yum list opencv
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Installed Packages
opencv.ppc64le                                                 2.4.5-3.el7                                                  @optional

필요한 prerequisite 은 어느정도 준비가 되었습니다. 위에서 언급된 것 외에, 기본적으로 GPU 를 사용하기 위해 필요한 CUDA, cuDNN 등은 미리 설치가 되어 있어야 합니다.

bvlc-caffe를 Github 에서 복제합니다. Caffe build는 make 혹은 cmake 명령을 이용하여 가능합니다. 아래 예제에서는 make를 사용했습니다.
[root@sys-90994 imsi]# git clone https://github.com/BVLC/caffe.git
[root@sys-90994 imsi]# cd caffe
[root@sys-90994 caffe]# cp Makefile.config.example Makefile.config

Makefile.config 를 원하는 구성대로 변경합니다. 예를 들어 Build 하려는 Caffe에서 CPU Only로만 동작할 것인지, 특정 DB는 사용하지 않도록 할것인지, Anaconda를 사용할것인지, Python path는 어디서 사용할 것인지 등을 정할 수 있습니다. 현재 환경에서는 Makefile.config에 명시된 numpy 경로가 달라서, 이 부분만 수정하였습니다.

[root@sys-90994 caffe]# vi Makefile.config
# We need to be able to find Python.h and numpy/arrayobject.h.
#PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python2.7/dist-packages/numpy/core/include
PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib64/python2.7/site-packages/numpy/core/include/numpy

# NCCL acceleration switch (uncomment to build with NCCL)
# https://github.com/NVIDIA/nccl (last tested version: v1.2.3-1+cuda8.0)
# USE_NCCL := 1

# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
BLAS_LIB := /usr/lib64/atlas

# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/local/hdf5/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/local/hdf5/lib

[root@sys-90994 caffe]# make all
PROTOC src/caffe/proto/caffe.proto
CXX .build_release/src/caffe/proto/caffe.pb.cc
CXX src/caffe/blob.cpp
In file included from ./include/caffe/common.hpp:19:0,
                 from ./include/caffe/blob.hpp:8,
                 from src/caffe/blob.cpp:4:
./include/caffe/util/device_alternate.hpp:34:23: fatal error: cublas_v2.h: No such file or directory
 #include <cublas_v2.h>
                       ^
compilation terminated.
make: *** [.build_release/src/caffe/blob.o] Error 1

에러 발생 ==> 문제는 Makefile.config 기본 설정에서는 빌드할때 CPU,GPU 모두 사용하는 caffe로 빌드 시도했으나, 현재 PDP 에는 GPU가 없기 때문입니다. 이 에러는 GPU 있는 시스템에서 빌드해보면 정상적으로 빌드가 완료될 것입니다.

PDP VM에는 GPU가 없으므로, 이번에는 CPU 전용 caffe로 빌드해봅니다.
[root@sys-90994 caffe]# vi Makefile.config
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1
# CUDA directory contains bin/ and lib/ directories that we need.
#CUDA_DIR := /usr/local/cuda

[root@sys-90994 caffe]# make all
LD -o .build_release/lib/libcaffe.so.1.0.0
/bin/ld: cannot find -lcblas
/bin/ld: cannot find -latlas
collect2: error: ld returned 1 exit status
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1

만약 위와 같은 에러가 발생하는 경우, atlas를 설치하지 않았거나, 혹은 Makefile.config 에서 BLAS_LIB, BLAS_INCLUDE 경로를 제대로 지정해주지 않아서 발생합니다. 이를 반영했는데도 동일한 에러가 발생하는 경우는, 새로운 atlas의 라이브러리가 -lcblas, -latlas가 아니라 -lsatlas, -ltatlas 로 제공되어 기존 라이브러리 이름으로는 사용이 불가능할 수도 있습니다. 보통 atlas는 /usr/lib64/atlas 경로에 설치되므로, 해당 경로를 확인하면 어떤 라이브러리 이름으로 명기되어 있는지 보입니다.

[root@sys-90994 caffe]# ls /usr/lib64/atlas
libsatlas.so  libsatlas.so.3  libsatlas.so.3.10  libtatlas.so  libtatlas.so.3  libtatlas.so.3.10

제 경우에는 라이브러리 이름이 -lsatlas, -ltatlas 로 되어 있습니다. 따라서 Makefile 에서 LIBRARY 명을 정해주는 코드를 변경합니다.

[root@sys-90994 caffe]# vi Makefile
# BLAS configuration (default = ATLAS)
BLAS ?= atlas
ifeq ($(BLAS), mkl)
        # MKL
        LIBRARIES += mkl_rt
        COMMON_FLAGS += -DUSE_MKL
        MKLROOT ?= /opt/intel/mkl
        BLAS_INCLUDE ?= $(MKLROOT)/include
        BLAS_LIB ?= $(MKLROOT)/lib $(MKLROOT)/lib/intel64
else ifeq ($(BLAS), open)
        # OpenBLAS
        LIBRARIES += openblas
else
        # ATLAS
        ifeq ($(LINUX), 1)
                ifeq ($(BLAS), atlas)
                        # Linux simply has cblas and atlas
#                        LIBRARIES += cblas atlas => 이 부분을 uncomment 처리 or 바꿔주면 됩니다.
                        LIBRARIES += satlas tatlas


[root@sys-90994 caffe]# make all
(생략)
CXX tools/upgrade_solver_proto_text.cpp
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX examples/cifar10/convert_cifar_data.cpp
CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
CXX examples/cpp_classification/classification.cpp
CXX/LD -o .build_release/examples/cpp_classification/classification.bin
CXX examples/mnist/convert_mnist_data.cpp
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin
CXX examples/siamese/convert_mnist_siamese_data.cpp
CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin

완료되었으면, 제대로 빌드 되었는지 테스트를 해봅니다.
[root@sys-90994 caffe]# make test
(생략)
LD .build_release/src/caffe/test/test_threshold_layer.o
LD .build_release/src/caffe/test/test_tile_layer.o
LD .build_release/src/caffe/test/test_upgrade_proto.o
LD .build_release/src/caffe/test/test_util_blas.o

runtest를 수행합니다. 수행에 앞서, LD_LIBRARY_PATH를 잡아줍니다. 위에서 prerequisite으로 설치했던 패키지들의 lib 경로가 모두 포함되어야 합니다. 그렇지 않으면, make runtest를 수행할때 특정 라이브러리를 찾을 수 없으므로, ".build_release/tools/caffe: error while loading shared libraries: libglog.so.0: cannot open shared object file: No such file or directory" 와 같은 에러가 발생합니다. (위 에러는 glog 라이브러리 에러)

[root@sys-90994 caffe]# export LD_LIBRARY_PATH=/usr/local/hdf5/lib:/usr/local/lib:/usr/lib:/usr/lib64
[root@sys-90994 caffe]# make runtest
(생략)
[----------] Global test environment tear-down
[==========] 1110 tests from 152 test cases ran. (85350 ms total)
[  PASSED  ] 1110 tests.

위와 같이 나오면 설치가 모두 완료된 것입니다.
이제 mnist 와 같은 간단한 툴로 caffe가 제대로 수행되는지 확인해봅니다.

[root@sys-90994 caffe]# cd data/mnist
[root@sys-90994 mnist]# ./get_mnist.sh
[root@sys-90994 mnist]# cd ../../

create_mnist.sh 을 먼저 수정해줍니다. convert_mnist_data.bin 를 수행해야 하므로, 해당 파일이 있는 경로로 BUILD를 지정해줍니다. (#find . -name convert_mnist_data.bin)
[root@sys-90994 caffe]# vi examples/mnist/create_mnist.sh
#BUILD=build/examples/mnist
BUILD=.build_release/examples/mnist

[root@sys-90994 caffe]# ./examples/mnist/create_mnist.sh
Creating lmdb...
I0117 09:58:32.196631 12668 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I0117 09:58:32.197115 12668 convert_mnist_data.cpp:88] A total of 60000 items.
I0117 09:58:32.197132 12668 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I0117 09:58:40.927907 12668 convert_mnist_data.cpp:108] Processed 60000 files.
I0117 09:58:40.954234 12676 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_test_lmdb
I0117 09:58:40.954594 12676 convert_mnist_data.cpp:88] A total of 10000 items.
I0117 09:58:40.954603 12676 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I0117 09:58:45.823518 12676 convert_mnist_data.cpp:108] Processed 10000 files.
Done.

lenet을 수행하기 위한 solver.prototxt 를 수정합니다. 현재는 CPU 전용 caffe로 빌드되어있으므로, 
[root@sys-90994 caffe]# vi ./examples/mnist/lenet_solver.prototxt
#solver mode: CPU or GPU
solver_mode: CPU

[root@sys-90994 caffe]# time ./examples/mnist/train_lenet.sh
---
I0117 10:05:26.000897 12939 caffe.cpp:259] Optimization Done.

수행이 정상적으로 종료되는지 확인합니다. 


2017년 12월 4일 월요일

Tensorflow 의 로그로 tensorboard 사용하기

Tensorboard 를 사용하면 Tensorflow 수행 후 남아있는 로그들을 이용하여 loss, learning rate 등을 손쉽게 그래프로 확인할 수 있습니다.

단, Tensorflow를 수행하는 python 코드에 나중에 tensorboard로 그래프화 할 수 있게끔 timestamp, 수행 로그 등을 남겨주는 코드가 미리 삽입되어 있어야 합니다.

해당 내용은 아래의 링크를 참조하세요.

저는 이미 training 시의 이벤트 로그를 남기도록 되어있는 python script를 가지고 Tensorflow를 수행했습니다.
이후, tensorboard를 수행하며 log가 위치한 path 정보를 --log dir 인자값으로 넘겨줍니다.

b7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/benchmark/tensorflow/train_log_single$ tensorboard --logdir=./
TensorBoard 0.1.8 at http://p10login1:6006 (Press CTRL+C to quit)
W1129 01:09:46.680698 Reloader tf_logging.py:86] Found more than one graph event per run, or there was a metagraph containing a graph_def, as well as one or more graph events.  Overwriting the graph with the newest event.

위와 같이 tensorboard 데몬이 실행되면, 브라우저를 통해 위 URL로 접근해봅니다. (POK 센터는 http://p10login1.pbm.ihost.com:6006 으로 접근합니다.)

다음과 같이 해당 logdir에 위치한 event log의 정보들을 읽어오고, 그래프로 표현해줍니다.
저의 경우, 여러차례 동일 스크립트를 수행하는 바람에 로그가 duplicate 되어 warning 메시지가 발생하였습니다만, logdir에 각 수행되는 TF job 별로 하부 directory를 지정하여 로그를 기록하면 위와 같은 문제는 없을것이라 생각합니다.

예를들어, 기본 로그 디렉토리를 /train_log_dir로 설정하는 경우, 각 수행하는 TF job 별로 하부 디렉토리를 구분하여 적재하면 아래와 같이 Tensorboard에서 Runs의 toggle을 구분하여 그래프를 볼수 있습니다.

(예) logdir = /train_log_dir
tf1 Job은 /train_log_dir/tf1_job_log
tf2 Job은 /train_log_dir/tf2_job_log



2017년 12월 3일 일요일

Caffe의 plot_training_log.py 수행하기 (Caffe 수행 후 로그로 그래프 그리기)

Caffe-bvlc, caffe-nv 등 오픈소스를 보면 tools/extra/ 경로에 로그 그래프를 그릴 수 있는 스크립트를 기본으로 제공합니다. PowerAI에 포함된 caffe, caffe-nv, caffe-ibm에는 해당 스크립트는 없지만, github에 올라온 코드를 사용하여 동일한 plotting 을 수행할 수 있습니다.

우선 Github에서 caffe-bvlc 를 복제합니다.
b7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/imsi$ git clone https://github.com/BVLC/caffe.gitb7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/imsi$ cd bvlc_caffe

/usr/bin/python2.7 버전을 사용하여 tools/extra/plot_training_log.py.example 을 수행합니다. 이미 PYTHONPATH로 설정되어 있다면 python 명령어로 사용할 수 있습니다.

이때 plot_training_log.py.example을 수행하는 포맷은 다음과 같습니다.
Usage:
./plot_training_log.py.example chart_type[0-7] /where/to/save.png(저장할이미지명/경로) /path/to/first.log(읽어올 로그경로)
Notes:
1. Supporting multiple logs.
2. Log file name must end with the lower-cased ".log".
Supported chart types:
0: Test accuracy vs. Iters
1: Test accuracy vs. Seconds
2: Test loss vs. Iters
3: Test loss vs. Seconds
4: Train learning rate vs. Iters
5: Train learning rate vs. Seconds
6: Train loss vs. Iters
7: Train loss vs. Seconds

아래 수행의 경우, /usr/bin/python2.7 로 bvlc_caffe/tool/extra/plot_training_log.py.example을 실행시켰으며, 6번(Train loss vs Iters) 그래프를 그려서 bvlc_caffe/image_results/caffe_gnet_128b_4G.png 라는 이름의 이미지 파일로 저장합니다. 읽어올 로그 경로는 가장 마지막에 있는 ../../benchmark/caffe/log/output_inception_v1_iter50045_b64_4gpu.11160529.log <- 이 로그를 불러옵니다.

b7p284za@p10login1:/gpfs/gpfs_gl4_16mb/b7p284za/imsi/bvlc_caffe$ /usr/bin/python2.7 ./tools/extra/plot_training_log.py.example 6 ./image_results/caffe_gnet_128b_4G.png ../../benchmark/caffe/log/output_inception_v1_iter50045_b64_4gpu.11160529.log
/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.')

잠시간의 시간이 걸리고(수초-수분 내외), 아래와 같이 MATLAB을 사용하여 그래프를 그려줍니다.



2017년 7월 16일 일요일

Kubernetes on RHEL 7.2 LE 기본 설치/구성하기

Docker Container Orchestrator 역할을 하는 오픈소스 기반 Kubernetes cluster를 Linux on Power 에 구성해보겠습니다.

현재 Kubernetes는 RHEL Little-endian(ppc64le)에서 지원됩니다.

기본 과정은 아래 블로그를 참조했습니다.
(https://www.ibm.com/developerworks/library/l-docker-orchestration/
http://cloudgeekz.com/773/setting-up-a-kubernetes-cluster-on-power.html
https://www.ibm.com/developerworks/community/blogs/mhhaque/entry/Docker_And_Kubernetes_Cluster_on_Power_with_RHEL7_Part_1_Preparing_all_Node?lang=en)

1. RHEL 7.2 환경에서 구성하며, kubernetes 설치를 위해 repository를 설정합니다.

[root@sys-88227 ~]# cat /etc/*release
NAME="Red Hat Enterprise Linux Server"
VERSION="7.2 (Maipo)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="7.2"
PRETTY_NAME="Red Hat Enterprise Linux Server 7.2 (Maipo)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:7.2:GA:server"
HOME_URL="https://www.redhat.com/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 7"
REDHAT_BUGZILLA_PRODUCT_VERSION=7.2
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="7.2"
Red Hat Enterprise Linux Server release 7.2 (Maipo)
Red Hat Enterprise Linux Server release 7.2 (Maipo)

=> kubernetes 설치하기 위한 파일셋 갖고 있는 repository를 추가
[root@sys-88227 ~]# cat > /etc/yum.repos.d/unicamp-docker.repo <<EOF
> [unicamp-docker]
> name=Unicamp Repo for Docker Packages
> baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
> enabled=1
> gpgcheck=0
> EOF

[root@sys-88227 ~]# cat > /etc/yum.repos.d/unicamp-misc.repo <<EOF
> [unicamp-misc]
> name=Unicamp Repo for Misc Packages
> baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
> enabled=1
> gpgcheck=0
> EOF

=> 새로운 repository 추가된 것 확인
[root@sys-88227 ~]# yum repolist
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use su                               bscription-manager to register.
unicamp-docker                                           | 2.9 kB     00:00
unicamp-misc                                             | 2.9 kB     00:00
(1/2): unicamp-docker/primary_db                           | 3.9 kB   00:00
(2/2): unicamp-misc/primary_db                             |  21 kB   00:00
repo id               repo name                                           status
advance_toolchain     IBM Advance Toolchain                                   88
compiler              IBM XL C/C++ And Fortran Compiler                       56
optional              RedHat Enterprise LE Linux 7.2 - Optional           25,873
server                RedHat Enterprise LE Linux 7.2 - Server              6,594
supplementary         RedHat Enterprise LE Linux 7.2 - Supplementary      19,380
unicamp-docker        Unicamp Repo for Docker Packages                         3
unicamp-misc          Unicamp Repo for Misc Packages                          40
repolist: 52,034

=> Kubernetes 관련 파일셋 설치
[root@sys-88227 ~]# yum install kubernetes-client kubernetes-master etcd
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-man                 ager to register.
Resolving Dependencies
--> Running transaction check
---> Package etcd.ppc64le 0:3.0.15-1.el7 will be installed
---> Package kubernetes-client.ppc64le 0:1.4.7-1.git92b4f97.el7 will be installed
---> Package kubernetes-master.ppc64le 0:1.4.7-1.git92b4f97.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================
 Package                 Arch          Version                       Repository          Size
==============================================================================================
Installing:
 etcd                    ppc64le       3.0.15-1.el7                  unicamp-misc       7.2 M
 kubernetes-client       ppc64le       1.4.7-1.git92b4f97.el7        unicamp-misc       6.6 M
 kubernetes-master       ppc64le       1.4.7-1.git92b4f97.el7        unicamp-misc        27 M

Transaction Summary
==============================================================================================
Install  3 Packages

Total download size: 41 M
Installed size: 270 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le.rpm                             | 6.6 MB  00:00:09
(2/3): etcd-3.0.15-1.el7.ppc64le.rpm                                                    | 7.2 MB  00:00:10
(3/3): kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le.rpm                             |  27 MB  00:00:40
---------------------------------------------------------------------------------------------------------------
Total                                                                          830 kB/s |  41 MB  00:00:50
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                            1/3
groupadd: failure while writing changes to /etc/group
useradd: group 'kube' does not exist
error: %pre(kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le) scriptlet failed, exit status 6
Error in PREIN scriptlet in rpm package kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le
error: kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le: install failed
groupadd: failure while writing changes to /etc/group
useradd: group 'etcd' does not exist
error: %pre(etcd-3.0.15-1.el7.ppc64le) scriptlet failed, exit status 6
Error in PREIN scriptlet in rpm package etcd-3.0.15-1.el7.ppc64le
  Verifying  : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                            1/3
  Verifying  : etcd-3.0.15-1.el7.ppc64le                                                                   2/3
  Verifying  : kubernetes-master-1.4.7-1.git92b4f97.el7.ppc64le                                            3/3

Installed:
  kubernetes-client.ppc64le 0:1.4.7-1.git92b4f97.el7

Failed:
  etcd.ppc64le 0:3.0.15-1.el7                kubernetes-master.ppc64le 0:1.4.7-1.git92b4f97.el7

Complete!

=> 그룹 추가 관련 명령어가 수행되지 않아서 Kubernetes-master, etcd 설치 실패.
=> 임의의 그룹 번호(700, 701) 사용 중인지 확인 후, 그룹 추가합니다.
[root@sys-88227 ~]# cat /etc/group | grep 700
[root@sys-88227 ~]# cat /etc/group | grep 701
[root@sys-88227 ~]# groupadd -g 700 kube
[root@sys-88227 ~]# groupadd -g 701 etcd
[root@sys-88227 ~]# cat /etc/group | grep kube
kube:x:700:
[root@sys-88227 ~]# cat /etc/group | grep etcd
etcd:x:701:

=> Kubernetes-master, etcd 설치 재수행
[root@sys-88227 ~]# yum install kubernetes-master etcd
(중략)
Installed:
  etcd.ppc64le 0:3.0.15-1.el7                kubernetes-master.ppc64le 0:1.4.7-1.git92b4f97.el7

Complete!


,
=> Network Ports 오픈 (Kubernetes API 서버 : 8080, etcd : 2379 by default)
[root@sys-88227 ~]# firewall-cmd --zone=public --add-port 8080/tcp --permanent
success
[root@sys-88227 ~]# firewall-cmd --zone=public --add-port=2379/tcp --permanent
success
[root@sys-88227 ~]# firewall-cmd --reload
success

2. Kubernetes Master 구성

설치가 되었으면 아래와 같이 /etc/kubernetes 폴더가 생깁니다.

[root@sys-88227 ~]# ls /etc/kubernetes/
apiserver  config  controller-manager  scheduler

=> Master로 구성할 서버의 IP 정보 확인
[root@sys-88227 ~]# ifconfig | grep inet
        inet 172.29.160.107  netmask 255.255.192.0  broadcast 172.29.191.255

[root@sys-88227 ~]# openssl genrsa -out /tmp/serviceaccount.key 2048

=> Kubernetes 구성 파일에서 Master IP 정보 수정
[root@sys-88227 ~]# vi /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.29.160.107:8080"

=> API 서버 구성파일에서 etcd 서버의 IP 정보 수정 (현재 구성에서는 One Master)
[root@sys-88227 ~]# vi /etc/kubernetes/apiserver
# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://172.29.160.107:2379,http://172.29.160.107:4001"
KUBE_API_PORT="--port=8080"
KUBE_API_ARGS="--service_account_key_file=/tmp/serviceaccount.key"

 => Etcd 구성하기
[root@sys-88227 ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

=> Control-manager 추가
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/tmp/serviceaccount.key"


=> Kubernetes 서비스 시작하기
[root@sys-88227 ~]# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
> systemctl restart $SERVICES
> systemctl enable $SERVICES
> systemctl status $SERVICES
> done
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:08 EDT; 214ms ago
 Main PID: 9538 (etcd)
   CGroup: /system.slice/etcd.service
           └─9538 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:23...

Jul 16 11:06:07 sys-88227.dal-ebis.ihost.com etcd[9538]: starting server... [version: 3.0.15, cluster version: 3.0]
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d is starting a new election at term 5
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d became candidate at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d received vote from 8e9e05c52164694d at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: 8e9e05c52164694d became leader at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 6
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: published {Name:default ClientURLs:[http://0.0.0.0:2379]} to c...8c32
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: ready to serve client requests
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com etcd[9538]: serving insecure client requests on 0.0.0.0:2379, this is stro...ged!
Jul 16 11:06:08 sys-88227.dal-ebis.ihost.com systemd[1]: Started Etcd Server.
Hint: Some lines were ellipsized, use -l to show in full.
● kube-apiserver.service - Kubernetes API Server
   Loaded: loaded (/usr/lib/systemd/system/kube-apiserver.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:09 EDT; 86ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 9571 (kube-apiserver)
   CGroup: /system.slice/kube-apiserver.service
           └─9571 /usr/bin/kube-apiserver --logtostderr=true --v=0 --etcd-servers=http://172.29.160.107:2379 --insecure-bin...

Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.031808    9571 reflector.go:214] k8s.i...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.031936    9571 reflector.go:214] k8s.io/k...
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.032020    9571 reflector.go:214] k8s.i...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.032143    9571 reflector.go:203] k8s.i...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: E0716 11:06:09.139549    9571 reflector.go:214] pkg/c...sed
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: [restful] 2017/07/16 11:06:09 log.go:30: [restful/swa...pi/
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: [restful] 2017/07/16 11:06:09 log.go:30: [restful/swa...ui/
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Started Kubernetes API Server.
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: I0716 11:06:09.257313    9571 genericapiserver.go:716...443
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com kube-apiserver[9571]: I0716 11:06:09.257490    9571 genericapiserver.go:761...080
Hint: Some lines were ellipsized, use -l to show in full.
● kube-controller-manager.service - Kubernetes Controller Manager
   Loaded: loaded (/usr/lib/systemd/system/kube-controller-manager.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:09 EDT; 148ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 9599 (kube-controller)
   CGroup: /system.slice/kube-controller-manager.service
           └─9599 /usr/bin/kube-controller-manager --logtostderr=true --v=0 --master=http://172.29.160.107:8080 --service_a...

Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Stopping Kubernetes Controller Manager...
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Started Kubernetes Controller Manager.
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Starting Kubernetes Controller Manager...
● kube-scheduler.service - Kubernetes Scheduler Plugin
   Loaded: loaded (/usr/lib/systemd/system/kube-scheduler.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-07-16 11:06:09 EDT; 144ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 9626 (kube-scheduler)
   CGroup: /system.slice/kube-scheduler.service
           └─9626 /usr/bin/kube-scheduler --logtostderr=true --v=0 --master=http://172.29.160.107:8080

Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Stopping Kubernetes Scheduler Plugin...
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Started Kubernetes Scheduler Plugin.
Jul 16 11:06:09 sys-88227.dal-ebis.ihost.com systemd[1]: Starting Kubernetes Scheduler Plugin...


3. Kubernetes node (Minion) 구성하기

=> 필요한 패키지 설치
[root@sys-88228 ~]#yum install kubernetes-client kubernetes-node

1:nvidia-kmod-361.107-2.el7.ppc64le has installed conflicts nvidia-uvm-kmod: 1:nvidia-kmod-361.107-2.el7.ppc64le
  Installing : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                                    1/3
  Installing : socat-1.7.2.2-5.el7.ppc64le                                                                         2/3
  Installing : kubernetes-node-1.4.7-1.git92b4f97.el7.ppc64le                                                      3/3
  Verifying  : kubernetes-node-1.4.7-1.git92b4f97.el7.ppc64le                                                      1/3
  Verifying  : socat-1.7.2.2-5.el7.ppc64le                                                                         2/3
  Verifying  : kubernetes-client-1.4.7-1.git92b4f97.el7.ppc64le                                                    3/3

Installed:
  kubernetes-client.ppc64le 0:1.4.7-1.git92b4f97.el7          kubernetes-node.ppc64le 0:1.4.7-1.git92b4f97.el7

Dependency Installed:
  socat.ppc64le 0:1.7.2.2-5.el7

Complete!

[root@sys-88228 ~]# vi /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://172.29.160.107:8080"

[root@sys-88228 ~]# vi /etc/kubernetes/kubelet

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME=" "
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://172.29.160.107:8080"

[root@sys-88228 ~]# for SERVICES in kube-proxy kubelet docker; do
> systemctl restart $SERVICES
> systemctl enable $SERVICES
> systemctl status $SERVICES
> done
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
● kube-proxy.service - Kubernetes Kube-Proxy Server
   Loaded: loaded (/usr/lib/systemd/system/kube-proxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:40:11 EDT; 177ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 21334 (kube-proxy)
   CGroup: /system.slice/kube-proxy.service
           └─21334 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=h...

Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: W0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: I0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: E0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: E0713 22:4...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kube-proxy[21334]: E0713 22:4...
Hint: Some lines were ellipsized, use -l to show in full.
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
● kubelet.service - Kubernetes Kubelet Server
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:40:11 EDT; 269ms ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 21374 (kubelet)
   CGroup: /system.slice/kubelet.service
           └─21374 /usr/bin/kubelet --logtostderr=true --v=0 --api-servers...

Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com systemd[1]: Started Kubernete...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com systemd[1]: Starting Kubernet...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kubelet[21374]: Flag --api-se...
Jul 13 22:40:11 sys-88228.dal-ebis.ihost.com kubelet[21374]: W0713 22:40:1...
Hint: Some lines were ellipsized, use -l to show in full.
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:40:14 EDT; 215ms ago
     Docs: https://docs.docker.com
 Main PID: 21403 (dockerd)
   CGroup: /system.slice/docker.service
           ├─21403 /usr/bin/dockerd
           └─21407 docker-containerd -l unix:///var/run/docker/libcontaine...

Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com dockerd[21403]: time="2017-07...
Jul 13 22:40:14 sys-88228.dal-ebis.ihost.com systemd[1]: Started Docker Ap...
Hint: Some lines were ellipsized, use -l to show in full.

4. Master 서버에서 node 정보 확인
[root@sys-88227 ~]# kubectl get nodes --show-labels
NAME                           STATUS     AGE       LABELS
127.0.0.1                      NotReady   2d        beta.kubernetes.io/arch=ppc64le,beta.kubernetes.io/os=linux,kubernetes.io/hostname=127.0.0.1
sys-88228.dal-ebis.ihost.com   Ready      11m       beta.kubernetes.io/arch=ppc64le,beta.kubernetes.io/os=linux,kubernetes.io/hostname=sys-88228.dal-ebis.ihost.com

Docker engine 설치하기 on RHEL 7.2 (ppc64le)

기본 내용은 아래 공식 링크를 참조했으나, 일부 에러가 발생하여 필요한 패키지를 별도로 다운로드 받아서 설치했습니다.

https://developer.ibm.com/linuxonpower/docker-on-power/

# cat > /etc/yum.repos.d/unicamp-docker.repo <<EOF
[unicamp-docker]
name=Unicamp Repo for Docker Packages
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
enabled=1
gpgcheck=0
EOF
 
#yum install docker-engine

Error: Package: docker-engine-17.05.0.ce-1.el7.centos.ppc64le (unicamp-docker)
           Requires: libseccomp.so.2()(64bit)
 You could try using --skip-broken to work around the problem
** Found 3 pre-existing rpmdb problem(s), 'yum check' output follows:
docker-selinux-1.13.1-0.ael7b.noarch has installed conflicts docker-selinux: docker-selinux-1.13.1-0.ael7b.noarch
1:nvidia-kmod-361.107-2.el7.ppc64le has installed conflicts nvidia-uvm-kmod: 1:nvidia-kmod-361.107-2.el7.ppc64le
policycoreutils-python-2.2.5-20.el7.ppc64le has missing requires of libcgroup
 
=====> yum으로 설치하려니 dependancy issue 등이 발생함. 필요한 패키지를 다운로드 받아서 사용하기로 함. 

#wget -r -np http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/
혹은 #wget http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/docker-ppc64el/docker-1.13.1-0.ael7b.ppc64le.rpm

#wget http://mirror.luga.ru/centos/altarch/7/os/ppc64le/Packages/libcgroup-0.41-8.el7.ppc64le.rpm

#setenforce 0

[root@sys-88228 docker-ppc64el]# rpm -Uvh docker-1.13.1-0.ael7b.ppc64le.rpm
error: Failed dependencies:
        docker-selinux = 1.13.1-0.ael7b is needed by docker-1.13.1-0.ael7b.ppc64le
        libcgroup is needed by docker-1.13.1-0.ael7b.ppc64le
        libtool-ltdl is needed by docker-1.13.1-0.ael7b.ppc64le

#yum install libtool-ltdl
#yum install policycoreutils-python
#rpm -Uvh libcgroup-0.41-8.el7.ppc64le.rpm
#wget ftp://rpmfind.net/linux/fedora-secondary/releases/24/Everything/ppc64le/os/Packages/d/docker-selinux-1.10.3-9.git667d6d1.fc24.ppc64le.rpm
#wget ftp://195.220.108.108/linux/fedora-secondary/development/rawhide/Everything/ppc64le/os/Packages/p/policycoreutils-python-utils-2.6-5.fc27.ppc64le.rpm
#wget ftp://195.220.108.108/linux/fedora-secondary/development/rawhide/Everything/ppc64le/os/Packages/s/selinux-policy-minimum-3.13.1-263.fc27.noarch.rpm

#rpm -Uvh policycoreutils-python-utils-2.6-5.fc27.ppc64le.rpm --nodeps
#rpm -Uvh selinux-policy-minimum-3.13.1-263.fc27.noarch.rpm --nodeps
warning: selinux-policy-minimum-3.13.1-263.fc27.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f5282ee4: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:selinux-policy-minimum-3.13.1-263################################# [100%]
/var/tmp/rpm-tmp.UGMgdb: /usr/sbin/semanage: /usr/bin/python3: bad interpreter: No such file or directory
/usr/sbin/semodule: SELinux policy is not managed or store cannot be accessed.# rpm -Uvh docker-selinux-1.10.3-9.git667d6d1.fc24.ppc64le.rpm
warning: docker-selinux-1.10.3-9.git667d6d1.fc24.ppc64le.rpm: Header V3 RSA/SHA1 Signature, key ID 030d5aed: NOKEY
Preparing...                          ################################# [100%]
        package docker-selinux-2:1.10.3-9.git667d6d1.fc24.ppc64le is already installed

#rpm -Uvh docker-1.13.1-0.ael7b.ppc64le.rpm --nodeps
Preparing...                          ################################# [100%]
Updating / installing...
   1:docker-1.13.1-0.ael7b            ################################# [100%]


# service docker start
Redirecting to /bin/systemctl start  docker.service
# service docker status
Redirecting to /bin/systemctl status  docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2017-07-13 22:16:17 EDT; 1min 1s ago
     Docs: https://docs.docker.com
 Main PID: 21107 (dockerd)
   Memory: 25.6M
   CGroup: /system.slice/docker.service
           ├─21107 /usr/bin/dockerd
           └─21110 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interv...

Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.708588000-04:00" level=inf...ds"
Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.709532000-04:00" level=war...nd"
Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.710001000-04:00" level=inf...t."
Jul 13 22:16:16 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:16.729999000-04:00" level=inf...ue"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.166484000-04:00" level=inf...ss"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.530810000-04:00" level=inf...e."
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.540873000-04:00" level=inf...on"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.540978000-04:00" level=inf...3.1
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com dockerd[21107]: time="2017-07-13T22:16:17.581564000-04:00" level=inf...ck"
Jul 13 22:16:17 sys-88228.dal-ebis.ihost.com systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.


[root@sys-88228 docker-ppc64el]# docker -v
Docker version 1.13.1, build fb79528


2017년 5월 25일 목요일

Ubuntu 에서 kdump 사용하기 (ppc64le)

아래 Ubuntu 사이트에서 가이드하는대로 따라 하다 보면, 간혹 사용 가능한 상태가 아닌 경우가 있습니다. 이때 kdump 설정하는 방법에 대해 posting 합니다.

Kernel dump가 제대로 enabled 되어있는지 확인하는 Verification 단계

1. crashkernel 파라미터 확인하기

linux-crashdump 패키지 설치 후에는, Reboot 을 해주어야 kdump-tools 가 활성화된다고 합니다. Reboot 을 수행하고 나서 /proc/cmdline을 확인해보면 crashkernel이 설정된 것을 볼 수 있습니다.

root@sys-87396:/etc/default# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M
 

* 간혹 crashkernel 파라미터가 보이지 않는 경우가 있습니다. 이때의 해결방법입니다.

root@sys-87397:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet => crashkernel 파라미터가 없음
root@sys-87397:/sys/kernel# cat /sys/kernel/kexec_crash_loaded
=> 1로 셋팅되어야 부트 시 crashkernel이 로드됨

kernel crash가 한번이라도 발생하게 되면, 이후에는 자동으로 crashkernel parameter가 붙게 됩니다. 그러나 초기 kdump 구성 시에 이렇게 crashkernel parameter가 안보이는 경우, 아래와 같이 수행합니다.

u0017496@sys-87481:~$ cat /etc/default/kexec
# Defaults for kexec initscript
# sourced by /etc/init.d/kexec and /etc/init.d/kexec-load

# Load a kexec kernel (true/false)
LOAD_KEXEC=true

# Kernel and initrd image
KERNEL_IMAGE="/boot/vmlinux"
INITRD="/boot/initrd.img"

# If empty, use current /proc/cmdline
APPEND=""

# Load the default kernel from grub config (true/false)
USE_GRUB_CONFIG=true ==> 이 부분은 default=false로 되어 있으나, true로 바꿉니다.

crashkernel에 대한 값은 아래 경로의 kexec-tools.cfg 파일에 정의되어 있습니다. 사이즈를 변경하고 싶다면, 해당 파일을 수정하면 됩니다. 관련 포멧은 링크를 참조하세요.

u0017496@sys-87481:~$ cat /etc/default/grub.d/kexec-tools.cfg
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=384M-:128M"

u0017496@sys-87481:~$ sudo update-grub
u0017496@sys-87481:~$ sudo reboot

리부팅 후,

Last login: Mon May 29 04:11:02 2017 from 172.29.96.152
u0017496@sys-87481:~$ cat /proc/cmdline
root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M => 파라미터 설정되었습니다.

u0017496@sys-87481:~$ kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    ready to kdump => 정상 작동 상태

kexec command:
  /sbin/kexec -p --command-line="root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet  irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz
  
 

2. Kernel에서 kdump를 위해 memory reservation 했는지 확인하기

root@sys-87396:/etc/default# dmesg | grep -i crash
[    0.000000] Reserving 128MB of memory at 128MB for crashkernel (System RAM: 2048MB)
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic
 root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M

3. kdump config를 확인해서 현재 사용 가능한 상태인지 확인하기

root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: broken symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    Not ready to kdump ==> 현재 사용 불가능한 상태입니다. 위에 링크도 잘못걸려 있으므로, 해당 링크를 재설정합니다.

kexec command:
  no kexec command recorded
 
내용을 확인해보면, /var/lib/kdump/initrd.img 에 잘못된 symbolic link가 걸려있습니다. 
 
root@sys-87396:/etc/default# ls -al /var/lib/kdump/
total 9672
drwxr-xr-x  3 root root    4096 May 26 00:42 .
drwxr-xr-x 44 root root    4096 May 25 21:35 ..
drwxr-xr-x  5 root root    4096 Mar 17 17:28 initramfs-tools
lrwxrwxrwx  1 root root      42 May 26 00:42 initrd.img -> /var/lib/kdump/initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root 9889523 May 25 21:35 initrd.img-4.4.0-66-generic
lrwxrwxrwx  1 root root      30 May 25 21:45 vmlinuz -> /boot/vmlinux-4.4.0-78-generic
 
/var/lib/kdump 경로를 확인해보니, symbolic link로 걸어놓았던
 initrd.img-4.4.0-78-generic 파일은 없고, 대신 initrd.img-4.4.0-66-generic 파일만 있습니다.
/boot 에 들어가보면 initrd.img-4.4.0-78-generic이 있습니다. copy 해서 가져다 놓습니다.

root@sys-87396:/etc/default# ls -al /boot
total 117680
drwxr-xr-x  3 root root     4096 May 22 11:36 .
drwxr-xr-x 22 root root     4096 May 25 21:45 ..
-rw-r--r--  1 root root  1138911 Mar  3 11:03 abi-4.4.0-66-generic
-rw-r--r--  1 root root  1139503 Apr 27 12:00 abi-4.4.0-78-generic
-rw-r--r--  1 root root   173579 Mar  3 11:03 config-4.4.0-66-generic
-rw-r--r--  1 root root   173546 Apr 27 12:00 config-4.4.0-78-generic
drwxr-xr-x  5 root root     4096 May 25 21:35 grub
lrwxrwxrwx  1 root root       27 May 21 23:14 initrd.img -> initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root 32026385 May 22 02:34 initrd.img-4.4.0-66-generic
-rw-r--r--  1 root root 32035729 May 22 02:43 initrd.img-4.4.0-78-generic
lrwxrwxrwx  1 root root       27 Mar 23 14:04 initrd.img.old -> initrd.img-4.4.0-66-generic
-rw-------  1 root root  3520955 Mar  3 11:03 System.map-4.4.0-66-generic
-rw-------  1 root root  3520298 Apr 27 12:00 System.map-4.4.0-78-generic
lrwxrwxrwx  1 root root       24 May 21 23:14 vmlinux -> vmlinux-4.4.0-78-generic
-rw-------  1 root root 23370856 Mar  3 11:03 vmlinux-4.4.0-66-generic
-rw-------  1 root root 23370856 Apr 27 12:00 vmlinux-4.4.0-78-generic
lrwxrwxrwx  1 root root       24 Mar 23 14:04 vmlinux.old -> vmlinux-4.4.0-66-generic
root@sys-87396:/etc/default# cp /boot/initrd.img-4.4.0-78-generic /var/lib/kdump/
root@sys-87396:/etc/default# ls -al /var/lib/kdump
total 40960
drwxr-xr-x  3 root root     4096 May 26 01:07 .
drwxr-xr-x 44 root root     4096 May 25 21:35 ..
drwxr-xr-x  5 root root     4096 Mar 17 17:28 initramfs-tools
lrwxrwxrwx  1 root root       42 May 26 01:05 initrd.img -> /var/lib/kdump/initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root  9889523 May 25 21:35 initrd.img-4.4.0-66-generic
-rw-r--r--  1 root root 32035729 May 26 01:07 initrd.img-4.4.0-78-generic
lrwxrwxrwx  1 root root       30 May 25 21:45 vmlinuz -> /boot/vmlinux-4.4.0-78-generic


kdump-config 상태 확인합니다.
root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic => 링크는 제대로 걸림
 current state:    Not ready to kdump => 아직도 동작 불가

kexec command:
  no kexec command recorded

/var/crash를 살펴보면 vmcore도 기록되지 않은것을 볼수 있습니다.
root@sys-87396:/etc/default# ls /var/crash
root@sys-87396:/etc/default#

다시 커널 정보를 로드합니다.
root@sys-87396:/etc/default# kdump-config load
Modified cmdline:BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service elfcorehdr=156800K
 * loaded kdump kernel

상태를 보니, kdump를 사용할 수 있는준비가 되었습니다.
root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    ready to kdump

kexec command:
  /sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz

덤프가 떨어지는 /var/crash에도 뭔가 생성되었습니다.
root@sys-87396:/etc/default# ls /var/crash
kexec_cmd
 

4. kdump 서비스가 동작중인지 확인

kdump-tools.service가 로드되어 있고, 정상 동작중(Active)인지 확인합니다. 

root@sys-87396:/sys/kernel# service kdump-tools status
● kdump-tools.service - Kernel crash dump capture service
   Loaded: loaded (/lib/systemd/system/kdump-tools.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2017-05-29 07:52:09 EDT; 56min ago
  Process: 2260 ExecStart=/etc/init.d/kdump-tools start (code=exited, status=0/SUCCESS)
 Main PID: 2260 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/kdump-tools.service

May 29 07:52:07 sys-87396 systemd[1]: Starting Kernel crash dump capture service...
May 29 07:52:08 sys-87396 kdump-tools[2260]: Starting kdump-tools: Modified cmdline:root=UUID=2a159e60-be84-4802-9b
May 29 07:52:09 sys-87396 kdump-tools[2260]:  * loaded kdump kernel
May 29 07:52:09 sys-87396 kdump-tools[2426]: /sbin/kexec -p --command-line="root=UUID=2a159e60-be84-4802-9bf1-bdbcf
May 29 07:52:09 sys-87396 kdump-tools[2427]: loaded kdump kernel
May 29 07:52:09 sys-87396 systemd[1]: Started Kernel crash dump capture service.
lines 1-13/13 (END)

만약 위의 상태가 아니라면, 아래 명령어를 수행합니다.
#sudo service kdump-tools load
#sudo service kdump-tools start

kdump가 제대로 동작하는지 강제 kernel panic 일으켜서 확인해보는 방법 (Optional)

SysRQ 매커니즘을 enable 하여 kdump가 실제로 동작하는지 테스트해봅니다. 그러나, 아래 테스트는 선택사항입니다. (Reboot이 필요합니다.)

root@sys-87396:/etc/default# cat /proc/sys/kernel/sysrq
176

위 결과가 0이 아니면 실행 가능한 상태입니다. 만약 0이라면, 아래와 같이 수행해줍니다.
# sudo sysctl -w kernel.sysrq=1

이제 강제장애 상황을 일으켜봅니다. 연결중인 네트워크 연결은 끊어질 것이고, Core dump 생성 후 reboot 진행됩니다.
root@sys-87396:/etc/default# echo c > /proc/sysrq-trigger

위 Command 수행 시 Console 환경에서 수행하면, 아래와 같은 진행 절차를 보게 됩니다. 저는 텔넷 환경으로 수행하여 보진 못했습니다.

시스템 재부팅 후, /var/crash에 새로 생성된 덤프를 확인해봅니다.

root@sys-87396:~# ls /var/crash
201705260522  kexec_cmd  linux-image-4.4.0-78-generic-201705260522.crash