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

댓글 없음:

댓글 쓰기