2019년 9월 18일 수요일

IBM POWER에서 Julia를 source로부터 build 하기



Redhat 7.6 ppc64le 위에서 docker를 이용하여 Ubuntu 18.04 ppc64le 환경을 만들고 그 위에서 Julia 1.2.0을 source로부터 build하는 과정입니다.

먼저 root user로 기존에 jupyter 및 scipy-notebook이 설치된 ppc64le용 docker image를 구동합니다.

[user609@c609-kvm1 ~]$ sudo docker run -ti --rm --user root -e NB_GID=100 -e GEN_CERT=yes -e GRANT_SUDO=yes brlee/jupyter:scipy-notebook bash

먼저 julia 관련 환경 변수를 설정합니다.

root@5b95ee340ef3:~# cd /opt

root@5b95ee340ef3:/opt# export JULIA_DEPOT_PATH=/opt/julia
root@5b95ee340ef3:/opt# export JULIA_PKGDIR=/opt/julia
root@5b95ee340ef3:/opt# export JULIA_VERSION=1.2.0

root@5b95ee340ef3:/opt# mkdir /opt/julia-${JULIA_VERSION}

그리고나서 julia의 source를 github에서 download 받습니다.

root@5b95ee340ef3:/opt# cd /tmp

root@5b95ee340ef3:/tmp# git clone git://github.com/JuliaLang/julia.git

root@5b95ee340ef3:/tmp# cd julia

또한 julia build에 필요한 OS package들을 설치해야 합니다.

root@5b95ee340ef3:/tmp/julia# apt-get update

root@5b95ee340ef3:/tmp/julia# apt-get install -y gfortran fonts-dejavu gcc libreadline-dev readline-common libx11-dev libxt-dev libbz2-dev liblzma-dev libpcre2-dev libpcre3-dev  libcurl4-gnutls-dev gfortran-5-powerpc-linux-gnu texlive-latex-base texinfo texlive-fonts-extra openjdk-8-jdk openjdk-8-jdk-headless vim libmbedtls-dev libmbedcrypto1 m4 libssh2-1-dev

이렇게 설치가 되어 있더라, 현재 버전에서는 일부 파일들의 버전이 정확히 맞지가 않아서 error가 좀 있습니다.  이는 다음과 같이 그냥 다른 버전의 이름으로 soft link를 걸어서 해결할 수 있습니다.

root@5b95ee340ef3:/tmp/julia# ln -s /usr/lib/powerpc64le-linux-gnu/libmbedtls.so.10 /usr/lib/powerpc64le-linux-gnu/libmbedtls.so.12

root@5b95ee340ef3:/tmp/julia# ln -s /usr/lib/powerpc64le-linux-gnu/libmbedcrypto.so.2.8.0 /usr/lib/powerpc64le-linux-gnu/libmbedcrypto.so.3

우리가 여기서 compile할 것은 v1.2.0 입니다.

root@5b95ee340ef3:/tmp/julia# git checkout tags/v1.2.0

Build 자체는 매우 쉽습니다.  그냥 make 하시면 됩니다.   그런데 그렇게 하면 일단 error가 납니다.  다음과 같이 "ELF load command alignment not page-aligned" error 입니다.  이는 아마도 POWER architecture에서 huge page를 사용하기 때문에 발생하는 것일 수 있습니다.

root@5b95ee340ef3:/tmp/julia# nohup make -j8 &
...
Serialization  ──  1.911660 seconds
Libdl  ──────────  0.074467 seconds
Markdown  ───────  1.986755 seconds
error during bootstrap:
LoadError("sysimg.jl", 16, LoadError("/tmp/julia/usr/share/julia/stdlib/v1.2/LibGit2/src/LibGit2.jl", 21, LoadError("/tmp/julia/usr/share/julia/stdlib/v1.2/LibGit2/src/utils.jl", 44, ErrorException("error compiling version: could not load library \"libgit2\"\nlibcurl.so.4: ELF load command alignment not page-aligned"))))
rec_backtrace at /tmp/julia/src/stackwalk.c:94
record_backtrace at /tmp/julia/src/task.c:219 [inlined]
...

이 문제는 다음과 같이 몇개의 so 파일을 docker image 내의 OS file들로 교체하면 간단히 해결됩니다.

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libcurl.so.4.5.0 ./usr/lib/libcurl.so.4

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libmbedtls.so.2.8.0 ./usr/lib/libmbedtls.so.2.16.0

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libmbedtls.so.2.8.0 ./usr/lib/libmbedtls.so.2.6.0

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libmbedtls.so.2.8.0 ./deps/scratch/mbedtls-2.6.0-gpl/library/libmbedtls.so.2.6.0

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libssh2.so.1.0.1 ./deps/scratch/libssh2-30e9c1347e3b8baa2951db612f05e6d87fc8e2f2/src/libssh2.so.1.0.1

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libssh2.so.1.0.1 ./deps/scratch/libssh2-30e9c1347e3b8baa2951db612f05e6d87fc8e2f2/tests/libssh2.so.1.0.1

root@5b95ee340ef3:/tmp/julia# cp /usr/lib/powerpc64le-linux-gnu/libssh2.so.1.0.1 ./usr/lib/libssh2.so.1.0.1

그 다음에 다시 make를 수행하면 성공적으로 잘 build 됩니다.

root@5b95ee340ef3:/tmp/julia# make
...
REPL  ───────────  1.273557 seconds
Statistics  ─────  0.487972 seconds
Stdlibs total  ── 93.832328 seconds
Sysimage built. Summary:
Total ─────── 146.463495 seconds
Base: ───────  52.627857 seconds 35.9324%
Stdlibs: ────  93.832328 seconds 64.0653%
    JULIA usr/lib/julia/sys-o.a
Generating precompile statements... 898 generated in 131.715009 seconds (overhead  97.270528 seconds)
    LINK usr/lib/julia/sys.so

root@5b95ee340ef3:/tmp/julia# make install

이제 docker image size를 줄이기 위해 불필요한 file을 제거합니다.

root@5b95ee340ef3:/tmp/julia# cd ..

root@5b95ee340ef3:/tmp# rm -rf julia

그 다음에 parent OS에서 docker image를 commit하면 됩니다.

[user609@c609-kvm1 ~]$ sudo docker commit 5b95ee340ef3 brlee/jupyter:julia-1.2.0

이 image는 다음의 이름으로 public docker hub에 push해놓았습니다.

[user609@c609-kvm1 ~]$ sudo docker push brlee/jupyter:julia-1.2.0