2017년 6월 23일 금요일

이미 설치된 Miniconda의 설치 directory 바꾸기

System admin이 Miniconda를 설치했는데, 별 생각없이 설치하여 root user의 home directory에 설치하는 바람에 /root/miniconda3에 설치된 경우 어떻게 해야 할까요 ?

결론부터 말씀드리면, 원하는 directory로 copy한 뒤 ownership을 바꿔주고, 그리고나서 약 100여개의 file들 속의 기존 directory 이름을 바꿔주면 됩니다.

원래의 정답은 아래의 Continuum 홈페이지에 나왔습니다.

https://docs.continuum.io/anaconda/user-guide/tasks/move-directory

클릭하기 귀찮으신 분을 위해 아래에 copy & paste 해드리면 다음과 같습니다.

To move Anaconda from one directory to another:

1. Delete it from the old directory.
2. Go to the new directory and install it there following the Anaconda installation instructions.

즉, 지우고 새로 설치하라는 것입니다.   Anaconda 또는 Miniconda를 한번 설치하고 나면, 그 directory만 새로 옮기는 것은 허용되지 않는다고 합니다.

그러나 Continuum의 그런 정책에 대해서는 많은 불만들이 있을 수 있습니다.  많은 기업들이 보안 등의 문제로 서버를 internet access를 허용하지 않습니다.  따라서 서버를 도입할 때, 먼저 회사 외부의 internet이 자유롭게 access되는 곳에서 OS와 Miniconda를 설치한 뒤,  mecab-python3처럼 Miniconda에는 포함되어 있지 않아 internet에서 download 받아야 하는 python package 등을 다 설치한 뒤 회사에 반입하는 경우가 꽤 많습니다.   그런데 그 설치 directory를 /root/miniconda3에 해버리면 다른 일반 유저들이 conda 명령들을 수행할 때 아래와 같은 error가 나버립니다.

u0017496@sys-87926:~$ /root/miniconda3/bin/conda list
-bash: /root/miniconda3/bin/conda: Permission denied

그래서 /root와 같은 민감한 directory를 피해서, /opt 혹은 /usr/local과 같은 곳으로 이 directory를 copy한 뒤 ownership만 변경해주면 좋겠습니다만, 아래와 같이 그것도 안 됩니다.

먼저 /root/miniconda3를 /usr/local/miniconda3로 copy 하고...

root@sys-87926:~# pwd
/root

root@sys-87926:~# cp -r miniconda3 /usr/local/

ownership을 변경해준 뒤

root@sys-87926:~# chown -R u0017496:u0017496 /usr/local/miniconda3

이제 u0017496 사용자로 login해서 환경 변수를 맞춰주고

u0017496@sys-87926:~$ vi ./.bashrc
...
export PATH=/usr/local/miniconda3/bin:$PATH
export PYTHONPATH=/usr/local/miniconda3/lib/python3.6/site-packages
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el

u0017496@sys-87926:~$ . ./.bashrc

u0017496@sys-87926:~$ which conda
/usr/local/miniconda3/bin/conda

간단한 conda 명령을 날려보면 다음과 같이 error가 납니다.

u0017496@sys-87926:~$ conda list
-bash: /usr/local/miniconda3/bin/conda: /root/miniconda3/bin/python: bad interpreter: Permission denied

이는 보시다시피 상당히 많은 file들에 원래의 directory name, 즉 /root/miniconda3이 박혀 있기 때문입니다.  가령 conda라는 명령 자체도 아래와 같이 python script이며, 그 속에 원래 설치 directory의 이름이 박혀 있습니다.

u0017496@sys-87926:~$ vi /usr/local/miniconda3/bin/conda
#!/root/miniconda3/bin/python
if __name__ == '__main__':
    import sys
    import conda.cli

    sys.exit(conda.cli.main())


이에 대해서 아래 URL에 몇몇 user들이 토론을 벌인 바 있습니다.  실은 저 위의 Continuum 홈페이지에 '지우고 새로 설치하라'라고 하는 문서도 아래 github 토론에서 이야기가 나왔다가  Continuum 소속의 개발자가 사람들에게 공표하는 의미로 만든 것입니다.

https://github.com/ContinuumIO/anaconda-issues/issues/270

하지만 꼭 불가능한 것은 아닙니다.  위 github 토론에서도 (결론을 내지는 않았지만) '그냥 그 수많은 file들의 directory name들을 다 바꿔버리면 될 거다'라는 해결책을 제시한 개발자도 있었습니다.

제가 해보니 총 113개의 file만 고치면 되고, 실제로 sed 명령으로 고치면 꽤 쉽게 고칠 수 있으며, 결과적으로 잘 됩니다.

위에서처럼 cp와 chown을 해주고 환경변수 PATH 및 PYTHONPATH도 다 맞춰준 상태에서, 다음과 같이 예전 directory 이름, 즉 /root/miniconda3를 포함하는 text file들을 찾아 list를 만듭니다.  아래에서 find의 -type f는 (directory는 빼고) 파일만 찾으라는 것이고, grep의 -Iq (대문자 아이와 소문자 큐입니다)는 text file이 아닌 것은 즉각 무시하라는 뜻입니다.

u0017496@sys-87926:~$ for i in `find /usr/local/miniconda3 -type f -exec grep -Iq . {} \; -print`
> do
> grep "root\/miniconda3" $i
> if [[ $? -eq 0 ]]
> then
> echo $i >> matchlist.txt
> fi
> done

이 matchlist라는 새로 생성된 파일 속에는 아래처럼 /root/minconda3라는 string을 포함한 text file들의 목록이 들어 있습니다.

u0017496@sys-87926:~$ tail matchlist.txt
/usr/local/miniconda3/bin/idle3.6
/usr/local/miniconda3/bin/route53
/usr/local/miniconda3/bin/python3.6m-config
/usr/local/miniconda3/bin/cq
/usr/local/miniconda3/bin/conda
/usr/local/miniconda3/bin/instance_events
/usr/local/miniconda3/bin/freetype-config
/usr/local/miniconda3/bin/conda-env
/usr/local/miniconda3/bin/launch_instance
/usr/local/miniconda3/include/openssl/opensslconf.h

이제 이 파일들의 *.org(원본 보관용)과 *.new(임시작업용)을 복사해두고

u0017496@sys-87926:~$ for i in `cat matchlist.txt`
> do
> cp $i ${i}.org
> cp $i ${i}.new
> done

아래와 같이 sed 명령으로 "root/miniconda3"를 "usr/local/miniconda3"로 교체하여 임시작업용 *.new에 넣습니다.  그러고 난 뒤 원본을 이 *.new로 바꿔줍니다.

u0017496@sys-87926:~$ for i in `cat matchlist.txt`
> do
> sed 's/root\/miniconda3/usr\/local\/miniconda3/g' $i > ${i}.new
> cp ${i}.new $i
> done

임시작업용 파일들인 *.new는 나중에 삭제하셔도 됩니다.

보시면 아래와 같이 /root/miniconda가 /usr/local/miniconda3로 바뀐 것을 보실 수 있습니다.

u0017496@sys-87926:~$ grep usr\/local /usr/local/miniconda3/bin/pyvenv-3.6
#!/usr/local/miniconda3/bin/python

이제 conda 명령이 제대로 수행되는지 테스트 해보겠습니다.  보시다시피 잘 됩니다.

u0017496@sys-87926:~$ which conda
/usr/local/miniconda3/bin/conda

u0017496@sys-87926:~$ conda list
# packages in environment at /usr/local/miniconda3:
#
asn1crypto                0.22.0                   py36_0
bazel                     0.4.5                         0
boto                      2.47.0                    <pip>
bz2file                   0.98                      <pip>
cffi                      1.10.0                   py36_0
conda                     4.3.18                   py36_0
conda-env                 2.6.0                         0
cryptography              1.8.1                    py36_0
cudatoolkit               8.0                           0
cudnn                     6.0.21                        0
cycler                    0.10.0                   py36_0
freetype                  2.5.5                         2
gensim                    2.0.0                     <pip>
idna                      2.5                      py36_0
Keras                     2.0.4                     <pip>
konlpy                    0.4.4                     <pip>
libffi                    3.2.1                         1
libpng                    1.6.27                        0
libprotobuf               3.2.0                         0
matplotlib                2.0.2               np112py36_0
numpy                     1.13.0                    <pip>
numpy                     1.12.1                   py36_0
openblas                  0.2.19                        0
openssl                   1.0.2k                        2
packaging                 16.8                     py36_0
pip                       9.0.1                    py36_1
protobuf                  3.2.0                    py36_0
pyasn1                    0.2.3                    py36_0
pycosat                   0.6.2                    py36_0
pycparser                 2.17                     py36_0
pyopenssl                 17.0.0                   py36_0
pyparsing                 2.1.4                    py36_0
python                    3.6.1                         2
python-dateutil           2.6.0                    py36_0
pytz                      2017.2                   py36_0
PyYAML                    3.12                      <pip>
requests                  2.14.2                   py36_0
ruamel_yaml               0.11.14                  py36_1
scikit-learn              0.18.1              np112py36_1
scipy                     0.19.0                    <pip>
scipy                     0.19.0              np112py36_0
setuptools                27.2.0                   py36_0
six                       1.10.0                   py36_0
smart-open                1.5.3                     <pip>
sqlite                    3.13.0                        0
tensorflow                1.1.0               np112py36_0
tensorflow-gpu            1.1.0               np112py36_0
Theano                    0.9.0                     <pip>
werkzeug                  0.12.2                   py36_0
wheel                     0.29.0                   py36_0
xz                        5.2.2                         1
yaml                      0.1.6                         0
zlib                      1.2.8                         3


새로 package를 install하는 것도 잘 됩니다.

u0017496@sys-87926:~$ conda install flask
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /usr/local/miniconda3:

The following NEW packages will be INSTALLED:

    click:        6.7-py36_0
    flask:        0.12.2-py36_0
    itsdangerous: 0.24-py36_0
    jinja2:       2.9.6-py36_0
    markupsafe:   0.23-py36_2

Proceed ([y]/n)? y

click-6.7-py36 100% |######################################| Time: 0:00:00   7.96 MB/s
itsdangerous-0 100% |######################################| Time: 0:00:00  13.50 MB/s
markupsafe-0.2 100% |######################################| Time: 0:00:00  19.45 MB/s
jinja2-2.9.6-p 100% |######################################| Time: 0:00:00   8.85 MB/s
flask-0.12.2-p 100% |######################################| Time: 0:00:00   8.55 MB/s


뿐만 아니라, 새로 인터넷에서 download 받아 설치하는 것도 잘 됩니다.  (물론 이건 인터넷이 access되는 환경에서만 가능한 테스트입니다.)

u0017496@sys-87926:~$ pip install Jpype1
Collecting Jpype1
  Downloading JPype1-0.6.2.tar.gz (147kB)
    100% |████████████████████████████████| 153kB 2.8MB/s
Building wheels for collected packages: Jpype1
  Running setup.py bdist_wheel for Jpype1 ... done
  Stored in directory: /home/u0017496/.cache/pip/wheels/8e/f3/e6/a1250b8e8d2bd105f4dd21b1dc801dbcf5d815592443bfe741
Successfully built Jpype1
Installing collected packages: Jpype1
Successfully installed Jpype1-0.6.2


KoNLPy를 python에서 import 해보면 잘 되는 것을 보실 수 있습니다.   (이걸 테스트하시려면 위와 같이 Jpype1가 설치되어 있어야 합니다.)

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

u0017496@sys-87926:~$ python
Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 15:31:35)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import *
>>> Kkma()
<konlpy.tag._kkma.Kkma object at 0x3fff97589b38>
>>>

이제 다른 user를 만들어서 이 /usr/local/miniconda를 쓸 수 있는지 보겠습니다.

root@sys-87926:/home/u0017496# adduser newuser

새로 만들어진 newuser로 login 한 뒤, PATH를 맞춰줍니다.

newuser@sys-87926:~$ vi .bashrc
export PATH=/usr/local/miniconda3/bin:$PATH
export PYTHONPATH=/usr/local/miniconda3/lib/python3.6/site-packages
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el

newuser@sys-87926:~$ . ./.bashrc

보시다시피 다 잘 됩니다.

newuser@sys-87926:~$ conda list
# packages in environment at /usr/local/miniconda3:
#
asn1crypto                0.22.0                   py36_0
bazel                     0.4.5                         0
boto                      2.47.0                    <pip>
bz2file                   0.98                      <pip>
...
yaml                      0.1.6                         0
zlib                      1.2.8                         3


newuser@sys-87926:~$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
newuser@sys-87926:~$ python
Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 15:31:35)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import *
>>> Kkma()
<konlpy.tag._kkma.Kkma object at 0x3fffa4e49780>
>>>

/usr/local/miniconda3의 permission이 아래처럼 755로 되어 있으므로, 아래처럼 newuser라는 새로운 사용자는 conda uninstall이나 install 같은 것은 할 수 없습니다.  만약 다른 사용자들도 자유롭게 install/uninstall을 하기를 원하신다면 그에 맞춰 permission을 조정해주셔야 합니다.  그러나 되도록 그러지 않는 편이 낫겠지요.

u0017496@sys-87926:~$ ls -la /usr/local/miniconda3
total 76
drwxr-xr-x  11 u0017496 u0017496  4096 Jun 23 02:55 .
drwxr-xr-x  13 root     root      4096 Jun 22 22:35 ..
drwxr-xr-x   2 u0017496 u0017496  4096 Jun 23 02:20 bin
drwxr-xr-x   2 u0017496 u0017496 12288 Jun 23 02:55 conda-meta
drwxr-xr-x   3 u0017496 u0017496  4096 Jun 23 02:21 envs
drwxr-xr-x   3 u0017496 u0017496  4096 Jun 22 22:43 etc
drwxr-xr-x   8 u0017496 u0017496  4096 Jun 22 22:40 include
drwxr-xr-x   6 u0017496 u0017496  4096 Jun 23 02:12 lib
-rw-r--r--   1 u0017496 u0017496  3699 Jun 22 22:35 LICENSE.txt
drwxr-xr-x 238 u0017496 u0017496 24576 Jun 23 02:23 pkgs
drwxr-xr-x   4 u0017496 u0017496  4096 Jun 22 22:43 share
drwxr-xr-x   3 u0017496 u0017496  4096 Jun 22 22:43 ssl


newuser@sys-87926:~$ conda uninstall matplotlib

CondaIOError: Missing write permissions in: /usr/local/miniconda3
#
# You don't appear to have the necessary permissions to remove packages
# into the install area '/usr/local/miniconda3'.
# However you can clone this environment into your home directory and
# then make changes to it.
# This may be done using the command:
#
# $ conda create -n my_root --clone="/usr/local/miniconda3"


** 이 작업 및 test 결과는 아래의 Continuum github에도 comment로 올렸습니다.

https://github.com/ContinuumIO/anaconda-issues/issues/270

2017년 6월 14일 수요일

Minsky 서버의 Ubuntu 16.04 ppc64le에 JDK 7 설치하기

ppc64le 아키텍처인 Minsky 서버는 Ubuntu 16.04 (또는 Redhat 7.3) 이후부터 지원됩니다.  그러다보니 Ubuntu 16.04에 포함된 openJDK8을 주로 사용하는데, 간혹 JDK7을 필요로 하는 경우도 있을 수 있습니다.   이때는 아래와 같이 설치하여 사용하실 수 있는데, 크게 2가지 방법, 즉 IBM java SDK 7을 설치하거나 또는 openJDK7을 설치하는 방법이 있습니다.   둘 중 원하시는 것을 선택하시면 됩니다.

1) IBM SDK 7 설치

아래 URL에서 ibm-java-ppc64le-sdk-7.1-4.5.bin 을 다운로드 받습니다.   Minsky는 POWER8의 big endian이 아닌, x86과 같은 little endian을 지원하므로 'Linux on Power Systems 64-bit'가 아닌 'Linux on Power Systems 64-bit LE'을 택해야 합니다.

https://developer.ibm.com/javasdk/downloads/sdk7r1/

Linux on Power Systems 64-bit LE
Installable package (InstallAnywhere as root)
(File name: ibm-java-ppc64le-sdk-7.1-4.5.bin, Size: 128MB)


u0017496@sys-87548:~$ chmod a+x ibm-java-ppc64le-sdk-7.1-4.5.bin

u0017496@sys-87548:~$ sudo ./ibm-java-ppc64le-sdk-7.1-4.5.bin
...
===============================================================================
Installation Complete
---------------------

Congratulations. IBM 64-bit SDK for Linux, Java Technology Edition, Version 7.1
has been successfully installed to:

   /opt/ibm/java-ppc64le-71

PRESS <ENTER> TO EXIT THE INSTALLER:

설치 directory가 아래와 같으므로, user profile의 PATH의 맨 앞에 다음과 같이 설정해서 쓰시면 됩니다.

u0017496@sys-87548:~$ export PATH=/opt/ibm/java-ppc64le-71/bin:$PATH

u0017496@sys-87548:~$ which java
/opt/ibm/java-ppc64le-71/bin/java

u0017496@sys-87548:~$ java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build pxl6470_27sr4fp5-20170421_02(SR4 FP5))
IBM J9 VM (build 2.7, JRE 1.7.0 Linux ppc64le-64 Compressed References 20170406_343211 (JIT enabled, AOT enabled)
J9VM - R27_Java727_SR4_20170406_2107_B343211
JIT  - tr.r13.java_20170406_343211
GC   - R27_Java727_SR4_20170406_2107_B343211_CMPRSS
J9CL - 20170406_343211)
JCL - 20170420_01 based on Oracle jdk7u141-b11



2) openJDK 7 설치

Ubuntu 16에는 JDK7이 지원되지 않습니다만, 아래와 같이 PPA repository에서 제공되기는 합니다.  다만, 이 설치 과정 중에 Oracle installer를 download 받아서 그걸 이용하는 과정이 있는데, ppc64le는 Oracle과 친하지 않아 그 과정은 실패합니다.  그러나 그와는 무관하게 JDK7은 설치되고 사용할 수 있습니다.

u0017496@sys-87548:~$ sudo add-apt-repository ppa:openjdk-r/ppa

 More info: https://launchpad.net/~openjdk-r/+archive/ubuntu/ppa
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpgyngeisu/secring.gpg' created
gpg: keyring `/tmp/tmpgyngeisu/pubring.gpg' created
gpg: requesting key 86F44E2A from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpgyngeisu/trustdb.gpg: trustdb created
gpg: key 86F44E2A: public key "Launchpad OpenJDK builds (all archs)" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK
u0017496@sys-87548:~$ sudo apt-get update

u0017496@sys-87548:~$ apt-cache pkgnames | grep openjdk-7
openjdk-7-jre-zero
openjdk-7-jre-lib
openjdk-7-source
oracle-jdk7-installer
openjdk-7-demo
openjdk-7-jre-headless
openjdk-7-dbg
openjdk-7-doc
openjdk-7-jdk
openjdk-7-jre

u0017496@sys-87548:~$ sudo apt-get install openjdk-7-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  at-spi2-core dbus-x11 gconf-service gconf-service-backend gconf2 gconf2-common libatk-bridge2.0-0
  libatk-wrapper-java libatk-wrapper-java-jni libatspi2.0-0 libavahi-glib1 libbonobo2-0
  libbonobo2-common libcanberra0 libgconf-2-4 libgnome-2-0 libgnome2-common libgnomevfs2-0
  libgnomevfs2-common liborbit-2-0 libsctp1 libtdb1 libvorbisfile3 libxaw7 libxcb-shape0 libxft2
  libxmu6 libxpm4 libxv1 libxxf86dga1 openjdk-7-jre openjdk-7-jre-headless sound-theme-freedesktop
  x11-utils
Suggested packages:
  gconf-defaults-service libbonobo2-bin libcanberra-gtk0 libcanberra-pulse desktop-base
  libgnomevfs2-bin libgnomevfs2-extra gamin | fam gnome-mime-data lksctp-tools openjdk-7-demo
  openjdk-7-source visualvm libnss-mdns sun-java6-fonts fonts-ipafont-gothic fonts-ipafont-mincho
  ttf-wqy-microhei | ttf-wqy-zenhei fonts-indic mesa-utils
The following NEW packages will be installed:
  at-spi2-core dbus-x11 gconf-service gconf-service-backend gconf2 gconf2-common libatk-bridge2.0-0
  libatk-wrapper-java libatk-wrapper-java-jni libatspi2.0-0 libavahi-glib1 libbonobo2-0
  libbonobo2-common libcanberra0 libgconf-2-4 libgnome-2-0 libgnome2-common libgnomevfs2-0
  libgnomevfs2-common liborbit-2-0 libsctp1 libtdb1 libvorbisfile3 libxaw7 libxcb-shape0 libxft2
  libxmu6 libxpm4 libxv1 libxxf86dga1 openjdk-7-jdk openjdk-7-jre openjdk-7-jre-headless
  sound-theme-freedesktop x11-utils
0 upgraded, 35 newly installed, 0 to remove and 39 not upgraded.
1 not fully installed or removed.
Need to get 54.6 MB of archives.
After this operation, 91.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://ports.ubuntu.com/ubuntu-ports xenial/main ppc64el libbonobo2-common all 2.32.1-3 [34.7 kB]
Get:2 http://ppa.launchpad.net/openjdk-r/ppa/ubuntu xenial/main ppc64el openjdk-7-jre-headless ppc64el 7u95-2.6.4-3 [38.6 MB]
...
Processing triggers for hicolor-icon-theme (0.15-0ubuntu1) ...
Processing triggers for mime-support (3.59ubuntu1) ...
Setting up oracle-java7-installer (7u80+7u60arm-0~webupd8~1) ...
Please report to author unsupported platform 'ppc64le'.
Proceeding without web browser plugin support
Please report to author unsupported platform 'ppc64le'.
Proceeding without web browser plugin support
...
AuthParam=1497491097_5726d7e0ebd89a8675567ef8793c3443 [following]
--2017-06-14 21:42:57--  http://download.oracle.com/otn-pub/java/jdk/7u60-b19/jdk-7u60-linux-.tar.gz?AuthParam=1497491097_5726d7e0ebd89a8675567ef8793c3443
Connecting to download.oracle.com (download.oracle.com)|65.158.47.80|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2017-06-14 21:42:57 ERROR 404: Not Found.

download failed
Oracle JDK 7 is NOT installed.
...
Setting up gconf2 (3.2.6-3ubuntu6) ...
Setting up libgnomevfs2-common (1:2.24.4-6.1ubuntu1) ...
Setting up libgnomevfs2-0:ppc64el (1:2.24.4-6.1ubuntu1) ...
Setting up libgnome2-common (2.32.1-5ubuntu1) ...
Setting up libgnome-2-0:ppc64el (2.32.1-5ubuntu1) ...
Processing triggers for libc-bin (2.23-0ubuntu7) ...
Errors were encountered while processing:
 oracle-java7-installer
E: Sub-process /usr/bin/dpkg returned an error code (1)

그러나 이는 oracle-java7-installer의 error일 뿐, JDK 7 자체는 설치가 된 것이며 사용 가능합니다.

u0017496@sys-87548:~$ dpkg -l | grep jdk-7
ii  openjdk-7-demo                       7u95-2.6.4-3                               ppc64el      Java runtime based on OpenJDK (demos and examples)
ii  openjdk-7-jdk:ppc64el                7u95-2.6.4-3                               ppc64el      OpenJDK Development Kit (JDK)
ii  openjdk-7-jre:ppc64el                7u95-2.6.4-3                               ppc64el      OpenJDK Java runtime, using Hotspot JIT
ii  openjdk-7-jre-headless:ppc64el       7u95-2.6.4-3                               ppc64el      OpenJDK Java runtime, using Hotspot JIT (headless)

다음과 같이 JDK 명령어들도 잘 설치된 것을 보실 수 있습니다.

u0017496@sys-87548:~$ dpkg -L openjdk-7-jdk | grep bin
/usr/lib/jvm/java-7-openjdk-ppc64el/bin
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/serialver
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/native2ascii
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jps
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/extcheck
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/javadoc
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jcmd
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jstatd
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jstack
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jsadebugd
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jarsigner
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/javah
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jmap
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/xjc
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jdb
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/javac
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jstat
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/idlj
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/wsimport
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jinfo
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/javap
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/appletviewer
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/rmic
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/schemagen
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jhat
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/wsgen
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jrunscript
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jar
/usr/lib/jvm/java-7-openjdk-ppc64el/bin/jconsole

이 JDK7을 이용하려면 위의 IBM java SDK처럼 PATH 환경 변수를 조정하여 사용할 수도 있고, 이건 openjdk이므로 'update-alternatives --config java' 명령으로 아래처럼 link를 바꿔줄 수도 있습니다.

u0017496@sys-87548:~$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

u0017496@sys-87548:~$ sudo update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                              Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-openjdk-ppc64el/jre/bin/java   1081      auto mode
  1            /usr/lib/jvm/java-7-openjdk-ppc64el/jre/bin/java   1071      manual mode
  2            /usr/lib/jvm/java-8-openjdk-ppc64el/jre/bin/java   1081      manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-7-openjdk-ppc64el/jre/bin/java to provide /usr/bin/java (java) in manual mode

위에서처럼 1번을 택해서 JDK8 대신 JDK7을 택한 뒤, java 명령을 내리면 아래처럼 버전 7이 link되어 있음을 확인할 수 있습니다.

u0017496@sys-87548:~$ java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)



Linux kernel update 이후 SpectrumScale mount가 안되는 문제의 해결 - mmbuildgpl


보안 패치 등의 적용 등으로 인해 원했든 원하지 않았든 linux kernel이 update되는 수가 있습니다.  그 뒤에 SpectrumScale (GPFS)가 mount가 되지 않는 경우가 있습니다.  좀더 정확하게 말하자면 GPFS daemon이 살아나지 못하는 경우지요.

결론부터 이야기하면 다음과 같이 해당 서버에서 root 권한으로 1줄의 명령을 수행하고 GPFS daemon을 restart 하면 해결됩니다.

# /usr/lpp/mmfs/bin/mmbuildgpl

설명은 이렇습니다.

- GPFS는 여러 node에 걸쳐 동시에 mount되고 read/write할 수 있는 병렬파일시스템이기 때문에, 일반 파일시스템과는 달리 linux kernel에 밀접히 연관되어 있습니다.
- UNIX OS인 IBM AIX에서는 위와 같은 절차가 필요없으나, Linux OS에서는 open source로 되어 있는 linux kernel이 바뀔 때마다 그와 연동하기 위해 GPFS의 일부 module(portability layer)도 새로 compile되어야 합니다.
- 원래 이 작업은 몇가지 과정을 거치는 좀더 복잡한 작업이었으나, IBM에서 위와 같이 mmbuildgpl 명령 하나만으로 그 과정들이 모두 수행되도록 shell script를 작성한 것입니다.
- 위 작업을 수행하신 뒤, 해당 node에서 mmshutdown 이후 mmstartup으로 GPFS daemon만 restart 해주시면 GPFS가 다시 잘 mount 됩니다.

이 상황의 재현 및 해결의 test를 위해 먼저, 1대의 POWER8 Ubuntu 서버(sys-87549)를 GPFS server로 삼고, 나머지 1대(sys-87576)를 network을 통해 그 GPFS를 mount하는 GPFS client로 삼겠습니다.

먼저, SpectrumScale (GPFS)을 설치합니다.  tgz 파일을 풀면 다음과 같이 self-extracting 파일이 나옵니다.

root@sys-87549:/home/u0017496# tar -zxvf SpectrumScaleStd421Pwr8le.tgz
Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install
README

이걸 수행해주면 Redhat용 rpm과 Ubuntu용 deb 파일들이 /usr/lpp/mmfs/4.2.1.0에 복사됩니다.

root@sys-87549:/home/u0017496# ./Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install

Extracting License Acceptance Process Tool to /usr/lpp/mmfs/4.2.1.0 ...
tail -n +563 ./Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install | tar -C /usr/lpp/mmfs/4.2.1.0 -xvz --exclude=installer --exclude=*_rpms --exclude=*rpm  --exclude=*tgz --exclude=*deb 1> /dev/null

Installing JRE ...
tail -n +563 ./Spectrum_Scale_Standard-4.2.1.0-ppc64LE-Linux-install | tar -C /usr/lpp/mmfs/4.2.1.0 --wildcards -xvz  ibm-java*tgz 1> /dev/null
tar -C /usr/lpp/mmfs/4.2.1.0/ -xzf /usr/lpp/mmfs/4.2.1.0/ibm-java*tgz
Defaulting to --text-only mode.
...
Product rpms successfully extracted to /usr/lpp/mmfs/4.2.1.0

root@sys-87549:/home/u0017496# cd /usr/lpp/mmfs/4.2.1.0/
root@sys-87549:/usr/lpp/mmfs/4.2.1.0# ls
gpfs.base_4.2.1-0_ppc64el.deb     gpfs.gss.pmcollector-4.2.1-0.el7.ppc64le.rpm
gpfs.base-4.2.1-0.ppc64le.rpm     gpfs.gss.pmcollector-4.2.1-0.sles12.ppc64le.rpm
gpfs.docs_4.2.1-0_all.deb         gpfs.gss.pmsensors-4.2.1-0.el7.ppc64le.rpm
gpfs.docs-4.2.1-0.noarch.rpm      gpfs.gss.pmsensors-4.2.1-0.sles12.ppc64le.rpm
gpfs.ext_4.2.1-0_ppc64el.deb      gpfs.gui-4.2.1-0.noarch.rpm
gpfs.ext-4.2.1-0.ppc64le.rpm      gpfs.java-4.2.1-0.ppc64le.rpm
gpfs.gpl_4.2.1-0_all.deb          gpfs.msg.en-us_4.2.1-0_all.deb
gpfs.gpl-4.2.1-0.noarch.rpm       gpfs.msg.en_US-4.2.1-0.noarch.rpm
gpfs.gskit_8.0.50-57_ppc64el.deb  license
gpfs.gskit-8.0.50-57.ppc64le.rpm  manifest

먼저, GPFS 구성에는 아래 OS package들이 필요하므로 apt-get으로 설치합니다.

root@sys-87549:/usr/lpp/mmfs/4.2.1.0# apt-get install ksh gawk libaio1

그리고나서 아래 명령으로 deb 파일들을 설치합니다.

root@sys-87549:/usr/lpp/mmfs/4.2.1.0# dpkg -i gpfs.base*deb gpfs.gpl*deb gpfs.gskit*deb gpfs.msg*deb gpfs.ext*deb

위 작업을 sys-87576에서 반복합니다.

이제 GPFS cluster를 만듭니다.  Primary server node는 여기서는 sys-87549 1대 뿐이고, client도 sys-87576 1대 뿐입니다.

root@sys-87549:/usr/lpp/mmfs/bin# ./mmcrcluster -N sys-87549:manager-quorum,sys-87576:client -p sys-87549 -r /usr/bin/ssh -R /usr/bin/scp -C test1
mmcrcluster: Performing preliminary node verification ...
mmcrcluster: Processing quorum and other critical nodes ...
...
mmcrcluster: Command successfully completed
mmcrcluster: Warning: Not all nodes have proper GPFS license designations.
    Use the mmchlicense command to designate licenses as needed.
mmcrcluster: Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.


이제 아래와 같이 mmchlicense 명령으로 license accept를 합니다.

root@sys-87549:/usr/lpp/mmfs/bin# mmchlicense server --accept -N sys-87549

root@sys-87576:/usr/lpp/mmfs/bin# mmchlicense client --accept -N sys-87576


이제 다른 쪽 노드에서 mmlscluster를 수행해보면 이미 cluster로 구성된 것이 보입니다.

root@sys-87576:/usr/lpp/mmfs/bin# mmlscluster

GPFS cluster information
========================
  GPFS cluster name:         test1.dal-ebis.ihost.com
  GPFS cluster id:           6484364745360086160
  GPFS UID domain:           test1.dal-ebis.ihost.com
  Remote shell command:      /usr/bin/ssh
  Remote file copy command:  /usr/bin/scp
  Repository type:           CCR

 Node  Daemon node name              IP address      Admin node name               Designation
-----------------------------------------------------------------------------------------------
   1   sys-87549.dal-ebis.ihost.com  172.29.160.222  sys-87549.dal-ebis.ihost.com  quorum-manager
   2   sys-87576.dal-ebis.ihost.com  172.29.160.12   sys-87576.dal-ebis.ihost.com


이제 서버에서 GPFS daemon을 start 합니다.

root@sys-87549:/usr/lpp/mmfs/bin# mmstartup -a
Wed Jun 14 06:57:29 EDT 2017: mmstartup: Starting GPFS ...
sys-87576.dal-ebis.ihost.com:  /tmp/mmfs has been created successfully.

Daemon들이 제대로 올라왔는지 아래 명령으로 확인합니다.  보시다시피 down된 상태입니다.  즉, 뭔가 잘못된 것이지요.

root@sys-87549:/usr/lpp/mmfs/bin# mmgetstate -a

 Node number  Node name        GPFS state
------------------------------------------
       1      sys-87549        down
       2      sys-87576        down

이는 위에서 언급한 GPFS의 portability layer를 build 해주지 않았기 때문입니다.  설치 후, 그리고 향후에도 kernel update 등을 한 이후에는 꼭 아래 명령을 내려  GPFS의 portability layer를 새로 compile 해줘야 합니다.  아래 mmbuildgpl은 shell script로서, 여러 단계의 compile 과정을 자동으로 해줍니다.

root@sys-87549:~# /usr/lpp/mmfs/bin/mmbuildgpl
--------------------------------------------------------
mmbuildgpl: Building GPL module begins at Wed Jun 14 08:57:27 EDT 2017.
--------------------------------------------------------
Verifying Kernel Header...
  kernel version = 40400066 (4.4.0-66-generic, 4.4.0-66)
  module include dir = /lib/modules/4.4.0-66-generic/build/include
  module build dir   = /lib/modules/4.4.0-66-generic/build
  kernel source dir  = /usr/src/linux-4.4.0-66-generic/include
  Found valid kernel header file under /lib/modules/4.4.0-66-generic/build/include
Verifying Compiler...
  make is present at /usr/bin/make
  cpp is present at /usr/bin/cpp
  gcc is present at /usr/bin/gcc
  g++ is present at /usr/bin/g++
  ld is present at /usr/bin/ld
make World ...
make InstallImages ...
--------------------------------------------------------
mmbuildgpl: Building GPL module completed successfully at Wed Jun 14 08:58:12 EDT 2017.
--------------------------------------------------------

다시 GPFS daemon을 start 합니다.

root@sys-87549:/home/u0017496# mmstartup -a
Wed Jun 14 09:02:18 EDT 2017: mmstartup: Starting GPFS ...

잘 올라온 것을 확인할 수 있습니다.

root@sys-87549:~# mmgetstate -a

 Node number  Node name        GPFS state
------------------------------------------
       1      sys-87549        active
       2      sys-87576        active


이제 SpectrumScale server인 sys-87549의 내장 disk로 NSD를 만듭니다.  이 disk는 sys-87549에서만 access되는 내장 disk이지만, 일단 NSD로 만들어지면 네트워크를 통해 client node인 sys-87576에서도 access가 가능해집니다.

root@sys-87549:~# vi /tmp/diskdef.txt
%nsd:
device=/dev/sdb
servers=sys-87549
nsd=nsd1
usage=dataAndMetadata

root@sys-87549:~# mmcrnsd -F /tmp/diskdef.txt
mmcrnsd: Processing disk sdb
mmcrnsd: Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.

SpectrumScale client 노드인 sys-87576에서도 이것이 보이는지 확인합니다.

root@sys-87576:~# mmlsnsd

 File system   Disk name    NSD servers
---------------------------------------------------------------------------
 (free disk)   nsd1         sys-87549.dal-ebis.ihost.com


이제 GPFS filesystem을 만듭니다.

root@sys-87549:~# mmcrfs GPFS1 -F /tmp/diskdef.txt -A yes -T /gpfs1 --version=4.2.1.0

The following disks of GPFS1 will be formatted on node sys-87549:
    nsd1: size 4096 MB
Formatting file system ...
Disks up to size 96 GB can be added to storage pool system.
Creating Inode File
  48 % complete on Wed Jun 14 09:09:18 2017
  97 % complete on Wed Jun 14 09:09:23 2017
 100 % complete on Wed Jun 14 09:09:23 2017
Creating Allocation Maps
Creating Log Files
  78 % complete on Wed Jun 14 09:09:29 2017
 100 % complete on Wed Jun 14 09:09:29 2017
Clearing Inode Allocation Map
Clearing Block Allocation Map
Formatting Allocation Map for storage pool system
Completed creation of file system /dev/GPFS1.
mmcrfs: Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.


root@sys-87549:~# mmlsfs all

File system attributes for /dev/GPFS1:
======================================
flag                value                    description
------------------- ------------------------ -----------------------------------
 -f                 8192                     Minimum fragment size in bytes
 -i                 4096                     Inode size in bytes
 -I                 32768                    Indirect block size in bytes
 -m                 1                        Default number of metadata replicas
 -M                 2                        Maximum number of metadata replicas
 -r                 1                        Default number of data replicas
 -R                 2                        Maximum number of data replicas
 -j                 cluster                  Block allocation type
 -D                 nfs4                     File locking semantics in effect
 -k                 all                      ACL semantics in effect
 -n                 32                       Estimated number of nodes that will mount file system
 -B                 262144                   Block size
 -Q                 none                     Quotas accounting enabled
                    none                     Quotas enforced
                    none                     Default quotas enabled
 --perfileset-quota No                       Per-fileset quota enforcement
 --filesetdf        No                       Fileset df enabled?
 -V                 15.01 (4.2.0.0)          File system version
 --create-time      Wed Jun 14 09:09:15 2017 File system creation time
 -z                 No                       Is DMAPI enabled?
 -L                 4194304                  Logfile size
 -E                 Yes                      Exact mtime mount option
 -S                 No                       Suppress atime mount option
 -K                 whenpossible             Strict replica allocation option
 --fastea           Yes                      Fast external attributes enabled?
 --encryption       No                       Encryption enabled?
 --inode-limit      65792                    Maximum number of inodes
 --log-replicas     0                        Number of log replicas
 --is4KAligned      Yes                      is4KAligned?
 --rapid-repair     Yes                      rapidRepair enabled?
 --write-cache-threshold 0                   HAWC Threshold (max 65536)
 --subblocks-per-full-block 32               Number of subblocks per full block
 -P                 system                   Disk storage pools in file system
 -d                 nsd1                     Disks in file system
 -A                 yes                      Automatic mount option
 -o                 none                     Additional mount options
 -T                 /gpfs1                   Default mount point
 --mount-priority   0                        Mount priority

이제 mount 합니다.  -a 옵션을 쓰면 클러스터 내 모든 노드에서 다 mount 됩니다.

root@sys-87549:~# mmmount all -a
Wed Jun 14 09:11:15 EDT 2017: mmmount: Mounting file systems ...

모든 노드에서 다 mount 되었는지 확인합니다.

root@sys-87549:~# mmlsmount all
File system GPFS1 is mounted on 2 nodes.

Client 노드에 들어가서 mount 되었는지 확인합니다.

root@sys-87576:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           408M   18M  390M   5% /run
/dev/sda2        35G   18G   16G  53% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
GPFS1           4.0G  3.9G  151M  97% /gpfs1

이제 비로소 kernel update 및 GPFS mount 테스트 준비가 끝났습니다.   이제 client인 sys-87576에서 kernel을 update 해보겠습니다.  먼저, 현재 kernel 버전을 확인합니다.

root@sys-87576:~# uname -r
4.4.0-66-generic

이제 kernel update를 합니다.

root@sys-87576:~# apt-get upgrade

완료되면 reboot 합니다.

root@sys-87576:~# shutdown -r now

Reboot 된 이후 kernel 버전 확인합니다.

root@sys-87576:/home/u0017496# uname -r
4.4.0-79-generic

이제 GPFS를 mount하기 위해 GPFS daemon을 살립니다.  (여기서는 client 노드에서만 살리면 되므로 -a 옵션은 빼고 수행합니다.)

root@sys-87576:/home/u0017496# mmstartup
Wed Jun 14 09:42:08 EDT 2017: mmstartup: Starting GPFS ...
mmremote: startSubsys: The /lib/modules/4.4.0-79-generic/extra/mmfslinux.ko kernel extension does not exist.  Use mmbuildgpl command to create the needed kernel extension for your kernel or copy the binaries from another node with the identical environment.
mmremote: startSubsys: Unable to verify kernel/module configuration.
mmstartup: Command failed. Examine previous error messages to determine cause.

보시다시피 error가 나고, 당연히 GPFS 파일시스템은 마운트 되지 못합니다.  이제 mmbuildgpl 명령으로 portability layer를 compile 해줍니다.

root@sys-87576:/home/u0017496# mmbuildgpl
--------------------------------------------------------
mmbuildgpl: Building GPL module begins at Wed Jun 14 09:42:21 EDT 2017.
--------------------------------------------------------
Verifying Kernel Header...
  kernel version = 40400079 (4.4.0-79-generic, 4.4.0-79)
  module include dir = /lib/modules/4.4.0-79-generic/build/include
  module build dir   = /lib/modules/4.4.0-79-generic/build
  kernel source dir  = /usr/src/linux-4.4.0-79-generic/include
  Found valid kernel header file under /lib/modules/4.4.0-79-generic/build/include
Verifying Compiler...
  make is present at /usr/bin/make
  cpp is present at /usr/bin/cpp
  gcc is present at /usr/bin/gcc
  g++ is present at /usr/bin/g++
  ld is present at /usr/bin/ld
make World ...
make InstallImages ...
--------------------------------------------------------
mmbuildgpl: Building GPL module completed successfully at Wed Jun 14 09:43:18 EDT 2017.
--------------------------------------------------------

성공적으로 끝났습니다.  이제 GPFS daemon을 살립니다.

root@sys-87576:/home/u0017496# mmstartup
Wed Jun 14 09:45:26 EDT 2017: mmstartup: Starting GPFS ...

잘 되었습니다.  이제 mount 합니다.

root@sys-87576:/home/u0017496# mmmount all
Wed Jun 14 09:45:37 EDT 2017: mmmount: Mounting file systems ...

잘 되었습니다.  이제 눈으로 mount 상태를 확인합니다.

root@sys-87576:/home/u0017496# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           408M   12M  396M   3% /run
/dev/sda2        35G   18G   16G  53% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
GPFS1           4.0G  456M  3.6G  12% /gpfs1


** 여기서는 SpectrumScale 4.2.1로 테스트한 것으로 되어 있습니다만, 제가 해보니 4.2.1에서는 mmbuildgpl에서 다음과 같은 error가 발생합니다.  

error "struct inode has no member named i_wb_list"

이는 4.2.1에서의 bug인 모양입니다.  다시 4.2.3으로 설치하고 해보니 아무 문제없이 잘 됩니다.  

ppc64le 환경에서의 anaconda python2&3 환경 동시 설정 - XGBoost, OpenCV, KoNLPy, MeCab 등

먼저, ppc64le 환경에서의 miniconda 설치에 대해서는 아래 post를 참조하십시요.

http://hwengineer.blogspot.kr/2017/05/minsky-continuum-anaconda.html

여기서는 miniconda3 (python3.6)이 이미 설치된 환경에서 시작하며, ppc64le 환경에서 anaconda를 사용하실 때 흔히 있을 수 있는 질문과 응답 형식으로 정리했습니다.


Q1.  Anaconda 대신 Miniconda3로 가야하는 경우에는 다음 패키지도 conda install로 설치 가능한지 ? 

numpy, pandas, sklearn(scikit-learn), joblib, flask, bs4(beautiful soup), MKL(math kernel library), 

A1.  예, 아래와 같이 다 conda로 install 잘 됩니다.  단 하나, MKL은 ppc64le에는 없습니다만, 그와 수반되어 사용되는 numpy 및 scipy는 아래와 같이 conda로 잘 설치되므로 꼭 MKL이 있어야 할 필요는 없습니다.

u0017496@sys-87576:~$ conda install joblib
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/u0017496/miniconda3:

The following NEW packages will be INSTALLED:

    joblib: 0.11-py36_0

Proceed ([y]/n)? y

joblib-0.11-py 100% |#########################################################| Time: 0:00:00   7.17 MB/s

u0017496@sys-87576:~$ conda install scikit-learn
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/u0017496/miniconda3:

The following NEW packages will be INSTALLED:

    scikit-learn: 0.18.1-np112py36_1

Proceed ([y]/n)? y

scikit-learn-0 100% |#########################################################| Time: 0:00:00  14.48 MB/s

u0017496@sys-87576:~$ conda install pandas
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/u0017496/miniconda3:

The following NEW packages will be INSTALLED:

    pandas:          0.20.1-np112py36_0
    python-dateutil: 2.6.0-py36_0
    pytz:            2017.2-py36_0

Proceed ([y]/n)? y

pytz-2017.2-py 100% |#########################################################| Time: 0:00:00   7.85 MB/s
python-dateuti 100% |#########################################################| Time: 0:00:00   8.43 MB/s
pandas-0.20.1- 100% |#########################################################| Time: 0:00:02  10.59 MB/s

u0017496@sys-87576:~$ conda install flask
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/u0017496/miniconda3:

The following NEW packages will be INSTALLED:

    click:        6.7-py36_0
    flask:        0.12.2-py36_0
    itsdangerous: 0.24-py36_0
    jinja2:       2.9.6-py36_0
    markupsafe:   0.23-py36_2
    werkzeug:     0.12.2-py36_0

Proceed ([y]/n)? y

click-6.7-py36 100% |#########################################################| Time: 0:00:00   7.14 MB/s
itsdangerous-0 100% |#########################################################| Time: 0:00:00  11.12 MB/s
markupsafe-0.2 100% |#########################################################| Time: 0:00:00  15.42 MB/s
werkzeug-0.12. 100% |#########################################################| Time: 0:00:00   5.71 MB/s
jinja2-2.9.6-p 100% |#########################################################| Time: 0:00:00  14.30 MB/s
flask-0.12.2-p 100% |#########################################################| Time: 0:00:00   7.08 MB/s

u0017496@sys-87576:~$ conda install beautifulsoup4
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/u0017496/miniconda3:

The following NEW packages will be INSTALLED:

    beautifulsoup4: 4.6.0-py36_0

Proceed ([y]/n)? y

beautifulsoup4 100% |#########################################################| Time: 0:00:00   7.12 MB/s


u0017496@sys-87576:~$ conda install numpy scipy
Fetching package metadata .........
Solving package specifications: .

# All requested packages already installed.
# packages in environment at /home/u0017496/miniconda3:
#
numpy                     1.12.1                   py36_0
scipy                     0.19.0              np112py36_0


Q2.  Python2 & 3을 위해서 Anaconda2, Anaconda3을 각각 설치하는 대신에 아래 URL에 나오는 것처럼 Anaconda3 하나만 설치하고 그 내부에 python2 가상환경 구축 가능한지?

www.continuum.io/blog/developer-blog/python-3-support-anaconda

A2.  예, 잘 됩니다.  

u0017496@sys-87576:~$ conda create -n py2k python=2 anaconda
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /home/u0017496/miniconda3/envs/py2k:

The following NEW packages will be INSTALLED:

    alabaster:          0.7.10-py27_0
    anaconda:           4.4.0-np112py27_0
    anaconda-client:    1.6.3-py27_0
....
...
jupyter-1.0.0- 100% |#########################################################| Time: 0:00:00  10.50 MB/s
anaconda-4.4.0 100% |#########################################################| Time: 0:00:00   5.53 MB/s
#
# To activate this environment, use:
# > source activate py2k
#
# To deactivate this environment, use:
# > source deactivate py2k
#

py2k, 즉 python2 가상환경에 들어가려면 다음과 같이 하시면 됩니다.

u0017496@sys-87576:~$ source activate py2k

python이 이제 2.7.13 버전이 구동되는 것을 보실 수 있습니다.

(py2k) u0017496@sys-87576:~$ python
Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, Mar 16 2017, 18:34:18)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>>


Q3. XGBoost의 경우, pip install을 통한 설치는 CPU 버전 패키지만 지원합니다.  
GPU 사용가능한 XGBoost는 아래 URL의 Github 소스코드 + CUB 관련 파일 컴파일이 필요한데 ppc64le에서도 가능한지?

github.com/dmlc/xgboost/tree/master/plugin/updater_gpu

A3.  예, 잘 됩니다.  git clone으로 위의 package를 download 받아 그 안의 다음 4개의 Makefile에서 intel-specifc한 option인 -msse2만 제거하면 잘 됩니다.

u0017496@sys-87576:~/$ git clone --recursive https://github.com/dmlc/xgboost.git

u0017496@sys-87576:~/$ cd xgboost

u0017496@sys-87576:~/xgboost$ vi ./rabit/guide/Makefile ./rabit/Makefile ./dmlc-core/Makefile ./Makefile

u0017496@sys-87576:~/xgboost$ ./build.sh
...
g++ -std=c++11 -Wall -Wno-unknown-pragmas -Iinclude   -Idmlc-core/include -Irabit/include -I/include -O3 -funroll-loops -mcpu=power8 -fPIC -fopenmp -o xgboost  build/cli_main.o build/logging.o build/learner.o build/common/common.o build/common/hist_util.o build/metric/metric.o build/metric/rank_metric.o build/metric/elementwise_metric.o build/metric/multiclass_metric.o build/objective/multiclass_obj.o build/objective/objective.o build/objective/rank_obj.o build/objective/regression_obj.o build/data/sparse_page_dmatrix.o build/data/sparse_page_source.o build/data/sparse_page_writer.o build/data/simple_csr_source.o build/data/data.o build/data/sparse_page_raw_format.o build/data/simple_dmatrix.o build/tree/updater_prune.o build/tree/tree_updater.o build/tree/updater_histmaker.o build/tree/updater_refresh.o build/tree/updater_sync.o build/tree/updater_colmaker.o build/tree/updater_skmaker.o build/tree/tree_model.o build/tree/updater_fast_hist.o build/gbm/gbtree.o build/gbm/gblinear.o build/gbm/gbm.o build/c_api/c_api.o build/c_api/c_api_error.o dmlc-core/libdmlc.a rabit/lib/librabit.a  -pthread -lm  -fopenmp -lrt  -lrt
Successfully build multi-thread xgboost


Q4. konlpy는 JDK 및 Jpype1 관련 설정 및 PATH, JAVA_HOME 등등 경로 지정 필요합니다. python2, python3에서 모두 잘 작동하는지 ?

A4.  잘 됩니다.

먼저 기본 환경인 python3에서 다음과 같이 잘 됩니다.

u0017496@sys-87576:~/xgboost$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
u0017496@sys-87576:~/xgboost$ python
Python 3.6.0 |Continuum Analytics, Inc.| (default, Mar 16 2017, 19:36:14)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import *
>>> Kkma()
<konlpy.tag._kkma.Kkma instance at 0x3fff9561be60>

이어서 위에서 설치했던 가상환경의 python2에서도 잘 됩니다.  다만 환경 변수 등은 가상환경 속에서 다시 또 해줘야 합니다.

u0017496@sys-87576:~$ source activate py2k
(py2k) u0017496@sys-87576:~$ python
Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, Mar 16 2017, 18:34:18)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> from konlpy.tag import *
>>> Kkma()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Kkma instance has no __call__ method

위에서 error가 난 이유는 JAVA_HOME 설정이 이 가상환경 속에서는 안 되어 있기 때문입니다.  그걸 해주면 error는 없어집니다.

(py2k) u0017496@sys-87576:~$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-ppc64el
(py2k) u0017496@sys-87576:~$ python
Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, Mar 16 2017, 18:34:18)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> from konlpy.tag import *
>>> Kkma()
<konlpy.tag._kkma.Kkma instance at 0x3fff9561be60>


Q5. KoNLPy의 mecab 추가 설치 및 작동이 잘 되는지 ?  가령 아래 code가 python2, python3에서 모두 잘 되는지 ?

from konlpy.tag import *
Mecab()

A5.  다음과 같이 잘 됩니다.  처음에는 error가 나서 당황했는데, 보니 mecab-ko-dic를 따로 설치하면 해결되는 문제입니다.  

먼저 mecab-python3을 pip로 설치하고, 그 뒤에 mecab-ko-dic을 download 받아 설치합니다.

u0017496@sys-87576:~$ pip install mecab-python3

u0017496@sys-87576:~$ wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-1.6.1-20140814.tar.gz

u0017496@sys-87576:~$ tar -zxvf mecab-ko-dic-1.6.1-20140814.tar.gz
u0017496@sys-87576:~$ cd mecab-ko-dic-1.6.1-20140814
u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ ./autogen.sh
u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ ./configure
u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ make
u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ sudo make install

u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ python
Python 3.6.0 |Continuum Analytics, Inc.| (default, Mar 16 2017, 19:36:14)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import *
>>> Mecab('/usr/lib/mecab/dic/mecab-ko-dic')
<konlpy.tag._mecab.Mecab object at 0x3fffa01773c8>

python2의 가상환경에서도 물론 동일하게 잘 됩니다.

u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ source activate py2k
(py2k) u0017496@sys-87576:~/mecab-ko-dic-1.6.1-20140814$ python
Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, Mar 16 2017, 18:34:18)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> from konlpy.tag import *
>>> Mecab('/usr/lib/mecab/dic/mecab-ko-dic')
<konlpy.tag._mecab.Mecab instance at 0x3fff754e7cb0>
>>>


Q5.  OpenCV & GraphViz의 경우, conda install 을 사용하지 않고 설치가 가능하다면, python2&3 안에서 호출 가능한 형태로 설치되는 것인지?

import cv2
import graphviz

A6. 예, 둘다 잘 됩니다.   https://repo.continuum.io/pkgs/free/linux-ppc64le에서 opencv-3.1.0-np112py27_2.tar.bz2 등의 opencv package를 받아와서 설치하면 됩니다.

먼저 python3를 위한 opencv package를 설치해서 테스트합니다.

u0017496@sys-87576:~$ wget https://repo.continuum.io/pkgs/free/linux-ppc64le/opencv-3.1.0-np112py36_2.tar.bz2
--2017-06-14 03:35:25--  https://repo.continuum.io/pkgs/free/linux-ppc64le/opencv-3.1.0-np112py36_2.tar.bz2
Resolving repo.continuum.io (repo.continuum.io)... 104.16.19.10, 104.16.18.10, 2400:cb00:2048:1::6810:120a, ...
Connecting to repo.continuum.io (repo.continuum.io)|104.16.19.10|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13145265 (13M) [application/x-tar]
Saving to: ‘opencv-3.1.0-np112py36_2.tar.bz2’

opencv-3.1.0-np112py36_2.t 100%[=====================================>]  12.54M  9.02MB/s    in 1.4s

2017-06-14 03:35:26 (9.02 MB/s) - ‘opencv-3.1.0-np112py36_2.tar.bz2’ saved [13145265/13145265]


u0017496@sys-87576:~$ mkdir opencv-3.1.0-py36
u0017496@sys-87576:~$ cd opencv-3.1.0-py36
u0017496@sys-87576:~/opencv-3.1.0-py36$ tar -jxvf ../opencv-3.1.0-np112py36_2.tar.bz2

u0017496@sys-87576:~$ export PYTHONPATH=$PYTHONPATH:/home/u0017496/opencv-3.1.0-py36/lib/python3.6/site-packages

u0017496@sys-87576:~$ python
Python 3.6.0 |Continuum Analytics, Inc.| (default, Mar 16 2017, 19:36:14)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> import graphviz
>>>

다음으로 python2를 위한 opencv package를 설치해서 테스트합니다.

u0017496@sys-87576:~$ wget https://repo.continuum.io/pkgs/free/linux-ppc64le/opencv-3.1.0-np112py27_2.tar.bz2
--2017-06-14 03:35:38--  https://repo.continuum.io/pkgs/free/linux-ppc64le/opencv-3.1.0-np112py27_2.tar.bz2
Resolving repo.continuum.io (repo.continuum.io)... 104.16.18.10, 104.16.19.10, 2400:cb00:2048:1::6810:130a, ...
Connecting to repo.continuum.io (repo.continuum.io)|104.16.18.10|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13147104 (13M) [application/x-tar]
Saving to: ‘opencv-3.1.0-np112py27_2.tar.bz2’

opencv-3.1.0-np112py27_2.t 100%[=====================================>]  12.54M  9.76MB/s    in 1.3s

2017-06-14 03:35:39 (9.76 MB/s) - ‘opencv-3.1.0-np112py27_2.tar.bz2’ saved [13147104/13147104]

u0017496@sys-87576:~$ mkdir opencv-3.1.0-py27
u0017496@sys-87576:~$ cd opencv-3.1.0-py27
u0017496@sys-87576:~/opencv-3.1.0-py27$ tar -jxvf ../opencv-3.1.0-np112py27_2.tar.bz2

u0017496@sys-87576:~$ source activate py2k

(py2k) u0017496@sys-87576:~$ export PYTHONPATH=$PYTHONPATH:/home/u0017496/opencv-3.1.0-py27/lib/python2.7/site-packages

(py2k) u0017496@sys-87576:~$ python
Python 2.7.13 |Anaconda 4.4.0 (64-bit)| (default, Mar 16 2017, 18:34:18)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import cv2
>>> import graphviz
>>>

2017년 6월 13일 화요일

MNIST를 이용한 GPU와 CPU의 deep learning 성능 차이 확인

MNIST (lenet training)

MNIST (Mixed National Institute of Standards and Technology database)
:  handwriting 숫자 이미지.  0~9까지의 손글씨 이미지 dataset
   - size-normalized, centered.
   - 28x28 size.  흑백(0,1)
   - 6만개 학습 data, 1만개 test data

여기서는 IBM PowerAI toolkit에 포함된 caffe 및 mnist example script를 사용합니다.

test home directory   /opt/DL/caffe-ibm

------------
1) mnist data download

/opt/DL/caffe-ibm/data/mnist$ ./get_mnist.sh

/opt/DL/caffe-ibm/data/mnist$ ls -la
total 53684
drwxrwxrwx 2 root     root     4096 Nov 14 19:13 .
drwxrwxrwx 5 root     root     4096 Nov 14 10:08 ..
-rwxrwxrwx 1 root     root      408 Oct 24 15:24 get_mnist.sh
-rw-r----- 1 b6p318za IBM1  7840016 Jul 21  2000 t10k-images-idx3-ubyte
-rw-r----- 1 b6p318za IBM1    10008 Jul 21  2000 t10k-labels-idx1-ubyte
-rw-r----- 1 b6p318za IBM1 47040016 Jul 21  2000 train-images-idx3-ubyte
-rw-r----- 1 b6p318za IBM1    60008 Jul 21  2000 train-labels-idx1-ubyte

2) mnist database 생성

먼저 아래 shell script의 일부를 수정합니다.

/opt/DL/caffe-ibm/examples/mnist$ vi create_mnist.sh
...
BUILD=bin
#BUILD=build/examples/mnist

그리고 그 script를 나서 수행합니다.

/opt/DL/caffe-ibm$ ./examples/mnist/create_mnist.sh
Creating lmdb...
I1214 10:15:56.708528 51473 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I1214 10:15:56.708672 51473 convert_mnist_data.cpp:88] A total of 60000 items.
I1214 10:15:56.708679 51473 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I1214 10:15:57.020663 51473 convert_mnist_data.cpp:108] Processed 60000 files.
I1214 10:15:57.057901 51475 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_test_lmdb
I1214 10:15:57.058055 51475 convert_mnist_data.cpp:88] A total of 10000 items.
I1214 10:15:57.058069 51475 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I1214 10:15:57.110440 51475 convert_mnist_data.cpp:108] Processed 10000 files.
Done.


3) 테스트를 CPU 로 할지 GPU 로 할지를 지정

/opt/DL/caffe-ibm$ vi ./examples/mnist/lenet_solver.prototxt
...
# solver mode: CPU or GPU
solver_mode: CPU
#solver_mode: GPU

4)  lenet training 수행

/opt/DL/caffe-ibm$ time ./examples/mnist/train_lenet.sh

-------------

GPU  :  real       26.62 user      3.89 system   0:19.56 elapsed   155% CPU
CPU  :  real  46554.36 user 1075.25 system 15:35.13 elapsed 5093% CPU

ppc64le 아키텍처용 anaconda package list에 없는 일부 package의 수동 설치 (xgboost의 사례)

이제 ppc64le 아키텍처에서도 Continuum사의 miniconda가 지원됩니다.  다만 모든 package들이 지금 다 available한 것은 아닙니다.   가령 아래 URL에 가서 확인해보면 몇몇 package들은 ppc64le에서는 지원되지 않는 것을 확인하실 수 있습니다.   대표적인 예가 xgboost 입니다.

https://repo.continuum.io/pkgs/free/linux-ppc64le/

그러나 여기에 포함되어 있지 않다고 해서 ppc64le에서는 정말 사용할 수 없느냐 하면 그건 아닙니다.  매우 간단히 설치가 가능합니다.

먼저, 그냥 그대로 pip로 xgboost를 설치할 때 어떤 error가 벌어지는지 보시지요.  먼저, pip가 anaconda에서 제공하는 pip인지 확인합니다.

u0017496@sys-87576:~$ which pip
/home/u0017496/miniconda3/bin/pip

그 다음에 이 pip를 이용하여 xgboost 설치를 시도해 봅니다.

u0017496@sys-87576:~$ pip install xgboost
...
  Using cached xgboost-0.6a2.tar.gz
    Complete output from command python setup.py egg_info:
    rm -f -rf build build_plugin lib bin *~ */*~ */*/*~ */*/*/*~ */*.o */*/*.o */*/*/*.o xgboost
    g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/logging.o src/logging.cc >build/logging.d
    g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/learner.o src/learner.cc >build/learner.d
    g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/common/common.o src/common/common.cc >build/common/common.d
    g++ -std=c++0x -Wall -O3 -msse2  -Wno-unknown-pragmas -funroll-loops -Iinclude   -Idmlc-core/include -Irabit/include -fPIC -fopenmp -MM -MT build/metric/metric.o src/metric/metric.cc >build/metric/metric.d
    g++: error: unrecognized command line option ‘-msse2’

결국 intel x86 아키텍처에만 있는 SSE2 instruction 관련 option이 문제인 것을 보실 수 있습니다.  이는 source를 download 받은 뒤 직접 python setup.py를 수행함으로써 간단히 해결 가능합니다.

다음과 같이 pip download 명령으로 xgboost의 source를 download 받습니다.

u0017496@sys-87576:~$ pip download -d "./" xgboost

이것의 압축을 풀고, 관련 Makefile들을 수정합니다.  그냥 -msse2 부분만 빼줘도 되는데, 여기서는 하는 김에 CPU 아키텍처가 POWER8이라는 것을 지정하겠습니다.

u0017496@sys-87576:~$ tar -zxvf xgboost-0.6a2.tar.gz

u0017496@sys-87576:~$ cd xgboost-0.6a2

u0017496@sys-87576:~/xgboost-0.6a2$ vi ./xgboost/Makefile  
export CFLAGS=  -std=c++0x -Wall -O3 -mcpu=power8 -Wno-unknown-pragmas -funroll-loops -Iinclude $(ADD_CFLAGS) $(PLUGIN_CFLAGS)
#export CFLAGS=  -std=c++0x -Wall -O3 -msse2 -Wno-unknown-pragmas -funroll-loops -Iinclude $(ADD_CFLAGS) $(PLUGIN_CFLAGS)

u0017496@sys-87576:~/xgboost-0.6a2$ vi ./xgboost/dmlc-core/Makefile
export CFLAGS = -O3 -Wall -mcpu=power8 -Wno-unknown-pragmas -Iinclude  -std=c++0x
#export CFLAGS = -O3 -Wall -msse2  -Wno-unknown-pragmas -Iinclude  -std=c++0x

u0017496@sys-87576:~/xgboost-0.6a2$ vi ./xgboost/rabit/Makefile
export CFLAGS = -O3 -mcpu=power8 $(WARNFLAGS)
#export CFLAGS = -O3 -msse2 $(WARNFLAGS)

그 다음에 'python setup.py install' 명령을 직접 수행합니다.

u0017496@sys-87576:~/xgboost-0.6a2$ python setup.py install
...
Searching for scipy==0.19.0
Best match: scipy 0.19.0
Adding scipy 0.19.0 to easy-install.pth file

Using /home/u0017496/miniconda3/lib/python3.6/site-packages
Searching for numpy==1.13.0
Best match: numpy 1.13.0
Adding numpy 1.13.0 to easy-install.pth file

Using /home/u0017496/miniconda3/lib/python3.6/site-packages
Finished processing dependencies for xgboost==0.6a2

결과적으로 잘 설치되었습니다.  PYTHONPATH로 되어 있는 /home/u0017496/miniconda3/lib/python3.6/site-packages 디렉토리를 확인하면 다음과 같이 해당 directory가 생성된 것을 보실 수 있습니다.

u0017496@sys-87576:~/xgboost-0.6a2$ ls /home/u0017496/miniconda3/lib/python3.6/site-packages | grep xgboost
xgboost-0.6a2-py3.6.egg

또한 conda list 명령으로 보면 pip 명령으로 해당 package가 설치된 것으로 display 되는 것을 확인하실 수 있습니다.

u0017496@sys-87576:~/xgboost-0.6a2$ conda list | grep xgboost
xgboost                   0.6a2                     <pip>

pip 명령으로 삭제도 정상적으로 됩니다.

u0017496@sys-87576:~/xgboost-0.6a2$ pip uninstall xgboost
Uninstalling xgboost-0.6a2:
  /home/u0017496/miniconda3/lib/python3.6/site-packages/xgboost-0.6a2-py3.6.egg
Proceed (y/n)? y
  Successfully uninstalled xgboost-0.6a2


2017년 6월 8일 목요일

POWER8에서 LSF를 이용하여 tensorflow docker image로 inception v3를 training 하기


여기서는 Spectrum LSF의 무료 community edition을 이용하여, sys-87548 서버와 sys-87549 서버로 LSF cluster를 만들겠습니다.  sys-87548 서버가 master이자 slave이고, sys-87549 서버는 secondary master이자 역시 slave 입니다.

LSF community edition을 인터넷에서 download 받아 다음과 같이 tar를 압축 해제합니다.  속에는 LSF와 Platform Application Server가 들어있는 것을 보실 수 있습니다.   여기서는 일단 LSF만 설치합니다.

root@sys-87548:/home/u0017496# tar -zxvf lsfce10.1-ppc64le.tar.gz
lsfce10.1-ppc64le/
lsfce10.1-ppc64le/lsf/
lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall_linux_ppc64le.tar.Z
lsfce10.1-ppc64le/lsf/lsf10.1_lnx310-lib217-ppc64le.tar.Z
lsfce10.1-ppc64le/pac/
lsfce10.1-ppc64le/pac/pac10.1_basic_linux-ppc64le.tar.Z

root@sys-87548:/home/u0017496# cd lsfce10.1-ppc64le/lsf/

아래와 같이 LSF에는 두개의 *.tar.Z file이 있는데, 이중 압축 해제가 필요한 것은 lsf10.1_lsfinstall_linux_ppc64le.tar.Z 뿐입니다.  lsf10.1_lnx310-lib217-ppc64le.tar.Z은 압축 해제하지 말고 그냥 놔두셔야 합니다.

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf# ls
lsf10.1_lnx310-lib217-ppc64le.tar.Z  lsf10.1_lsfinstall_linux_ppc64le.tar.Z

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf# zcat lsf10.1_lsfinstall_linux_ppc64le.tar.Z | tar xvf -

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf# cd lsf10.1_lsfinstall

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall# ls
conf_tmpl  install.config  lap         lsf_unix_install.pdf  patchlib   README      rpm      slave.config
hostsetup  instlib         lsfinstall  patchinstall          pversions  rhostsetup  scripts

먼저 install.config를 다음과 같이 편집합니다.  LSF_MASTER_LIST에 적힌 순서에 따라 sys-87548가 primary master,  sys-87549가 secondary master이고, 또 LSF_ADD_SERVERS에 적힌 순서에 따라 sys-87548와 sys-87549가 각각 host server, 즉 slave입니다.   만약 서버가 1대 뿐이라면 그 서버가 master이자 single slave가 될 수도 있습니다.

[root@sys-87538 lsf10.1_lsfinstall]# vi install.config
LSF_TOP="/usr/share/lsf"
LSF_ADMINS="u0017496"
LSF_CLUSTER_NAME="cluster1"
LSF_MASTER_LIST="sys-87548 sys-87549"
LSF_TARDIR="/home/u0017496/lsfce10.1-ppc64le/lsf"
# CONFIGURATION_TEMPLATE="DEFAULT|PARALLEL|HIGH_THROUGHPUT"
LSF_ADD_SERVERS="sys-87548 sys-87549"


lsfinstall 명령을 이용해 다음과 같이 설치 시작합니다.  도중에 LSF distribution tar 파일의 위치를 묻는데, 아까 압축 해제하지 않고 놔둔 그 파일을 묻는 것입니다.  그냥 1을 눌러 default를 선택하면 됩니다.

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall# ./lsfinstall -f install.config
...
Press Enter to continue viewing the license agreement, or
enter "1" to accept the agreement, "2" to decline it, "3"
to print it, "4" to read non-IBM terms, or "99" to go back
to the previous screen.
1
...
Searching LSF 10.1 distribution tar files in /home/u0017496/lsfce10.1-ppc64le/lsf Please wait ...
  1) linux3.10-glibc2.17-ppc64le
Press 1 or Enter to install this host type: 1


LSF 엔진 설치가 끝나면 다음 명령을 수행하여 이 서버를 host server, 즉 slave로 설정합니다.  --boot="y"는 서버가 부팅될 때 LSF daemon을 자동으로 살리라는 뜻입니다.

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall# ./hostsetup --top="/usr/share/lsf" --boot="y"
Logging installation sequence in /usr/share/lsf/log/Install.log

------------------------------------------------------------
    L S F    H O S T S E T U P    U T I L I T Y
------------------------------------------------------------
This script sets up local host (LSF server, client or slave) environment.

Setting up LSF server host "sys-87548" ...
Checking LSF installation for host "sys-87548" ... Done
grep: /etc/init/rc-sysinit.conf: No such file or directory
Copying /etc/init.d/lsf, /etc/rc3.d/S95lsf and /etc/rc3.d/K05lsf
Installing LSF RC scripts on host "sys-87548" ... Done
LSF service ports are defined in /usr/share/lsf/conf/lsf.conf.
Checking LSF service ports definition on host "sys-87548" ... Done
You are installing IBM Spectrum LSF -  Community Edition.

... Setting up LSF server host "sys-87548" is done
... LSF host setup is done.


그리고 root user와 LSF 사용 user의 .bashrc에는 다음과 같이 profile.lsf가 수행되도록 entry를 넣어둡니다.

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall# vi /root/.bashrc
. /usr/share/lsf/conf/profile.lsf

u0017496@sys-87481:~$ vi ~/.bashrc
. /usr/share/lsf/conf/profile.lsf

그리고 서버들 간에는 rsh이 아닌 ssh를 이용하도록 아래와 같이 lsf.conf 속에 LSF_RSH를 설정합니다.

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall# vi /usr/share/lsf/conf/lsf.conf
LSF_RSH=ssh

그리고 LSF 사용자들을 /etc/lsf.sudoers  속에 등록해둡니다.

root@sys-87548:/home/u0017496/lsfce10.1-ppc64le/lsf/lsf10.1_lsfinstall# sudo vi /etc/lsf.sudoers
LSB_PRE_POST_EXEC_USER=u0017496
LSF_STARTUP_PATH=/usr/share/lsf/10.1/linux3.10-glibc2.17-ppc64le/etc
LSF_STARTUP_USERS="u0017496"


lsfadmin user는 물론, root로도 자체, 그리고 에 대해 passwd 없이 ssh가 가능하도록 설정해야 합니다.

u0017496@sys-87548:~$ ssh-keygen -t rsa
u0017496@sys-87548:~$ ssh-copy-id sys-87548
u0017496@sys-87548:~$ ssh-copy-id sys-87549


root@sys-87548:/home/u0017496# ssh-keygen -t rsa

[root@sys-87548:/home/u0017496# ls -l /root/.ssh
total 12
-rw------- 1 root root 1595 Jun  8 03:43 authorized_keys
-rw------- 1 root root 1679 Jun  8 03:42 id_rsa
-rw-r--r-- 1 root root  396 Jun  8 03:42 id_rsa.pub

root@sys-87548:/home/u0017496# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys


root@sys-87548:/home/u0017496# cp /root/.ssh/id_rsa.pub /tmp/sys-87548.id_rsa.pub
root@sys-87548:/home/u0017496# chmod 666 /tmp/sys-87548.id_rsa.pub
root@sys-87548:/home/u0017496# exit

u0017496@sys-87548:~$ scp /tmp/sys-87548.id_rsa.pub sys-87549:/tmp
sys-87548.id_rsa.pub                                                         100%  396     0.4KB/s   00:00

root@sys-87548:/home/u0017496# cat /tmp/sys-87549.id_rsa.pub >> /root/.ssh/authorized_keys


이제 lsfstartup 명령을 이용해 LSF daemon들을 살립니다.

root@sys-87548:/home/u0017496# lsfstartup

root@sys-87548:/home/u0017496# lsid
IBM Spectrum LSF Community Edition 10.1.0.0, Jun 15 2016
Copyright IBM Corp. 1992, 2016. All rights reserved.
US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.

My cluster name is cluster1
My master name is sys-87548.dal-ebis.ihost.com


아직은 sys-87548에만 LSF가 설치되어 있으므로, LSF daemon들에게는 sys-87549가 down된 상태로 보인다는 점에 유의하십시요.

u0017496@sys-87548:~$ bhosts
HOST_NAME          STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
sys-87548.dal-ebis ok              -      1      0      0      0      0      0
sys-87549.dal-ebis unavail         -      1      0      0      0      0      0

다음과 같이 bsub 명령으로 tensorflow docker image를 이용해 inception v3를 training 하는 job을 submit 합니다.  이것들은 기본적으로 normal queue에 들어갑니다.   같은 명령을 2번 더 내려서, 3개의 training job을 queue에 던져 둡니다.

u0017496@sys-87548:~$ bsub -n 1 sudo docker run  --rm -v /home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xenial /home/inception/models/inception/bazel-bin/inception/flowers_train --train_dir=/home/inception/models/inception/train --data_dir=/home/inception/models/inception/data --pretrained_model_checkpoint_path=/home/inception/inception-v3/model.ckpt-157585 --fine_tune=True --initial_learning_rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8
Job <1> is submitted to queue <normal>.

Job 3개 중 1개는 running 중이고, 2개는 pending 상태인 것을 보실 수 있습니다.

u0017496@sys-87548:~$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     0     0     0     0
normal           30  Open:Active       -    -    -    -     3     2     1     0
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0

이제 default인 normal queue가 아닌, short queue에 또 동일한 job을 submit 해봅니다.

u0017496@sys-87548:~$ bsub -n 1 -q short sudo docker run  --rm -v /home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xenial /home/inception/models/inception/bazel-bin/inception/flowers_train --train_dir=/home/inception/models/inception/train --data_dir=/home/inception/models/inception/data --pretrained_model_checkpoint_path=/home/inception/inception-v3/model.ckpt-157585 --fine_tune=True --initial_learning_rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8
Job <4> is submitted to queue <short>.


u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
1       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
2       u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 03:56
3       u001749 PEND  normal     sys-87548.d             help       Jun  8 04:02

잘못 들어간 3번 job을 아래 bkill 명령으로 kill 시킬 수 있습니다.

u0017496@sys-87548:~$ bkill 3
Job <3> is being terminated

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
1       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
2       u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 03:56

한창 running 중인 job은 bstop 명령으로 잠깐 suspend 시킬 수 있습니다.  나중에 resume할 수 있도록 수행 도중 상태는 임시파일로 disk에 write됩니다.

u0017496@sys-87548:~$ bstop 1
Job <1> is being stopped

u0017496@sys-87548:~$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     1     1     0     0
normal           30  Open:Active       -    -    -    -     2     1     0     1
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
1       u001749 USUSP normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
2       u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 03:56

Suspend된 job은 bresume 명령으로 다시 수행할 수 있습니다.  이때 disk로부터 임시파일을 읽느라 I/O가 좀 발생합니다.

u0017496@sys-87548:~$ bresume 1
Job <1> is being resumed

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
1       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
2       u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 03:56

u0017496@sys-87548:~$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     1     1     0     0
normal           30  Open:Active       -    -    -    -     2     1     1     0
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0

u0017496@sys-87548:~$ bsub -n 1 -q short sudo docker run  --rm -v /home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xenial /home/inception/models/inception/bazel-bin/inception/flowers_train --train_dir=/home/inception/models/inception/train --data_dir=/home/inception/models/inception/data --pretrained_model_checkpoint_path=/home/inception/inception-v3/model.ckpt-157585 --fine_tune=True --initial_learning_rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8
Job <5> is submitted to queue <short>.

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
1       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
5       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:14
2       u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 03:56


대기 중인 job들 중에 빨리 처리되어야 하는 job은 btop 명령을 통해 대기 queue 상에서 순서를 최상위로 바꿀 수도 있습니다.

u0017496@sys-87548:~$ btop 5
Job <5> has been moved to position 1 from top.

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
1       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54
5       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:14
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
2       u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 03:56

현재 수행 중인 job의 standard out은 bpeek 명령을 통해 엿볼 수 있습니다.  이는 꼭 실시간으로 display되지는 않고, 약간 buffer가 쌓여야 보일 수도 있습니다.

u0017496@sys-87548:~$ bpeek 1
<< output from stdout >>
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:126] Couldn't open CUDA library libcuda.so.1. LD_LIBRARY_PATH: /usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64:/opt/DL/tensorflow/lib:/usr/lib:/usr/local/lib
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] hostname: d61a01411a1c
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: Not found: was unable to find libcuda.so DSO loaded into this program
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: Permission denied: could not open driver version path for reading: /proc/driver/nvidia/version
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1065] LD_LIBRARY_PATH: /usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64:/opt/DL/tensorflow/lib:/usr/lib:/usr/local/lib
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:1066] failed to find libcuda.so on this system: Failed precondition: could not dlopen DSO: libcuda.so.1; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
E tensorflow/stream_executor/cuda/cuda_driver.cc:509] failed call to cuInit: CUDA_ERROR_NO_DEVICE
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:145] kernel driver does not appear to be running on this host (d61a01411a1c): /proc/driver/nvidia/version does not exist
W tensorflow/compiler/xla/service/platform_util.cc:61] platform CUDA present but no visible devices found
I tensorflow/compiler/xla/service/platform_util.cc:58] platform Host present with 2 visible devices
I tensorflow/compiler/xla/service/service.cc:180] XLA service executing computations on platform Host. Devices:
I tensorflow/compiler/xla/service/service.cc:187]   StreamExecutor device (0): <undefined>, <undefined>
2017-06-08 07:56:19.985253: Pre-trained model restored from /home/inception/inception-v3/model.ckpt-157585
2017-06-08 07:59:19.471085: step 0, loss = 2.89 (0.1 examples/sec; 55.400 sec/batch)
2017-06-08 08:04:13.045726: step 10, loss = 2.46 (0.4 examples/sec; 19.288 sec/batch)
2017-06-08 08:07:22.977419: step 20, loss = 2.49 (0.4 examples/sec; 19.100 sec/batch)
2017-06-08 08:10:37.519711: step 30, loss = 2.18 (0.4 examples/sec; 20.120 sec/batch)
2017-06-08 08:13:48.625858: step 40, loss = 2.28 (0.4 examples/sec; 20.342 sec/batch)

bhist 명령을 통해 각 job들의 history를 간략히, 그리고 -l option을 쓰면 자세히 볼 수 있습니다.

u0017496@sys-87548:~$ bhist
Summary of time in seconds spent in various states:
JOBID   USER    JOB_NAME  PEND    PSUSP   RUN     USUSP   SSUSP   UNKWN   TOTAL
2       u001749 *_size=8  1275    0       106     0       0       0       1381
4       u001749 *_size=8  775     0       0       0       0       0       775
5       u001749 *_size=8  321     0       0       0       0       0       321

u0017496@sys-87548:~$ bhist -l

Job <2>, User <u0017496>, Project <default>, Command <sudo docker run --rm -v /
                     home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xe
                     nial /home/inception/models/inception/bazel-bin/inception/
                     flowers_train --train_dir=/home/inception/models/inception
                     /train --data_dir=/home/inception/models/inception/data --
                     pretrained_model_checkpoint_path=/home/inception/inception
                     -v3/model.ckpt-157585 --fine_tune=True --initial_learning_
                     rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --n
                     um_gpus 1 --batch_size=8>
Thu Jun  8 03:56:31: Submitted from host <sys-87548.dal-ebis.ihost.com>, to Que
                     ue <normal>, CWD <$HOME>;
Thu Jun  8 04:13:10: Job moved to position 1 relative to <top> by user or admin
                     istrator <u0017496>;
Thu Jun  8 04:17:46: Dispatched 1 Task(s) on Host(s) <sys-87548.dal-ebis.ihost.
                     com>, Allocated 1 Slot(s) on Host(s) <sys-87548.dal-ebis.i
                     host.com>, Effective RES_REQ <select[type == local] order[
                     r15s:pg] >;
Thu Jun  8 04:17:46: Starting (Pid 25530);
Thu Jun  8 04:17:46: Running with execution home </home/u0017496>, Execution CW
                     D </home/u0017496>, Execution Pid <25530>;

Summary of time in seconds spent in various states by  Thu Jun  8 04:19:36
  PEND     PSUSP    RUN      USUSP    SSUSP    UNKWN    TOTAL
  1275     0        110      0        0        0        1385
------------------------------------------------------------------------------

Job <4>, User <u0017496>, Project <default>, Command <sudo docker run --rm -v /
                     home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xe
                     nial /home/inception/models/inception/bazel-bin/inception/
                     flowers_train --train_dir=/home/inception/models/inception
                     /train --data_dir=/home/inception/models/inception/data --
                     pretrained_model_checkpoint_path=/home/inception/inception
                     -v3/model.ckpt-157585 --fine_tune=True --initial_learning_
                     rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --n
                     um_gpus 1 --batch_size=8>
Thu Jun  8 04:06:37: Submitted from host <sys-87548.dal-ebis.ihost.com>, to Que
                     ue <short>, CWD <$HOME>;

Summary of time in seconds spent in various states by  Thu Jun  8 04:19:36
  PEND     PSUSP    RUN      USUSP    SSUSP    UNKWN    TOTAL
  779      0        0        0        0        0        779
------------------------------------------------------------------------------

Job <5>, User <u0017496>, Project <default>, Command <sudo docker run --rm -v /
                     home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xe
                     nial /home/inception/models/inception/bazel-bin/inception/
                     flowers_train --train_dir=/home/inception/models/inception
                     /train --data_dir=/home/inception/models/inception/data --
                     pretrained_model_checkpoint_path=/home/inception/inception
                     -v3/model.ckpt-157585 --fine_tune=True --initial_learning_
                     rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --n
                     um_gpus 1 --batch_size=8>
Thu Jun  8 04:14:11: Submitted from host <sys-87548.dal-ebis.ihost.com>, to Que
                     ue <short>, CWD <$HOME>;
Thu Jun  8 04:14:34: Job moved to position 1 relative to <top> by user or admin
                     istrator <u0017496>;

Summary of time in seconds spent in various states by  Thu Jun  8 04:19:36
  PEND     PSUSP    RUN      USUSP    SSUSP    UNKWN    TOTAL
  325      0        0        0        0        0        325

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
2       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:56
5       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:14
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06

u0017496@sys-87548:~$ bjobs -a
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
2       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:56
5       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:14
4       u001749 PEND  short      sys-87548.d             *ch_size=8 Jun  8 04:06
3       u001749 EXIT  normal     sys-87548.d    -        help       Jun  8 04:02
1       u001749 DONE  normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 03:54



이제 2번째 서버 sys-87549도 online으로 만듭니다.  동일한 install.conf를 통해 LSF를 설치하고, 동일하게 hostsetup 명령을 수행하면 됩니다.   bhosts 명령을 통해 보면, 현재 job이 수행 중이라 추가적인 수행 여력이 없는 sys-87548 서버는 closed로 보이는 것을 보실 수 있습니다.

u0017496@sys-87548:~$ bhosts
HOST_NAME          STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
sys-87548.dal-ebis closed          -      1      1      1      0      0      0
sys-87549.dal-ebis ok              -      1      0      0      0      0      0

u0017496@sys-87548:~$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     1     0     1     0
normal           30  Open:Active       -    -    -    -     0     0     0     0
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
5       u001749 RUN   short      sys-87548.d sys-87548.d *ch_size=8 Jun  8 04:14

이제 이 상태에서 bsub 명령으로 또 docker image를 이용한 training job을 4개 submit 합니다.

u0017496@sys-87548:~$ bsub -n 1  sudo docker run  --rm -v /home/inception:/home/inception bsyu/tensor_r1.0:ppc64le-xenial /home/inception/models/inception/bazel-bin/inception/flowers_train --train_dir=/home/inception/models/inception/train --data_dir=/home/inception/models/inception/data --pretrained_model_checkpoint_path=/home/inception/inception-v3/model.ckpt-157585 --fine_tune=True --initial_learning_rate=0.001 -input_queue_memory_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8
Job <8> is submitted to default queue <normal>.
... (4번 반복)
Job <11> is submitted to default queue <normal>.


이제 host 서버가 2대이므로, 2개의 job이 동시에 수행 중인 것을 보실 수 있습니다.

u0017496@sys-87548:~$ bqueues
QUEUE_NAME      PRIO STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN  SUSP
owners           43  Open:Active       -    -    -    -     0     0     0     0
priority         43  Open:Active       -    -    -    -     0     0     0     0
night            40  Open:Active       -    -    -    -     0     0     0     0
short            35  Open:Active       -    -    -    -     0     0     0     0
normal           30  Open:Active       -    -    -    -     4     2     2     0
interactive      30  Open:Active       -    -    -    -     0     0     0     0
idle             20  Open:Active       -    -    -    -     0     0     0     0

u0017496@sys-87548:~$ bhosts
HOST_NAME          STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
sys-87548.dal-ebis closed          -      1      1      1      0      0      0
sys-87549.dal-ebis closed          -      1      1      1      0      0      0

bjobs 명령으로 8번 job은 sys-87548 서버에서, 9번 job은 sys-87549 서버에서 수행 중인 것을 보실 수 있습니다.

u0017496@sys-87548:~$ bjobs
JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
8       u001749 RUN   normal     sys-87548.d sys-87548.d *ch_size=8 Jun  8 05:57
9       u001749 RUN   normal     sys-87548.d sys-87549.d *ch_size=8 Jun  8 05:57
10      u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 05:57
11      u001749 PEND  normal     sys-87548.d             *ch_size=8 Jun  8 05:57

u0017496@sys-87548:~$ bqueues -l normal

QUEUE: normal
  -- For normal low priority jobs, running only if hosts are lightly loaded.  This is the default queue.

PARAMETERS/STATISTICS
PRIO NICE STATUS          MAX JL/U JL/P JL/H NJOBS  PEND   RUN SSUSP USUSP  RSV
 30    0  Open:Active       -    -    -    -     4     2     2     0     0    0
Interval for a host to accept two jobs is 0 seconds

SCHEDULING PARAMETERS
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -
 loadStop    -     -     -     -       -     -    -     -     -      -      -

SCHEDULING POLICIES:  FAIRSHARE  NO_INTERACTIVE
USER_SHARES:  [default, 1]

SHARE_INFO_FOR: normal/
 USER/GROUP   SHARES  PRIORITY  STARTED  RESERVED  CPU_TIME  RUN_TIME   ADJUST
u0017496        1       0.111      2        0        11.2      116       0.000

USERS: all
HOSTS:  all


u0017496@sys-87548:~$ bjobs -l

Job <8>, User <u0017496>, Project <default>, Status <RUN>, Queue <normal>, Comm
                     and <sudo docker run --rm -v /home/inception:/home/incepti
                     on bsyu/tensor_r1.0:ppc64le-xenial /home/inception/models/
                     inception/bazel-bin/inception/flowers_train --train_dir=/h
                     ome/inception/models/inception/train --data_dir=/home/ince
                     ption/models/inception/data --pretrained_model_checkpoint_
                     path=/home/inception/inception-v3/model.ckpt-157585 --fine
                     _tune=True --initial_learning_rate=0.001 -input_queue_memo
                     ry_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8>, S
                     hare group charged </u0017496>
Thu Jun  8 05:57:23: Submitted from host <sys-87548.dal-ebis.ihost.com>, CWD <$
                     HOME>;
Thu Jun  8 05:57:24: Started 1 Task(s) on Host(s) <sys-87548.dal-ebis.ihost.com
                     >, Allocated 1 Slot(s) on Host(s) <sys-87548.dal-ebis.ihos
                     t.com>, Execution Home </home/u0017496>, Execution CWD </h
                     ome/u0017496>;
Thu Jun  8 05:57:40: Resource usage collected.
                     MEM: 33 Mbytes;  SWAP: 85 Mbytes;  NTHREAD: 11
                     PGID: 29697;  PIDs: 29697 29699 29701 29702


 MEMORY USAGE:
 MAX MEM: 33 Mbytes;  AVG MEM: 33 Mbytes

 SCHEDULING PARAMETERS:
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -
 loadStop    -     -     -     -       -     -    -     -     -      -      -
------------------------------------------------------------------------------

Job <9>, User <u0017496>, Project <default>, Status <RUN>, Queue <normal>, Comm
                     and <sudo docker run --rm -v /home/inception:/home/incepti
                     on bsyu/tensor_r1.0:ppc64le-xenial /home/inception/models/
                     inception/bazel-bin/inception/flowers_train --train_dir=/h
                     ome/inception/models/inception/train --data_dir=/home/ince
                     ption/models/inception/data --pretrained_model_checkpoint_
                     path=/home/inception/inception-v3/model.ckpt-157585 --fine
                     _tune=True --initial_learning_rate=0.001 -input_queue_memo
                     ry_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8>, S
                     hare group charged </u0017496>
Thu Jun  8 05:57:27: Submitted from host <sys-87548.dal-ebis.ihost.com>, CWD <$
                     HOME>;
Thu Jun  8 05:57:28: Started 1 Task(s) on Host(s) <sys-87549.dal-ebis.ihost.com
                     >, Allocated 1 Slot(s) on Host(s) <sys-87549.dal-ebis.ihos
                     t.com>, Execution Home </home/u0017496>, Execution CWD </h
                     ome/u0017496>;
Thu Jun  8 05:58:30: Resource usage collected.
                     MEM: 33 Mbytes;  SWAP: 148 Mbytes;  NTHREAD: 11
                     PGID: 14493;  PIDs: 14493 14494 14496 14497


 MEMORY USAGE:
 MAX MEM: 33 Mbytes;  AVG MEM: 23 Mbytes

 SCHEDULING PARAMETERS:
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -
 loadStop    -     -     -     -       -     -    -     -     -      -      -
------------------------------------------------------------------------------

Job <10>, User <u0017496>, Project <default>, Status <PEND>, Queue <normal>, Co
                     mmand <sudo docker run --rm -v /home/inception:/home/incep
                     tion bsyu/tensor_r1.0:ppc64le-xenial /home/inception/model
                     s/inception/bazel-bin/inception/flowers_train --train_dir=
                     /home/inception/models/inception/train --data_dir=/home/in
                     ception/models/inception/data --pretrained_model_checkpoin
                     t_path=/home/inception/inception-v3/model.ckpt-157585 --fi
                     ne_tune=True --initial_learning_rate=0.001 -input_queue_me
                     mory_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8>
Thu Jun  8 05:57:31: Submitted from host <sys-87548.dal-ebis.ihost.com>, CWD <$
                     HOME>;
 PENDING REASONS:
 Job slot limit reached: 2 hosts;

 SCHEDULING PARAMETERS:
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -
 loadStop    -     -     -     -       -     -    -     -     -      -      -
------------------------------------------------------------------------------

Job <11>, User <u0017496>, Project <default>, Status <PEND>, Queue <normal>, Co
                     mmand <sudo docker run --rm -v /home/inception:/home/incep
                     tion bsyu/tensor_r1.0:ppc64le-xenial /home/inception/model
                     s/inception/bazel-bin/inception/flowers_train --train_dir=
                     /home/inception/models/inception/train --data_dir=/home/in
                     ception/models/inception/data --pretrained_model_checkpoin
                     t_path=/home/inception/inception-v3/model.ckpt-157585 --fi
                     ne_tune=True --initial_learning_rate=0.001 -input_queue_me
                     mory_factor=1 --max_steps=50 --num_gpus 1 --batch_size=8>
Thu Jun  8 05:57:33: Submitted from host <sys-87548.dal-ebis.ihost.com>, CWD <$
                     HOME>;
 PENDING REASONS:
 Job slot limit reached: 2 hosts;

 SCHEDULING PARAMETERS:
           r15s   r1m  r15m   ut      pg    io   ls    it    tmp    swp    mem
 loadSched   -     -     -     -       -     -    -     -     -      -      -
 loadStop    -     -     -     -       -     -    -     -     -      -      -