레이블이 julia인 게시물을 표시합니다. 모든 게시물 표시
레이블이 julia인 게시물을 표시합니다. 모든 게시물 표시

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