최근 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월 31일 목요일
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
$ 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
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
사전에 필요한 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
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부터 해보도록 하겠습니다.
[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부터 해보도록 하겠습니다.
피드 구독하기:
글 (Atom)