2018년 5월 31일 목요일

Tensorflow 1.8을 source에서 build하기 (CUDA 9.2, ppc64le, POWER9)

최근 IBM이 tensorflow 1.8을 ppc64le에서도 사용할 수 있다고 발표했습니다.  그 prerequisite은 CUDA 9.2가 설치되어 있는 환경이어야 한다는 점입니다.  아래 site에서 wheel file을 받아서 아래처럼 설치하면 간단히 쓸 수 있습니다.

[ibm@centos01 files]$ wget ftp://ftp.unicamp.br/pub/ppc64el/ai_frameworks/tensorflow/tensorflow-1.8.0-cp27-none-linux_ppc64le.whl

[ibm@centos01 files]$ which python
~/anaconda2/bin/python

[ibm@centos01 files]$ pip install tensorflow-1.8.0-cp27-none-linux_ppc64le.whl


그러나 위 site에는 python2.7을 위한 wheel file만 있습니다.  python3.6을 위한 tensorflow가 필요하시다면 직접 source에서 build하셔야 합니다.   현재로서는 이걸 build하실 때 아래와 같이 약간 source 수정이 필요합니다.

먼저, tensorflow 1.8.0에서는 기존 버전과 눈에 띄게 달라진 점이 있습니다.  NCCL ('니클'이라고 읽습니다) library를 사용한다는 점입니다.  따라서 NCCL을 먼저 설치해야 하는데, 다행히 쉽습니다.

[ibm@centos01 ~]$ git clone https://github.com/NVIDIA/nccl
[ibm@centos01 ~]$ cd nccl
[ibm@centos01 nccl]$ make
[ibm@centos01 nccl]$ sudo make install

python 버전이 3.x 인 것을 확인하십시요.

[ibm@centos01 ~]$ which python
~/anaconda3/bin/python

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

[ibm@centos01 ~]$ cd tensorflow

[ibm@centos01 tensorflow]$  git checkout tags/v1.8.0

예전 버전과 마찬가지로,  -march=native가 default로 들어가 있으면 error가 나므로 해당 부분을 다 -mcpu=power8으로 수정하십시요.

[ibm@centos01 tensorflow]$ vi ./configure.py
...
    default_cc_opt_flags = '-mcpu=power8'
...
    default_cc_opt_flags = '-mcpu=power8'
...
   write_to_bazelrc('build:opt --host_copt=-mcpu=power8')
...

그리고 configure를 수행합니다.  아래 표시된 질문 외에는 다 default 값을 택하시면 됩니다.

[ibm@centos01 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 Apache Kafka Platform 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.2
...
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-9.2
...
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
...

그리고나서 아래 issue #19291에 제시된 대로 third_party/png.BUILD 파일을 수정해주십시요.

https://github.com/tensorflow/tensorflow/pull/19291/commits/8f8a3c5151a674b3496691af49c3aa063841f292

[ibm@centos01 tensorflow]$ vi third_party/png.BUILD     #31번째 줄 대신 아래를 삽입

#    ],
    ] + select({
        "@org_tensorflow//tensorflow:linux_ppc64le": [
            "powerpc/powerpc_init.c",
            "powerpc/filter_vsx_intrinsics.c",
        ],
        "//conditions:default": [
        ],
    }),


//* 이 수정을 해주지 않으면 아래와 같은 error를 만나시게 됩니다.

ERROR: /home/ibm/.cache/bazel/_bazel_ibm/4869dbc4f6d1a096d34c86242ee59bba/external/boringssl/BUILD:115:1: C++ compilation of rule '@boringssl//:crypto' failed (Exit 1)
external/boringssl/src/crypto/pkcs8/pkcs8.c: In function 'ascii_to_ucs2':
external/boringssl/src/crypto/pkcs8/pkcs8.c:86:3: error: 'for' loop initial declarations are only allowed in C99 mode
   for (size_t i = 0; i < ulen - 2; i += 2) {
   ^
*//



이제 예전과 동일하세 bazel build 하시면 됩니다.

[ibm@centos01 tensorflow]$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
...
Target //tensorflow/tools/pip_package:build_pip_package up-to-date:
  bazel-bin/tensorflow/tools/pip_package/build_pip_package
INFO: Elapsed time: 8178.924s, Critical Path: 252.09s
INFO: Build completed successfully, 11585 total actions

예전에 비해 build 시간이 굉장히 길어진 것을 느끼실 겁니다.  이제 whl file을 만듭니다.

[ibm@centos01 tensorflow]$ bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/files/tensorflow_pkg

만들어진 whl file을 보면 확실히 기존 TF1.5.1보다 size도 2배 가량 커졌습니다.

[ibm@centos01 tensorflow]$ ls -l ~/files/tensorflow_pkg
total 162328
-rw-rw-r--. 1 ibm ibm  55160703 May  9 15:17 tensorflow-1.5.1-cp36-cp36m-linux_ppc64le.whl
-rw-rw-r--. 1 ibm ibm 111062624 May 31 16:07 tensorflow-1.8.0-cp36-cp36m-linux_ppc64le.whl

이 whl file을 설치하시면 됩니다.

[ibm@centos01 tensorflow]$ pip install ~/files/tensorflow_pkg/tensorflow-1.8.0-cp36-cp36m-linux_ppc64le.whl
...
      Successfully uninstalled numpy-1.13.1
Successfully installed absl-py-0.2.2 astor-0.6.2 gast-0.2.0 grpcio-1.12.0 markdown-2.6.11 numpy-1.14.3 tensorboard-1.8.0 tensorflow-1.8.0 termcolor-1.1.0

[ibm@centos01 tensorflow]$ pip list | grep tensor
tensorboard                        1.8.0
tensorflow                         1.8.0

이 TF1.8.0으로 Neural Machine Translation의 training과 inference를 수행해보면, 동일한 HW에서 기존 TF1.5.1의 수행 결과보다 더 빨라진 것 같지는 않습니다.

여기서 build한 tensorflow 1.8.0의 wheel file을 아래 google drive에 올려놓겠습니다.  이것을 사용하시려면 CUDA 9.2가 설치되어 있어야 한다는 점을 유의하시기 바랍니다.

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

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

RNN PTB benchmark 수행방법

CNN은 Image classification이나 object detection 같은 정적인 image 처리에 많이 사용됩니다.   그러나 기계 번역(machine translation)이나 동영상 captioning 등을 deep learning으로 처리할 때는 시계열(time-series) 분석 등을 통해 미래를 예측하는 것이 필요합니다.  여기에는 CNN 대신 LSTM과 같은 RNN을 사용합니다.

문제는 CNN과는 달리, RNN/LSTM은 그 본질상 data history를 참조해야 하므로 메모리 사용량이 많다는 점입니다.  당연히 시스템 대역폭이 전체 시스템 성능에 영향을 끼치게 됩니다.

RNN 관련 가장 일반적인 벤치마크는 tensorflow models에 포함되어 있는 language modeling이며, 이는 영어 단어 모음인 PTB dataset을 이용합니다.  이것을 이용하여 적절한 성능 벤치마크를 해볼 수 있습니다.  먼저, python3에 tensorflow 1.5.1을 설치한 환경을 준비합니다.

[u0017649@sys-93214 ~]$ git clone https://github.com/tensorflow/models.git

[u0017649@sys-93214 ~]$ cd models/tutorials/rnn/ptb

이 벤치마크에서 사용하는 PTB dataset은 아래와 같이 download 받을 수 있습니다.

[u0017649@sys-93214 ptb]$ wget http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz

[u0017649@sys-93215 ptb]$ tar -zxvf simple-examples.tgz

이제 다음과 같이 ptb_word_lm.py를 수행하면 됩니다.

[u0017649@sys-93214 ptb]$ time python ptb_word_lm.py --data_path=./simple-examples/data/ --model=large
...
Epoch: 1 Learning rate: 1.000
0.008 perplexity: 25072.184 speed: 1565 wps
0.107 perplexity: 1574.659 speed: 2033 wps
0.206 perplexity: 974.553 speed: 2057 wps
0.306 perplexity: 754.209 speed: 2065 wps
0.405 perplexity: 643.568 speed: 2069 wps
...
0.704 perplexity: 133.906 speed: 2085 wps
0.803 perplexity: 133.743 speed: 2085 wps
0.903 perplexity: 132.101 speed: 2085 wps
Epoch: 10 Train Perplexity: 131.618
Epoch: 10 Valid Perplexity: 117.277
Test Perplexity: 113.380
...

다만 이를 그대로 수행하면 무려 55 epochs를 수행하므로 (P100 4장으로 해도 약 3시간 정도), 좀 짧게 수행하시려면 아래와 같이 max_epoch과 max_max_epoch을 수정하시면 됩니다.   또 좀더 많은 hidden parameter를 사용하면 per word perplexity를 더 줄일 수 있는데, 대신 시간도 더 많이 걸리고 더 많은 메모리를 사용하게 됩니다.

[u0017649@sys-93214 ptb]$
...
class LargeConfig(object):
  """Large config."""
  init_scale = 0.04
  learning_rate = 1.0
  max_grad_norm = 10
  num_layers = 2
  num_steps = 2
  hidden_size = 1000
  max_epoch = 4  #원래 14
  max_max_epoch = 10   #원래 55
  keep_prob = 0.35
  lr_decay = 1 / 1.15
  batch_size = 20
  vocab_size = 10000
  rnn_mode = BLOCK
...

저는 --num_gpus=0 옵션을 쓰서 GPU가 없는 CPU 환경에서 수행했는데, 이때 위의 python program이 차지하는 real memory 사용량(ps aux에서 봤을 때의 Res Set 항목)을 보면 RNN이 정말 메모리를 dynamic하게 늘였다줄였다를 반복하는 것을 보실 수 있습니다.   아래는 10분 동안만 2초 간격으로 그 메모리 사용량을 모니터링한 결과입니다.  계속 저 패턴이 반복됩니다.



2018년 5월 4일 금요일

ppc64le 환경에서 gcc7과 cmake3을 source로부터 build


제목 그대로입니다.  gcc7과 cmake3을 source code로부터 build하는 방법은 비교적 간단합니다.   여기서는 Redhat 7.4 ppc64le 환경입니다.

단, gcc를 build할 때 make 부분은 (CPU power가 약하다면) 시간이 매우 오래 걸린다는 점에 유의하세요. 

먼저 사전에 필요한 package 설치합니다.

[u0017649@sys-93214 ~]$ sudo yum install yum install gmp-devel mpfr-devel libmpc-devel

gcc 7.2 source code부터 download 합니다.

[u0017649@sys-93214 ~]$ wget https://ftp.gnu.org/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.gz

[u0017649@sys-93214 ~]$ tar -zxvf gcc-7.2.0.tar.gz

[u0017649@sys-93214 ~]$ cd gcc-7.2.0

[u0017649@sys-93214 gcc-7.2.0]$ mkdir build && cd build

[u0017649@sys-93214 build]$ ../configure --enable-languages=c,c++,fortran

[u0017649@sys-93214 build]$ make -j 8

[u0017649@sys-93214 build]$ sudo make install

[u0017649@sys-93214 build]$ which gcc
/usr/local/bin/gcc

g++도 함께 설치됩니다.

[u0017649@sys-93214 build]$ which g++
/usr/local/bin/g++

다음으로 cmake 3.11 source code를 download 합니다.

[u0017649@sys-93214 ~]$ wget https://cmake.org/files/v3.11/cmake-3.11.1.tar.gz

[u0017649@sys-93214 ~]$ tar -zxvf cmake-3.11.1.tar.gz

[u0017649@sys-93214 ~]$ cd cmake-3.11.1

[u0017649@sys-93214 cmake-3.11.1]$ ./configure

[u0017649@sys-93214 cmake-3.11.1]$ make

[u0017649@sys-93214 cmake-3.11.1]$ sudo make install

[u0017649@sys-93214 cmake-3.11.1]$ which cmake
/usr/local/bin/cmake

[u0017649@sys-93214 cmake-3.11.1]$ cmake --version
cmake version 3.11.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).

2018년 5월 2일 수요일

요즘 anaconda 5.1 환경에서 많이 발생하는 undefined symbol error의 해결책

아래 URL에 나오는 간단한 LSTM 관련 python code를 수행하려고 하는데, 이런 error가 나는 경우가 있습니다.

https://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/


minsky@minsky:~/exam$ python lstm1.py
...
    import scipy.special as spec
  File "/home/minsky/anaconda3/lib/python3.6/site-packages/scipy/special/__init__.py", line 6   40, in <module>
    from ._ufuncs import *
ImportError: /home/minsky/anaconda3/lib/python3.6/site-packages/scipy/special/_ufuncs.cpython   -36m-powerpc64le-linux-gnu.so: undefined symbol: _gfortran_stop_numeric_f08


이건 꼭 ppc64le 환경에서만 나는 error는 아닙니다.  그러나 최근에 저도 caffe를 build하면서 이와 유사한 undefined symbol error로 인해 고생을 한 적이 있습니다. 

이 error는 한줄 요약하면 올해 초에 release된 Anaconda 5.1 때문에 발생하는 것입니다.  그렇다고 Anaconda 5.1에 bug가 있는 것은 아니고, Anaconda 5.1을 build하기 위해 사용된 gcc 버전이 7.2.0이라는 것에 문제가 있는 것입니다.

minsky@minsky:~/exam$ 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.

저  undefined symbol error는 서로 다른 버전의 gcc로 compile된 object file들을 하나로 link할 때 주로 발생합니다.  따라서 Anaconda 5.1 환경에서 gcc로 뭔가 build할 때는 gcc 버전도 7.2로 맞추는 것이 좋습니다.  그러나 Redhat 7.4의 경우 포함된 gcc의 default 버전은 4.8이고, Ubuntu 16.04도 5.4에 불과합니다.

minsky@minsky:~/exam$ gcc --version
gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

다시 말해, Anaconda 5.1에 포함된 python library들은 gcc 7.2로 compile된 것에 비해 OS에 포함된 gcc 버전은 훨씬 낮기 때문에 이 문제가 발생합니다. 

이 문제를 해결하려면 어떻게 해야 할까요 ?  가장 간단한 방법은 Anaconda 5.0을 쓰는 것입니다.  이 버전은 gcc 4.8로 compile되었거든요. 

https://repo.continuum.io/archive/

Filename Size Last Modified MD5
Anaconda2-5.1.0-Linux-ppc64le.sh 267.3M 2018-02-15 09:08:49 e894dcc547a1c7d67deb04f6bba7223a
Anaconda3-5.1.0-Linux-ppc64le.sh 285.7M 2018-02-15 09:08:56 47b5b2b17b7dbac0d4d0f0a4653f5b1c
Anaconda2-5.0.0-Linux-ppc64le.sh 282.3M 2017-09-26 16:25:07 157890d591c61a9b511f8452476d6d19
Anaconda3-5.0.0-Linux-ppc64le.sh 296.3M 2017-09-25 14:39:31 8fe5b29ca5be3ff11411621f79babfc2

아래와 같이 Anaconda 5.0을 download 받아 설치하면 그 속에 든 python은 GCC 4.8.4로 build된 것을 보실 수 있습니다.

minsky@minsky:~/files$ wget https://repo.continuum.io/archive/Anaconda3-5.0.0-Linux-ppc64le.sh

minsky@minsky:~/exam$ which python
/home/minsky/anaconda3_50/bin/python

minsky@minsky:~/exam$ python
Python 3.6.2 |Anaconda, Inc.| (default, Sep 15 2017, 20:38:23)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.

이제 새로 설치된 Anaconda 환경에 keras와 tensorflow를 설치합니다. 

minsky@minsky:~/exam$ pip install keras

minsky@minsky:~/exam$ pip install ~/files/tensorflow_pkg/tensorflow-1.3.1-cp36-cp36m-linux_ppc64le.whl

이제 아까 돌리려 했던 lstm1.py를 다시 수행해보는데, 이번엔 또 색다른 error가 납니다.

minsky@minsky:~/exam$ python lstm1.py
Using TensorFlow backend.
RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb
ImportError: numpy.core.multiarray failed to import
...

이건 numpy의 버전이 낮아서 생기는 문제입니다.  numpy를 upgrade하면 해결됩니다.

minsky@minsky:~/exam$ pip install numpy --upgrade

minsky@minsky:~/exam$ time python lstm1.py
/home/minsky/anaconda3_50/lib/python3.6/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
Using TensorFlow backend.
...
 - 4s - loss: 0.0057
Epoch 1/1
 - 1s - loss: 0.0141
Epoch 1/1
 - 1s - loss: 0.0099
Epoch 1/1
 - 1s - loss: 0.0072
Epoch 1/1
...
Epoch 1/1
 - 1s - loss: 0.0039
Epoch 1/1
 - 1s - loss: 0.0038
Epoch 1/1
 - 1s - loss: 0.0038
Epoch 1/1
 - 1s - loss: 0.0037
Epoch 1/1
 - 1s - loss: 0.0036
Train Score: 29.74 RMSE
Test Score: 79.26 RMSE

real    2m12.613s
user    3m1.860s
sys     0m9.948s


다만 이 sample code는 아래와 같이 CPU도 GPU도 사용량이 그다지 많지 않습니다.  따라서 POWER 아키텍처의 장점인 intel x86 대비 2배에 가까운 memory bandwidth를 보여주기에는 적절한 예는 아닌 것으로 생각됩니다.