2018년 5월 16일 수요일

Ubuntu ppc64le 환경에서 nvidia-docker를 source로부터 build하기

최근에 nvidia-docker를 source에서 build 해보니 기존에 있던 ppc64le branch가 없어져서 그냥 하면 error가 납니다.   물론 nvidia-docker는 다음과 같이 apt repository에서 편리하게 설치가 가능합니다.

$ sudo vi /etc/apt/sources.list.d/nvidia-docker.list
deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/$(ARCH) /

$ sudo vi /etc/apt/sources.list.d/docker.list
deb [arch=ppc64el] https://download.docker.com/linux/ubuntu xenial stable


그래도 필요에 의해서 nvidia-docker를 source로부터 build해야 할 경우가 있습니다.   이 경우에도 근성만 있으면 아래와 같이 build가 가능합니다.

minsky_test@minsky:~/files$ git clone https://github.com/NVIDIA/nvidia-docker.git

minsky_test@minsky:~/files$ cd nvidia-docker

minsky_test@minsky:~/files/nvidia-docker$ git fetch --all

minsky_test@minsky:~/files/nvidia-docker$ git checkout tags/v1.0.1

여기서 그냥 make를 하시면 결국 다음과 같은 "exec format error"가 납니다.

minsky_test@minsky:~/files/nvidia-docker$ sudo make
...
http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64 /" > /etc/apt/sources.list.d/cuda.list
 ---> Running in 9bc30333d07a
standard_init_linux.go:178: exec user process caused "exec format error"
...
make: *** [tools] Error 2

이건 기본적으로 이 build를 위해 pull 해오는 golang container image가 ppc64le가 아닌 AMD64 아키텍처의 것이기 때문입니다.

minsky_test@minsky:~/files/nvidia-docker$ sudo docker inspect golang:1.5 | grep Arch
        "Architecture": "amd64",

이 문제와 기타 다른 문제들을 해결하기 위해 아래와 같이 Makefile과 Dockerfile.build을 일부 수정해주면 됩니다.

minsky_test@minsky:~/files/nvidia-docker$ vi Makefile
...
#ifneq ($(MAKECMDGOALS),rpm)
#PKG_ARCH := amd64
#else
#PKG_ARCH := x86_64
#endif
PKG_ARCH := ppc64le
...


minsky_test@minsky:~/files/nvidia-docker$ vi Dockerfile.build
#FROM golang:1.5
FROM ppc64le/golang:1.9
...
#    apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/7fa2af80.pub && \
    apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/ppc64el/7fa2af80.pub && \
...
#    echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64 /" > /etc/apt/sources.list.d/cuda.list
    echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/ppc64el /" > /etc/apt/sources.list.d/cuda.list
...
#        cuda-cudart-dev-6-5=6.5-14 \
        cuda-cudart-dev-8-0=8.0.61-1 \
#        cuda-misc-headers-6-5=6.5-19 && \
        cuda-misc-headers-8-0=8.0.61-1 && \
...
#RUN objcopy --redefine-sym memcpy=memcpy@GLIBC_2.2.5 /usr/local/cuda-6.5/lib64/libcudart_static.a   #으로 comment-out합니다
...
#ENV CGO_CFLAGS "-I /usr/local/cuda-6.5/include -I /usr/include/nvidia/gdk"
ENV CGO_CFLAGS "-I /usr/local/cuda-8.0/include -I /usr/include/nvidia/gdk"
#ENV CGO_LDFLAGS "-L /usr/local/cuda-6.5/lib64"
ENV CGO_LDFLAGS "-L /usr/local/cuda-8.0/lib64"

이제 build를 하면 됩니다.  make tarball을 수행하면 nvidia-docker와 nvidia-docker-plugin binary를 tar.xz로 묶어 줍니다.  이걸 /usr/local 등 적절한 위치에 풀어주기만 하면 됩니다.

minsky_test@minsky:~/files/nvidia-docker$ sudo make tarball
...
Find tarball at /home/minsky_test/files/nvidia-docker/dist

minsky_test@minsky:~/files/nvidia-docker$ tar -tvf /home/minsky_test/files/nvidia-docker/dist/nvidia-docker_1.0.1_ppc64le.tar.xz
-rwxr-xr-x root/miruware 5247984 2018-05-16 16:57 nvidia-docker/nvidia-docker
-rwxr-xr-x root/miruware 6489232 2018-05-16 16:57 nvidia-docker/nvidia-docker-plugin

물론 이렇게 source에서 build한 nvidia-docker는 service로 등록하기 전엔 아래처럼 손으로 start 해주고 kill로 죽여야 합니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ sudo ./nvidia-docker-plugin &

minsky_test@minsky:~/files/nvidia-docker/bin$ sudo ./nvidia-docker run -ti bsyu/tf1.3-ppc64le:v0.1 bash

root@78d0b67e2c8d:/# nvidia-smi
Wed May 16 08:05:31 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-SXM2...  Off  | 00000002:01:00.0 Off |                    0 |
| N/A   35C    P0    31W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-SXM2...  Off  | 00000003:01:00.0 Off |                    0 |
| N/A   35C    P0    30W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla P100-SXM2...  Off  | 0000000A:01:00.0 Off |                    0 |
| N/A   35C    P0    32W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla P100-SXM2...  Off  | 0000000B:01:00.0 Off |                    0 |
| N/A   30C    P0    31W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

아래에 이렇게 만들어진 nvidia-docker tarball을 google drive에 올려놓았습니다.

https://drive.google.com/open?id=1XoXXgpdsQPKHo-IPx3iNbKuJYHKgpihz

nvidia-driver 올린 뒤 container 속에서의 "Driver/library version mismatch" error

다음과 같이 nvidia-driver가 384.111인 환경에서 docker image bsyu/tf1.3-ppc64le:v0.1를 구동했습니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ sudo ./nvidia-docker run -ti bsyu/tf1.3-ppc64le:v0.1 bash

그 속에 들어가서 nvidia-smi 명령으로 nvidia-driver가 384.111인 것을 확인합니다.

root@78d0b67e2c8d:/# nvidia-smi
Wed May 16 08:05:31 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-SXM2...  Off  | 00000002:01:00.0 Off |                    0 |
| N/A   35C    P0    31W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-SXM2...  Off  | 00000003:01:00.0 Off |                    0 |
| N/A   35C    P0    30W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla P100-SXM2...  Off  | 0000000A:01:00.0 Off |                    0 |
| N/A   35C    P0    32W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla P100-SXM2...  Off  | 0000000B:01:00.0 Off |                    0 |
| N/A   30C    P0    31W / 300W |     10MiB / 16276MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

이 docker container에 변화를 주기 위해 다음과 같이 tensorflow models를 clone 해서 넣습니다.

root@78d0b67e2c8d:/# git clone https://github.com/tensorflow/models.git

root@78d0b67e2c8d:/# cd /models/tutorials/image/cifar10

여기서 cifar10 training을 잠깐 시켜봐도 좋습니다.   도중에 중단시키고 빠져 나갑니다.

root@78d0b67e2c8d:/models/tutorials/image/cifar10# python cifar10_train.py
...
2018-05-16 08:15:25.329494: step 1520, loss = 1.97 (9342.9 examples/sec; 0.014 sec/batch)
2018-05-16 08:15:25.454485: step 1530, loss = 1.86 (10240.0 examples/sec; 0.013 sec/batch)
2018-05-16 08:15:25.580138: step 1540, loss = 2.06 (10186.0 examples/sec; 0.013 sec/batch)
2018-05-16 08:15:25.711379: step 1550, loss = 1.73 (9754.1 examples/sec; 0.013 sec/batch)
^Z
[1]+  Stopped                 python cifar10_train.py
root@78d0b67e2c8d:/models/tutorials/image/cifar10# exit


이제 parent OS로 나왔습니다.  docker ps 명령으로 다음과 같이 78d0b67e2c8d container가 남아 있는 것을 보실 수 있습니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ docker ps -a
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                           PORTS               NAMES
78d0b67e2c8d        bsyu/tf1.3-ppc64le:v0.1   "bash"                   11 minutes ago      Exited (148) 43 seconds ago                          vigilant_jennings
af8e4f0af9d2        9d72ea809195              "/bin/sh -c 'go ge..."   42 minutes ago      Exited (2) 42 minutes ago                            practical_brown
021b52c86fdf        588a60a80ab7              "/bin/sh -c 'go ge..."   About an hour ago   Exited (2) About an hour ago                         nifty_beaver
716660e1b44b        bf2674b6db4a              "/bin/sh -c 'go ge..."   About an hour ago   Exited (1) About an hour ago                         blissful_pasteur
7e0b933581c5        3349633cccc3              "/bin/sh -c 'apt-g..."   About an hour ago   Exited (100) About an hour ago                       unruffled_haibt
53853b98c3f0        958e9eb53afd              "/bin/sh -c 'NVIDI..."   About an hour ago   Exited (2) About an hour ago                         goofy_williams
85afec3a1429        52a84e97014b              "/bin/bash -c 'mak..."   3 weeks ago         Exited (2) 3 weeks ago                               vigilant_curie
5e172a9eb6c0        3426d0bdc1ee              "/bin/sh -c 'cd /p..."   3 weeks ago         Exited (2) 3 weeks ago                               thirsty_wescoff
27725169f8c2        c9cf4b61ab78              "/bin/sh -c 'pip i..."   3 weeks ago         Exited (127) 3 weeks ago 

이제 nvidia driver를 390으로 올립니다.

minsky_test@minsky:~$ sudo apt-get install nvidia-390-dev nvidia-390

당장 nvidia-smi를 해보면 error가 납니다.  원래는 reboot을 해야 하는데, 그러지 않았기 때문인가 봅니다.

minsky_test@minsky:~$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

이걸 rebooting하지 않고 하기 위해서는 nvidia-docker-plugin을 죽인 뒤, 현재 load된 nvidia 관련 module들을 rmmod로 제거한 뒤 다시 nvidia-docker-plugin을 살리면 됩니다.

minsky_test@minsky:~$ ps -ef | grep 86949 | grep -v grep
root      86949  86948  0 17:03 pts/7    00:00:03 ./nvidia-docker-plugin

minsky_test@minsky:~$ sudo kill -9 86949

minsky_test@minsky:~$ sudo lsmod | grep nvidia
nvidia_drm             59673  0
nvidia_modeset       1173401  1 nvidia_drm
nvidia_uvm            869865  4
nvidia              16625272  779 nvidia_modeset,nvidia_uvm
drm_kms_helper        182400  2 ast,nvidia_drm
drm                   453521  5 ast,ttm,drm_kms_helper,nvidia_drm

minsky_test@minsky:~$ sudo rmmod nvidia_drm

minsky_test@minsky:~$ sudo rmmod nvidia_uvm

minsky_test@minsky:~$ sudo rmmod nvidia_modeset

minsky_test@minsky:~$ sudo rmmod nvidia

nvidia 관련 모듈이 다 없어진 것을 아래와 같이 확인합니다.

minsky_test@minsky:~$ sudo lsmod | grep nvidia
minsky_test@minsky:~$

이제 다시 nvidia-docker-plugin을 살립니다.  그러면 nvidia 관련 module들이 다시 load 됩니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ sudo ./nvidia-docker-plugin &

이제 nvidia-smi로 보면 driver 버전이 390.31로 올라온 것을 볼 수 있습니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ nvidia-smi
Wed May 16 17:32:17 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.31                 Driver Version: 390.31                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-SXM2...  Off  | 00000002:01:00.0 Off |                    0 |
| N/A   37C    P0    31W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-SXM2...  Off  | 00000003:01:00.0 Off |                    0 |
| N/A   36C    P0    30W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla P100-SXM2...  Off  | 0000000A:01:00.0 Off |                    0 |
| N/A   36C    P0    32W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla P100-SXM2...  Off  | 0000000B:01:00.0 Off |                    0 |
| N/A   31C    P0    31W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

이제 아까 exit했던 bsyu/tf1.3-ppc64le:v0.1의 container인 78d0b67e2c8d에 다시 attach 해보겠습니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ sudo ./nvidia-docker start 78d0b67e2c8d
78d0b67e2c8d

minsky_test@minsky:~/files/nvidia-docker/bin$ sudo ./nvidia-docker attach 78d0b67e2c8d
root@78d0b67e2c8d:/#

이 속에서 nvidia-smi 해봐도 다음과 같은 error만 납니다.

root@78d0b67e2c8d:/# nvidia-smi
Failed to initialize NVML: Driver/library version mismatch

이렇게 예전 버전의 384 driver를 가지고 구동된 container는 다시 제대로 작동시킬 방법이 없습니다.  새로 다시 시작해야 하는데, 그러자면 기존에 변경시켜둔 file 내용들이 날라갑니다.  그렇게 변경시켜둔 file들을 보존하려면 docker commit을 하시면 됩니다.  가령 아까 위에서 clone 받아둔 /models의 내용이 그대로 보존될 수 있습니다.

먼저 parent OS에서 다음과 같이 새로운 이름의 image로 해당 container id를 commit 합니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ ./nvidia-docker commit 78d0b67e2c8d bsyu/tf1.3-ppc64le:v0.2
sha256:4e5cf1b9f9672a41d2a71737f32a0d0f2a042d9162ab351433d16a828946d4f4

이제 새로 만들어진 bsyu/tf1.3-ppc64le:v0.2 image를 새로 start 합니다.

minsky_test@minsky:~/files/nvidia-docker/bin$ ./nvidia-docker run -ti bsyu/tf1.3-ppc64le:v0.2 bash

이제 nvidia-smi를 해보시면 새로운 driver version으로 잘 올라오는 것을 보실 수 있습니다.

root@53f8f0993f34:/# nvidia-smi
Wed May 16 08:39:33 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.31                 Driver Version: 390.31                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-SXM2...  Off  | 00000002:01:00.0 Off |                    0 |
| N/A   34C    P0    30W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-SXM2...  Off  | 00000003:01:00.0 Off |                    0 |
| N/A   34C    P0    30W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla P100-SXM2...  Off  | 0000000A:01:00.0 Off |                    0 |
| N/A   33C    P0    31W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla P100-SXM2...  Off  | 0000000B:01:00.0 Off |                    0 |
| N/A   29C    P0    31W / 300W |     10MiB / 16280MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

물론 /models directory도 그대로 잘 보존되어 있습니다.

root@53f8f0993f34:/# cd /models/tutorials/image/cifar10
root@53f8f0993f34:/models/tutorials/image/cifar10# ls
BUILD      __init__.py  cifar10.py       cifar10_input.py       cifar10_multi_gpu_train.py
README.md  __pycache__  cifar10_eval.py  cifar10_input_test.py  cifar10_train.py

2018년 5월 15일 화요일

Redhat ppc64le 환경에서의 OpenJDK 9과 OpenJFX의 build

앞선 posting은 OpenJDK 8에서 OpenJFX를 올린 것이었습니다만, 현재 OpenJFX의 current version은 JDK 9부터 지원됩니다.   이번 posting에서는 OpenJDK 9을 ppc64le 환경에서 build하고, 그를 지원하는 OpenJFX도 build해보겠습니다.

사전에 필요한 rpm package는 전과 동일하게 설치합니다.

[ibm@centos01 ~]$ sudo yum install mercurial bison flex gperf ksh pkgconfig libpng12-devel libjpeg-devel libxml2-devel libxslt-devel systemd-devel glib2-devel  gtk2-devel pango-devel freetype-devel ant alsa-lib-devel freetype-devel cups-devel libXtst-devel libXt-devel libXrender-devel libXi-devel libX11-devel libXext-devel libffi-devel ccache make gcc gcc-c++ libstdc++-devel giflib-devel curl rpm-build gpg rpmbuild rpm-sign

OpenJFX의 current version에서는 gradle 4.3이 필요합니다.

[ibm@centos01 files]$  wget https://services.gradle.org/distributions/gradle-4.3-all.zip

[ibm@centos01 files]$ unzip gradle-4.3-all.zip

[ibm@centos01 files]$ cd gradle-4.3/bin

[ibm@centos01 bin]$ ./gradle --version

------------------------------------------------------------
Gradle 4.3
------------------------------------------------------------

Build time:   2017-10-30 15:43:29 UTC
Revision:     c684c202534c4138b51033b52d871939b8d38d72

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_161 (Oracle Corporation 25.161-b14)
OS:           Linux 3.10.0-693.11.6.el7.ppc64le ppc64le


이제 JDK 9 부터 build 합니다.

[ibm@centos01 ~]$ mkdir ~/openjdkathome && cd ~/openjdkathome

[ibm@centos01 openjdkathome]$ git clone https://github.com/hgomez/obuildfactory.git

다음과 같이 명령을 내리면 hg 명령을 통해 source를 추가로 download 받는 것부터 compile까지 일괄적으로 이루어집니다.  hg download 과정이 특히 오래 걸리고 compile도 무척 많은 CPU를 사용하며 오래 걸린다는 점에 유의하십시요.

[ibm@centos01 openjdkathome]$ XUSE_NEW_BUILD_SYSTEM=true XBUILD=true ./obuildfactory/openjdk9/linux/standalone-job.sh
...
Creating jre jimage
Creating jdk jimage
WARNING: Using incubator modules: jdk.incubator.httpclient
WARNING: Using incubator modules: jdk.incubator.httpclient
Stopping sjavac server
Finished building target 'images' in configuration 'linux-x86-normal-server-release'
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-adhoc.ibm.openjdk9)
OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.ibm.openjdk9, mixed mode)
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-adhoc.ibm.openjdk9)
OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.ibm.openjdk9, mixed mode)
~/openjdkathome/sources/openjdk9/build/linux-x86-normal-server-release/images ~/openjdkathome
produced tarball files under /home/ibm/openjdkathome/OBF_DROP_DIR/openjdk9
-rw-rw-r--. 1 ibm ibm 337406797 May 14 10:36 /home/ibm/openjdkathome/OBF_DROP_DIR/openjdk9/jdk-ppc64le-b94-20180514.tar.bz2
-rw-rw-r--. 1 ibm ibm 188142592 May 14 10:37 /home/ibm/openjdkathome/OBF_DROP_DIR/openjdk9/jre-ppc64le-b94-20180514.tar.bz2
~/openjdkathome

생선된 tar ball은 아래 directory에 있습니다.  JDK와 JRE가 각각 하나씩 만들어집니다.

[ibm@centos01 openjdkathome]$ ls -l OBF_DROP_DIR/openjdk9
total 513236
-rw-rw-r--. 1 ibm ibm 337406797 May 14 10:36 jdk-ppc64le-b94-20180514.tar.bz2
-rw-rw-r--. 1 ibm ibm 188142592 May 14 10:37 jre-ppc64le-b94-20180514.tar.bz2

우리는 여기서 JDK를 설치할 것입니다.  다음과 같이 /usr/local에 풀어놓고 JAVA_HOME 및 PATH를 설정해주시면 됩니다.

[ibm@centos01 openjdkathome]$ cd /usr/local

[ibm@centos01 local]$ sudo tar -jxvf ~/openjdkathome/OBF_DROP_DIR/openjdk9/jdk-ppc64le-b94-20180514.tar.bz2

[ibm@centos01 local]$ export JAVA_HOME=/usr/local/jdk
[ibm@centos01 local]$ export PATH=$JAVA_HOME/bin:/home/ibm/files/gradle-4.3/bin:$PATH

[ibm@centos01 local]$ java -fullversion
openjdk full version "9-internal+0-adhoc.ibm.openjdk9"

이제 open JFX의 source code를 받아옵니다.  Mericurial의 hg 명령을 써서 가져오는데, 처음 몇 분 정도는 source를 전혀 못 가져오고 hang만 걸려 있는 것처럼 보이지만 한 10~20분 기다리니 결국은 받아오니 인내심을 가지시기 바랍니다.   또는 지난 번처럼 github에서 받아오셔도 됩니다.  github에서 받아오는 것이 훨씬 빠릅니다.

[ibm@centos01 files]$ hg clone http://hg.openjdk.java.net/openjfx/jfx-dev/rt
destination directory: rt
requesting all changes
adding changesets
adding manifests
adding file changes
added 10923 changesets with 178749 changes to 85736 files
updating to branch default
31760 files updated, 0 files merged, 0 files removed, 0 files unresolved

[ibm@centos01 files]$ cd ../rt

[ibm@centos01 rt]$ ls -ltr
total 300
-rw-rw-r--.  1 ibm ibm    116 May 14 10:13 README
-rw-rw-r--.  1 ibm ibm  19274 May 14 10:13 LICENSE
-rw-rw-r--.  1 ibm ibm   1522 May 14 10:13 ASSEMBLY_EXCEPTION
-rw-rw-r--.  1 ibm ibm   2114 May 14 10:13 ADDITIONAL_LICENSE_INFO
drwxrwxr-x.  7 ibm ibm    102 May 14 10:13 apps
-rw-rw-r--.  1 ibm ibm   3166 May 14 10:13 build.properties
-rw-rw-r--.  1 ibm ibm 232809 May 14 10:13 build.gradle
drwxrwxr-x.  5 ibm ibm     60 May 14 10:13 dependencies
drwxrwxr-x.  4 ibm ibm    272 May 14 10:13 buildSrc
drwxrwxr-x. 26 ibm ibm   4096 May 14 10:13 netbeans
-rw-rw-r--.  1 ibm ibm   2176 May 14 10:13 gradlew.bat
-rw-rw-r--.  1 ibm ibm   5296 May 14 10:13 gradlew
-rw-rw-r--.  1 ibm ibm  13404 May 14 10:13 gradle.properties.template
drwxrwxr-x.  4 ibm ibm     34 May 14 10:13 gradle
drwxrwxr-x.  2 ibm ibm     49 May 14 10:13 doc-files
-rw-rw-r--.  1 ibm ibm   2275 May 14 10:13 settings.gradle
drwxrwxr-x.  6 ibm ibm    123 May 14 10:13 tests
drwxrwxr-x. 12 ibm ibm    215 May 14 10:13 modules
drwxrwxr-x.  4 ibm ibm     36 May 14 10:13 tools

지난번 posting에서처럼, 여기서도 gradle에게 ppc64le도 지원하는 아키텍처라고 인식시키도록 다음 file을 살짝 수정해줍니다.  그러지 않을 경우 "FAIL: Unknown and unsupported build architecture: ppc64le" error를 만나시게 됩니다.

[ibm@centos01 rt]$ vi build.gradle
...
//} else if (IS_LINUX && OS_ARCH != "i386" && OS_ARCH != "amd64") {
} else if (IS_LINUX && OS_ARCH != "ppc64le" && OS_ARCH != "amd64") {
    fail("Unknown and unsupported build architecture: $OS_ARCH")
}


이제 grale을 수행해 보시면 잘 됩니다.

[ibm@centos01 rt]$ gradle
...
:zipSourceFilesStandaloneLinux
:buildModules
:createTestArgfilesLinux
:sdkLinux
:sdk

BUILD SUCCESSFUL in 2m 31s
111 actionable tasks: 111 executed

Build된 SDK는 build/modular-sdk 밑에 들어있습니다.

[ibm@centos01 rt]$ ls build/modular-sdk
make  modules  modules_conf  modules_legal  modules_libs  modules_src

다음과 같이 이 SDK가 제대로 build된 것인지 테스트해보겠습니다.

[ibm@centos01 rt]$ gradle :base:test
...
:sdk
:base:compileShimsJava UP-TO-DATE
:base:processShimsResources NO-SOURCE
:base:copyGeneratedShims UP-TO-DATE
:base:compileTestJava UP-TO-DATE
:base:processTestResources NO-SOURCE
:base:testClasses UP-TO-DATE
:base:test UP-TO-DATE

BUILD SUCCESSFUL in 10s
115 actionable tasks: 8 executed, 107 up-to-date

잘 됩니다.

[ibm@centos01 rt]$ du -sm .
1440    .

이제 이 rt directory를 tar로 돌돌 말면 됩니다.

[ibm@centos01 rt]$ cd ..

[ibm@centos01 files]$ tar -zcf openjfs.tgz rt

이 openjfs.tgz와 저 위에서 build한 jdk-ppc64le-b94-20180514.tar.bz2, jre-ppc64le-b94-20180514.tar.bz2은 아래 google drive에 올려두겠습니다.

openjfs.tgz    https://drive.google.com/open?id=1DYj_ZqzXsqSGNZ5cOuJVl9Dn9apJMCoo 

jdk-ppc64le-b94-20180514.tar.bz2   https://drive.google.com/open?id=17AVhSwUlPMLv7q975HpBE_wUc5bf-FdY

jre-ppc64le-b94-20180514.tar.bz2    https://drive.google.com/open?id=1On0UVyYOocDyImWxl28mDB2kopzsCVcE

2018년 5월 14일 월요일

Redhat ppc64le 환경에서 OpenJFX build하기 (OpenJDK 8)

먼저, 이 posting은 아래 OpenJFX install guide를 기본으로 따라한 것입니다.   저 link에 있는 좀 더 최신 버전의 JFX는 java 9을 필요로 하더군요.  아마 아직 Java 9보다는 java 8이 표준인 것 같아 OpenJDK 8 기준으로 이걸 작성했습니다.   OpenJDK 8을 지원하는 JFX는 8u 버전이며, 이는 또 gradle 버전 1.8만 지원합니다. 

https://wiki.openjdk.java.net/display/OpenJFX/Building+OpenJFX#BuildingOpenJFX-OracleEnterpriseLinux7andFedora21

먼저 필요 fileset들을 설치합니다.

[ibm@centos01 ~]$ sudo yum install mercurial bison flex gperf ksh pkgconfig libpng12-devel libjpeg-devel libxml2-devel libxslt-devel systemd-devel glib2-devel  gtk2-devel pango-devel freetype-devel ant alsa-lib-devel freetype-devel cups-devel libXtst-devel libXt-devel libXrender-devel libXi-devel libX11-devel libXext-devel libffi-devel ccache make gcc gcc-c++ libstdc++-devel giflib-devel curl rpm-build gpg rpmbuild rpm-sign

gradle 1.8을 download 합니다.

[ibm@centos01 files]$ wget https://services.gradle.org/distributions/gradle-1.8-all.zip

[ibm@centos01 files]$ unzip gradle-1.8-all.zip

[ibm@centos01 files]$ export PATH=~/files/gradle-1.8/bin:$PATH

[ibm@centos01 files]$ which gradle
~/files/gradle-1.8/bin/gradle

이제 source code를 download 받습니다.

[ibm@centos01 files]$ git clone https://github.com/javafxports/openjdk-jfx.git

[ibm@centos01 files]$ cd openjdk-jfx

그리고 OpenJDK 8을 지원하는 버전 중 비교적 최신인 8u51-b09로 checkout 합니다.

[ibm@centos01 openjdk-jfx]$ git checkout tags/8u51-b09

이제 gradle을 이용하여 JFX를 build합니다.  그러나 첫 시도는 아래와 같이 error로 끝납니다.

[ibm@centos01 openjdk-jfx]$ gradle
...
FAILURE: Build failed with an exception.

* Where:
Build file '/home/ibm/files/openjdk-jfx/build.gradle' line: 250

* What went wrong:
A problem occurred evaluating root project 'openjdk-jfx'.
> FAIL: Unknown and unsupported build architecture: ppc64le

이는 다음과 같이 ppc64le일 경우도 그냥 build하도록 308번째 line을 바꿔주면 해결됩니다.


[ibm@centos01 openjdk-jfx]$ vi /home/ibm/files/openjdk-jfx/build.gradle
...
// } else if (IS_LINUX && OS_ARCH != "i386" && OS_ARCH != "amd64") {
} else if (IS_LINUX && OS_ARCH != "ppc64le" && OS_ARCH != "amd64") {
    fail("Unknown and unsupported build architecture: $OS_ARCH")
}

이제 다시 gradle을 수행합니다.   다음과 같이 잘 됩니다.

[ibm@centos01 openjdk-jfx]$ gradle
...
:swt:assemble
:systemTests:compileJava UP-TO-DATE
:systemTests:processResources UP-TO-DATE
:systemTests:classes UP-TO-DATE
:systemTests:jar
:systemTests:assemble
:web:assemble
:jfxrtLinux
:jfxrtIndexLinux
:jfxswtLinux
:jfxswtIndexLinux
:jmxLinux
:copySources SKIPPED
:zipSources SKIPPED
:src SKIPPED
:sdkLinux
modules/graphics/build/libs/font/linux/libjavafx_font.so
modules/graphics/build/libs/prism/linux/libprism_common.so
modules/graphics/build/libs/prismSW/linux/libprism_sw.so
modules/graphics/build/libs/prismES2/linux/libprism_es2.so
modules/graphics/build/libs/glass/linux/libglass.so
modules/graphics/build/libs/iio/linux/libjavafx_iio.so
modules/graphics/build/libs/fontFreetype/linux/libjavafx_font_freetype.so
modules/graphics/build/libs/fontPango/linux/libjavafx_font_pango.so
:sdk

BUILD SUCCESSFUL

Total time: 3 mins 44.846 secs

이렇게 build된 binary들은 build/sdk에 생성되며, 물론 ppc64le용으로 만들어진 것입니다.

[ibm@centos01 openjdk-jfx]$ ls build/sdk
bin  lib  man  rt

[ibm@centos01 openjdk-jfx]$ ls build/sdk/bin
javafxpackager  javapackager

[ibm@centos01 openjdk-jfx]$ file build/sdk/rt/lib/ppc64le/libglass.so
build/sdk/rt/lib/ppc64le/libglass.so: ELF 64-bit LSB shared object, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, BuildID[sha1]=aba660bd5a3247c07b783eeede8ea6ce685f9070, not stripped

저 build directory를 통째로 tar로 말아 둡니다.

[ibm@centos01 openjdk-jfx]$ tar -zcvf openjdk-jfx.tgz build

[ibm@centos01 openjdk-jfx]$ ls -l openjdk-jfx.tgz
-rw-rw-r--. 1 ibm ibm 15540240 May 14 17:10 openjdk-jfx.tgz

위 파일을 아래 google drive에 올려두었습니다.

https://drive.google.com/open?id=19yjDL37nI-UecGaPirkwOSTws4fBgwJT

ppc64le 환경에서 ActiveMQ install 하기


한줄 요약 : 아래 google drive에 올려놓은 ppc64le용 apache-activemq-5.15.2-bin.tar.gz 파일을 적절한 위치에 풀어놓으시면 됩니다.  이건 제가 Ubuntu 16.04 ppc64le에서 build한 것입니다.

https://drive.google.com/open?id=10ZOMhhcxEMwbYT0w7aJKDi6EpVS0N9JS

이 파일은 아래와 같이 build된 것입니다.  아래 ActiveMQ homepage에 나온 instruction대로 build하시면 됩니다.

http://activemq.apache.org/version-5-getting-started.html#GettingStarted-UnixSourceInstallation

먼저 JAVA_HOME을 설정합니다.  IBM ppc64le용 Ubuntu의 경우, 아래와 같이 되어 있습니다.

u0017649@sys-93315:~$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 48 Jan  4 20:38 /etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-ppc64el/jre/bin/java

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

그리고 이 ActiveMQ는 maven으로 build되는 SW입니다.  다음과 같이 mvn을 설치합니다.

u0017649@sys-93315:~$ sudo apt-get install maven

이제 source code를 download 받습니다.

u0017649@sys-93315:~$ git clone https://github.com/apache/activemq.git

u0017649@sys-93315:~$ cd activemq

이제 mvn으로 package build를 하시면 되는데, 첫 시도에서는 다음과 같이 error가 납니다.

u0017649@sys-93315:~/activemq$ mvn clean package -Dmaven.test.skip=true

[ERROR] Failed to execute goal on project activemq-kahadb-store: Could not resolve dependencies for project org.apache.activemq:activemq-kahadb-store:jar:5.16.0-SNAPSHOT: Could not find artifact org.apache.activemq:activemq-broker:jar:tests:5.16.0-SNAPSHOT in apache.snapshots (https://repository.apache.org/snapshots) -> [Help 1]

이건 그냥 activemq 최신 버전인 5.15.3의 bug이며, ppc64le 아키텍처와는 무관한 것입니다.  구글링해보시면 x86에서도 같은 error들이 많이 report된 것을 보실 수 있습니다.

http://activemq.2283324.n4.nabble.com/Building-ActiveMQ-td4728361.html

이 error는 그냥 minor version을 하나 내린 5.15.2로 해보면 금방 해결됩니다.  다음과 같이 checkout 하십시요.

u0017649@sys-93315:~/activemq$ git checkout tags/activemq-5.15.2

그리고나서 다시 mvn package 명령을 내리시면 됩니다.

u0017649@sys-93315:~/activemq$ mvn clean package -Dmaven.test.skip=true
...
[INFO] Building zip: /home/u0017649/activemq/assembly/target/apache-activemq-5.15.2-bin.zip
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] ActiveMQ ........................................... SUCCESS [  1.972 s]
[INFO] ActiveMQ :: Openwire Generator ..................... SUCCESS [  5.275 s]
[INFO] ActiveMQ :: Client ................................. SUCCESS [ 16.029 s]
[INFO] ActiveMQ :: Openwire Legacy Support ................ SUCCESS [  4.506 s]
[INFO] ActiveMQ :: JAAS ................................... SUCCESS [  6.235 s]
[INFO] ActiveMQ :: Broker ................................. SUCCESS [  6.564 s]
[INFO] ActiveMQ :: KahaDB Store ........................... SUCCESS [  4.021 s]
[INFO] ActiveMQ :: STOMP Protocol ......................... SUCCESS [  1.134 s]
[INFO] ActiveMQ :: MQTT Protocol .......................... SUCCESS [  2.055 s]
[INFO] ActiveMQ :: JDBC Store ............................. SUCCESS [  1.008 s]
[INFO] ActiveMQ :: LevelDB Store .......................... SUCCESS [01:10 min]
[INFO] ActiveMQ :: Generic JMS Pool ....................... SUCCESS [  0.898 s]
[INFO] ActiveMQ :: Pool ................................... SUCCESS [  0.753 s]
[INFO] ActiveMQ :: RA ..................................... SUCCESS [  1.790 s]
[INFO] ActiveMQ :: Spring ................................. SUCCESS [ 11.830 s]
[INFO] ActiveMQ :: Console ................................ SUCCESS [  2.446 s]
[INFO] ActiveMQ :: Partition Management ................... SUCCESS [  0.889 s]
[INFO] ActiveMQ :: Runtime Configuration .................. SUCCESS [ 17.503 s]
[INFO] ActiveMQ :: Tooling ................................ SUCCESS [  0.028 s]
[INFO] ActiveMQ :: JUnit Rule ............................. SUCCESS [  0.342 s]
[INFO] ActiveMQ :: Unit Tests ............................. SUCCESS [  2.850 s]
[INFO] ActiveMQ :: HTTP Protocol Support .................. SUCCESS [  3.166 s]
[INFO] ActiveMQ :: AMQP ................................... SUCCESS [  1.300 s]
[INFO] ActiveMQ :: Camel .................................. SUCCESS [  3.726 s]
[INFO] ActiveMQ :: All JAR bundle ......................... SUCCESS [  3.952 s]
[INFO] ActiveMQ :: Log4j Appender ......................... SUCCESS [  0.270 s]
[INFO] ActiveMQ :: Apache Karaf ........................... SUCCESS [  1.795 s]
[INFO] ActiveMQ :: ConnectionFactory ...................... SUCCESS [  1.334 s]
[INFO] ActiveMQ :: RAR .................................... SUCCESS [  1.663 s]
[INFO] ActiveMQ :: Run Jar ................................ SUCCESS [  0.499 s]
[INFO] ActiveMQ :: Shiro .................................. SUCCESS [  0.785 s]
[INFO] ActiveMQ :: Memory Usage Test Plugin ............... SUCCESS [  2.519 s]
[INFO] ActiveMQ :: Performance Test Plugin ................ SUCCESS [  2.504 s]
[INFO] ActiveMQ :: StartUp/Stop Plugin .................... SUCCESS [  4.245 s]
[INFO] ActiveMQ :: Web .................................... SUCCESS [  1.134 s]
[INFO] ActiveMQ :: OSGi bundle ............................ SUCCESS [ 12.958 s]
[INFO] ActiveMQ :: Blueprint .............................. SUCCESS [  0.235 s]
[INFO] ActiveMQ :: Web Demo ............................... SUCCESS [ 14.682 s]
[INFO] ActiveMQ :: Web Console ............................ SUCCESS [  5.986 s]
[INFO] ActiveMQ :: Karaf Integration Tests ................ SUCCESS [  2.232 s]
[INFO] ActiveMQ :: Integration Test :: Spring 3.1 ......... SUCCESS [  0.097 s]
[INFO] ActiveMQ :: Assembly ............................... SUCCESS [ 17.442 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 04:05 min
[INFO] Finished at: 2018-05-13T22:44:49-04:00
[INFO] Final Memory: 159M/558M
[INFO] ------------------------------------------------------------------------

생성된 package file은 아래 directory에 tag.gz과 zip의 두가지 형태로 되어 있습니다.

u0017649@sys-93315:~/activemq$ ls -l assembly/target/apach*
-rw-rw-r-- 1 u0017649 u0017649 57997764 May 13 22:44 assembly/target/apache-activemq-5.15.2-bin.tar.gz
-rw-rw-r-- 1 u0017649 u0017649 65138709 May 13 22:44 assembly/target/apache-activemq-5.15.2-bin.zip

이렇게 build된 file을 아래와 같이 원하는 directory에 풀어놓고 관련 환경변수만 잡아주시면 사용하실 수 있습니다.

u0017649@sys-93315:~/activemq$ cd /usr/local

u0017649@sys-93315:/usr/local$ sudo tar -zxvf ~/activemq/assembly/target/apache-activemq-5.15.2-bin.tar.gz

u0017649@sys-93315:~$ export PATH=/usr/local/apache-activemq-5.15.2/bin:$PATH

u0017649@sys-93315:~$ export LD_LIBRARY_PATH=/usr/local/apache-activemq-5.15.2/lib:$LD_LIBRARY_PATH

u0017649@sys-93315:~$ activemq --help
INFO: Loading '/usr/local/apache-activemq-5.15.2//bin/env'
INFO: Using java '/usr/bin/java'
Java Runtime: Oracle Corporation 1.8.0_171 /usr/lib/jvm/java-8-openjdk-ppc64el/jre
  Heap sizes: current=62976k  free=62320k  max=932352k
    JVM args: -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/usr/local/apache-activemq-5.15.2//conf/login.config -Dactivemq.classpath=/usr/local/apache-activemq-5.15.2//conf:/usr/local/apache-activemq-5.15.2//../lib/: -Dactivemq.home=/usr/local/apache-activemq-5.15.2/ -Dactivemq.base=/usr/local/apache-activemq-5.15.2/ -Dactivemq.conf=/usr/local/apache-activemq-5.15.2//conf -Dactivemq.data=/usr/local/apache-activemq-5.15.2//data
Extensions classpath:
  [/usr/local/apache-activemq-5.15.2/lib,/usr/local/apache-activemq-5.15.2/lib/camel,/usr/local/apache-activemq-5.15.2/lib/optional,/usr/local/apache-activemq-5.15.2/lib/web,/usr/local/apache-activemq-5.15.2/lib/extra]
ACTIVEMQ_HOME: /usr/local/apache-activemq-5.15.2
ACTIVEMQ_BASE: /usr/local/apache-activemq-5.15.2
ACTIVEMQ_CONF: /usr/local/apache-activemq-5.15.2/conf
ACTIVEMQ_DATA: /usr/local/apache-activemq-5.15.2/data
Usage: Main [--extdir <dir>] [task] [task-options] [task data]

Tasks:
    browse                   - Display selected messages in a specified destination.
    bstat                    - Performs a predefined query that displays useful statistics regarding the specified broker
    consumer                 - Receives messages from the broker
    create                   - Creates a runnable broker instance in the specified path.
    decrypt                  - Decrypts given text
    dstat                    - Performs a predefined query that displays useful tabular statistics regarding the specified destination type
    encrypt                  - Encrypts given text
    export                   - Exports a stopped brokers data files to an archive file
    list                     - Lists all available brokers in the specified JMX context
    producer                 - Sends messages to the broker
    purge                    - Delete selected destination's messages that matches the message selector
    query                    - Display selected broker component's attributes and statistics.
    start                    - Creates and starts a broker using a configuration file, or a broker URI.
    stop                     - Stops a running broker specified by the broker name.

Task Options (Options specific to each task):
    --extdir <dir>  - Add the jar files in the directory to the classpath.
    --version       - Display the version information.
    -h,-?,--help    - Display this help information. To display task specific help, use Main [task] -h,-?,--help

Task Data:
    - Information needed by each specific task.

JMX system property options:
    -Dactivemq.jmx.url=<jmx service uri> (default is: 'service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi')
    -Dactivemq.jmx.user=<user name>
    -Dactivemq.jmx.password=<password>

2018년 5월 11일 금요일

ppc64le 환경에서 NVIDIA DIGITS의 설치

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

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

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

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

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

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

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

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

[ibm@centos01 caffe]$ make pycaffe

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

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

[ibm@centos01 ~]$ cd DIGITS

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

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

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

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

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

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

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

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

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

ImportError: No module named skfmm

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

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

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

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

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



2018년 5월 10일 목요일

Minsky Ubuntu16.04에서 tensorflow 1.5.1 build하기

P100을 장착한 Ubuntu 16.04 환경의 Minsky 서버에는 원래 CUDA 8.0과 PowerAI에 딸린 tensorflow 1.0(python2)을 주로 썼습니다.  물론 Minsky 서버에도 Ubuntu 16.04를 그대로 유지한 채 CUDA 9.1을 설치한 뒤 tensorflow 1.5.1을 설치하여 쓸 수 있습니다.  여기서는 python3 환경입니다. 

u0017649@sys-93315:~$ sudo apt-get install libaprutil1-dev ant cmake automake libtool-bin openssl libcurl4-openssl-dev

전에는 bazel-0.8.1을 썼습니다만, 요즘의 openjdk 1.8.0_151 환경에서는 이 bazel 버전은 다음과 같은 error를 냅니다.

ERROR: /home/minsky/files/bazel-0.8.1/src/main/java/com/google/devtools/common/options/BUILD:27:1: Building src/main/java/com/google/devtools/common/options/liboptions_internal.jar (35 source files) failed (Exit 1): java failed: error executing command
  (cd /tmp/bazel_vQeTUQIe/out/execroot/io_bazel && \
  exec env - \
    LC_CTYPE=en_US.UTF-8 \
  external/local_jdk/bin/java -XX:+TieredCompilation '-XX:TieredStopAtLevel=1' -Xbootclasspath/p:third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar -jar bazel-out/host/bin/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/bootstrap_deploy.jar @bazel-out/ppc-opt/bin/src/main/java/com/google/devtools/common/options/liboptions_internal.jar-2.params)
java.lang.InternalError: Cannot find requested resource bundle for locale en_US

이 error는 bazel-0.10.0 버전을 쓰면 없어집니다.

u0017649@sys-93315:~$ wget https://github.com/bazelbuild/bazel/releases/download/0.10.0/bazel-0.10.0-dist.zip

u0017649@sys-93315:~$ which python
/home/u0017649/anaconda3/bin/python

u0017649@sys-93315:~$ conda install protobuf

u0017649@sys-93315:~$ which protoc
/home/u0017649/anaconda3/bin/protoc

u0017649@sys-93315:~$ export PROTOC=/home/u0017649/anaconda3/bin/protoc

u0017649@sys-93315:~$ mkdir bazel-0.10.0 && cd bazel-0.10.0

u0017649@sys-93315:~/bazel-0.10.0$ unzip ../bazel-0.10.0-dist.zip

u0017649@sys-93315:~/bazel-0.10.0$ ./compile.sh

u0017649@sys-93315:~/bazel-0.10.0$ sudo cp output/bazel /usr/local/bin

u0017649@sys-93315:~$ git clone https://github.com/tensorflow/tensorflow

u0017649@sys-93315:~$ cd tensorflow

u0017649@sys-93315:~/tensorflow$ git checkout tags/v1.5.1

u0017649@sys-93315:~/tensorflow$ vi configure.py
...
#    default_cc_opt_flags = '-mcpu=native'
    default_cc_opt_flags = '-mcpu=power8'
  else:
#    default_cc_opt_flags = '-march=native'
    default_cc_opt_flags = '-mcpu=power8'
...
#  write_to_bazelrc('build:opt --host_copt=-march=native')
  write_to_bazelrc('build:opt --host_copt=-mcpu=power8')
...

u0017649@sys-93315:~/tensorflow$ ./configure
...
Do you wish to build TensorFlow with Google Cloud Platform support? [Y/n]: n
...
Do you wish to build TensorFlow with Amazon S3 File System support? [Y/n]: n
...
Do you wish to build TensorFlow with CUDA support? [y/N]: y

Please specify the CUDA SDK version you want to use, e.g. 7.0. [Leave empty to default to CUDA 9.0]: 9.1
...
Please specify the cuDNN version you want to use. [Leave empty to default to cuDNN 7.0]: 7
...
Please specify the location where cuDNN 7 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:/usr/local/cuda/lib64 
...
Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 3.5,5.2]6.0,7.0     #6.0은 P100, 7.0은 V100 입니다.
...

u0017649@sys-93315:~/tensorflow$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

u0017649@sys-93315:~/tensorflow$ bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/tensorflow_pkg

u0017649@sys-93315:~/tensorflow$ pip install ~/tensorflow_pkg/tensorflow-1.5.1-cp36-cp36m-linux_ppc64le.whl

확인은 다음과 같이 합니다.

u0017649@sys-93315:~$ python
Python 3.6.4 |Anaconda, Inc.| (default, Feb 11 2018, 08:19:13)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> sess=tf.Session()

아래에 그렇게 만들어진 python3용 tensorflow-1.5.1-cp36-cp36m-linux_ppc64le.whl를 올려놓았습니다.   물론 이건 Ubuntu 환경에서든 Redhat 환경에서든 다 쓰실 수 있습니다.

https://drive.google.com/open?id=1CHIM-dgr0KcMJlHcc_I0fJUqBNs2czvL

그리고 아래는 python2용 tensorflow-1.5.1-cp27-cp27mu-linux_ppc64le.whl 입니다.

https://drive.google.com/open?id=1cTZAsLwyozPNufoZfeKIIaIJ7snYGC0M