** 이 문서에서 서술하는 방식으로 만든 이미지들의 완성본을 다음의 주소에서 받으실 수 있습니다. IBM GPU 서버인 AC922이나 Minsky 서버를 위한 Redhat 7.5 ppc64le + CUDA 9.2 + cudnn 7.2.1 + NCCL 2.2 + PowerAI 5.2 + Anaconda 2 (py2) or Anaconda3 (py3) 기반으로 만들어진 이미지들입니다.
https://hub.docker.com/r/bsyu/rhel75_ppc64le_cuda92_all_py2_powerai52/
https://hub.docker.com/r/bsyu/rhel75_ppc64le_cuda92_all_py3_powerai52/
Pull 할 때는 다음과 같이 하시면 됩니다.
# docker pull bsyu/rhel75_ppc64le_cuda92_all_py2_powerai52:v0.4 (python2.7)
# docker pull bsyu/rhel75_ppc64le_cuda92_all_py3_powerai52:v0.3 (python3.6)
아래는 이 docker image들을 만들 때의 과정입니다.
----------------------
먼저, 현재 host 서버의 OS(여기서는 Redhat 7.5 ALT ppc64le)를 기반으로 docker base image를 만듭니다. 아래 github에서 제공되는 mkimage-yum.sh를 사용하면 쉽습니다.
https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh
[root@ING ~]# cd docker
[root@ING docker]# vi mkimage-yum.sh # https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh의 script를 copy & paste
[root@ING docker]# chmod +x mkimage-yum.sh
[root@ING docker]# ./mkimage-yum.sh baserehel75alt
...
Running transaction
Installing : libgcc-4.8.5-28.el7_5.1.ppc64le 1/243
Installing : redhat-release-server-7.5-7.el7a.ppc64le 2/243
Installing : setup-2.8.71-9.el7.noarch 3/243
Installing : filesystem-3.2-25.el7.ppc64le 4/243
Installing : tzdata-2018e-3.el7.noarch 5/243
Installing : basesystem-10.0-7.el7.noarch 6/243
...
xz-libs.ppc64le 0:5.2.2-1.el7 yum-metadata-parser.ppc64le 0:1.1.4-10.el7
zlib.ppc64le 0:1.2.7-17.el7
Complete!
+ [[ -n '' ]]
+ yum -c /etc/yum.conf --installroot=/tmp/mkimage-yum.sh.Oh71td -y clean all
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
There are no enabled repos.
Run "yum repolist all" to see the repos you have.
To enable Red Hat Subscription Management repositories:
subscription-manager repos --enable <repo>
To enable custom repositories:
yum-config-manager --enable <repo>
Script가 위와 같이 성공적으로 완료된 뒤에 message에 표시된 /tmp 밑의 directory로 가보면 아래와 같이 mini-OS image가 마련되어 있는 것을 보실 수 있습니다.
이제 이걸 tar로 말아올린 뒤 docker import 명령으로 import 해주면 됩니다.
[root@ING docker]# cd /tmp/mkimage-yum.sh.Oh71td
[root@ING mkimage-yum.sh.Oh71td]# ls -ltr
total 12
dr-xr-xr-x 2 root root 6 Dec 15 2017 sys
drwxr-xr-x 2 root root 6 Dec 15 2017 srv
dr-xr-xr-x 2 root root 6 Dec 15 2017 proc
drwxr-xr-x 2 root root 6 Dec 15 2017 opt
drwxr-xr-x 2 root root 6 Dec 15 2017 mnt
drwxr-xr-x 2 root root 6 Dec 15 2017 media
drwxr-xr-x 2 root root 6 Dec 15 2017 home
drwxr-xr-x 2 root root 180 Dec 15 2017 dev
dr-xr-xr-x 2 root root 6 Dec 15 2017 boot
lrwxrwxrwx 1 root root 7 Aug 9 09:47 bin -> usr/bin
lrwxrwxrwx 1 root root 8 Aug 9 09:47 sbin -> usr/sbin
lrwxrwxrwx 1 root root 9 Aug 9 09:47 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 7 Aug 9 09:47 lib -> usr/lib
drwxr-xr-x 13 root root 207 Aug 9 09:47 usr
drwxrwxrwt 7 root root 117 Aug 9 09:47 tmp
drwxr-xr-x 19 root root 335 Aug 9 09:47 var
drwxr-xr-x 15 root root 261 Aug 9 09:47 run
drwxr-xr-x 68 root root 8192 Aug 9 09:47 etc
dr-xr-x--- 2 root root 91 Aug 9 09:47 root
[root@ING mkimage-yum.sh.Oh71td]# tar -zcf /tmp/rhel7_ppc64le.tar.gz .
[root@ING mkimage-yum.sh.Oh71td]# ls -l /tmp/rhel7_ppc64le.tar.gz
-rw-r--r-- 1 root root 224266718 Aug 9 10:15 /tmp/rhel7_ppc64le.tar.gz
[root@ING mkimage-yum.sh.Oh71td]# docker import /tmp/rhel7_ppc64le.tar.gz bsyu/rhel75_ppc64le:base
[root@ING mkimage-yum.sh.Oh71td]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bsyu/rhel75_ppc64le base 3bf1baa60960 4 seconds ago 715 MB
이제 이 base image를 기반으로 dockerfile을 편집해서 CUDA 명령을 쓸 수 있는 nvidia-docker image를 만들면 됩니다.
그러기 위해서는 먼저 이 docker base image에서도 yum 명령을 써야 하는데, 기본적으로 Redhat에서 제공되는 /etc/yum.repos.d/redhat.repo 파일은 매번 yum을 기동할 때마다 자동으로 blank로 reset 되어버립니다. 따라서 이 파일 이름말고, 다른 이름, 가령 /etc/yum.repos.d/new.repo라는 이름으로 host OS에 있는 /etc/yum.repos.d/redhat.repo 파일을 그대로 저장해두면 host OS에서처럼 외부 YUM repository를 자유롭게 쓸 수 있습니다. 물론 이때 /etc/pki/entitlement/*-key.pem 등의 필요 ceritificate 파일들도 함께 docker image 속의 /etc/pki/entitlement에 copy 해두어야 합니다. 가령 다음과 같이 하면 됩니다.
[bsyu@p57a22 ~]# docker run -ti --rm -v /etc:/mnt bsyu/rhel75_ppc64le:base bash
----inside docker container------
[root@7e3b00f3fac2 ~]# cp /mnt/pki/entitlement/*.pem /etc/pki/entitlement
[root@7e3b00f3fac2 ~]# cp /mnt/yum.repos.d/redhat.repo /etc/yum.repos.d/new.repo # 절대 redhat.repo라는 이름으로 copy하면 안 됩니다.
[root@7e3b00f3fac2 ~]# rpm -Uvh /mnt/epel-release-7-11.noarch.rpm # epel-release-7-11.noarch.rpm 파일의 경우 host의 /etc 밑에 미리 copy해둡니다.
[root@7e3b00f3fac2 ~]# yum install wget curl cmake cmake3 make automake autoconf bzip2 zip unzip git gcc gcc-c++ gfortran yum-utils # 기본적으로 필요한 package들을 미리 설치해둡니다.
----outside docker container------
[bsyu@p57a22 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e3b00f3fac2 bsyu/rhel75_ppc64le:base bash "bash" 23 hours ago Up 23 hours angry_bose
[bsyu@p57a22 ~]# docker commit 7e3b00f3fac2 bsyu/rhel75_ppc64le:base_v6
이제 dockerfile을 이용하여 nvidia-docker 이미지를 만듭니다. 먼저 (다른 이름도 상관없습니다만) docker라는 directory를 만들고, 거기에 docker image 속에 설치할 cuda*.rpm 등을 미리 copy 해둡니다. 그리고나서 dockerfile.cuda92 파일을 다음과 같이 만듭니다.
[bsyu@p57a22 ~]# mkdir /home/docker && cd /home/docker
[root@p57a22 docker]# vi dockerfile.cuda92
FROM bsyu/rhel75_ppc64le:base_v6
# Update image
# 'local' means rhel local repository
# To use these repos below in building process, you must set up the RHEL subscription and enable these repos on your host system first.
RUN yum-config-manager --enable rhel-7-for-power-9-rpms/7Server/ppc64le
RUN yum-config-manager --enable rhel-7-for-power-9-optional-rpms/7Server/ppc64le
RUN yum-config-manager --enable rhel-7-for-power-9-extras-rpms/7Server/ppc64le
RUN yum-config-manager --enable epel/ppc64le
RUN mkdir /tmp/temp
COPY cuda-repo-rhel7-9-2-local* /tmp/temp/
RUN rpm -Uvh /tmp/temp/cuda-repo-rhel7-9-2-local*
RUN yum install -y cuda
# nvidia-docker 1.0
LABEL com.nvidia.volumes.needed="nvidia_driver"
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"
RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf
ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:/usr/local/cuda/lib64/stubs
# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
ENV NVIDIA_REQUIRE_CUDA "cuda>=9.2"
RUN yum clean all && rm -rf /var/cache/yum/* /tmp/temp
RUN rpm -e cuda-repo-rhel7-9-2-local
이제 위의 dockerfile.cuda92 파일을 이용하여 다음과 같이 bsyu/rhel75_ppc64le_cuda92_all:v0.1라는 이름으로 docker image를 build합니다.
[root@p57a22 docker]# docker build -t bsyu/rhel75_ppc64le_cuda92_all:v0.1 -f dockerfile.cuda92 .
Sending build context to Docker daemon 1.705 GB
Step 1/24 : FROM docker.io/bsyu/rhel75_ppc64le:base_v5
---> fc88cbad6b18
....
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
---> f26c0a2167a0
Removing intermediate container bb911c868f27
Step 26/26 : RUN rpm -e cuda-repo-rhel7-9-2-local
---> Running in 6bceb027f2f1
---> deaf06286bf4
Removing intermediate container 6bceb027f2f1
Successfully built deaf06286bf4
다음과 같이 지정한 이름의 docker image가 생성된 것을 확인합니다.
[root@p57a22 docker]# docker images | grep bsyu
bsyu/rhel75_ppc64le_cuda92_all v0.1 deaf06286bf4 45 seconds ago 8.11 GB
bsyu/rhel75_ppc64le base_v6 872374a229f2 8 minutes ago 1.35 GB
이제 nvidia-docker로 이 image를 구동하여 nvidia-smi가 제대로 작동하는지 확인합니다. 그리고 PowerAI나 libcudnn* libnccl2* 등 필요 SW를 더 설치한 뒤 commit 하여 필요한 image를 추가로 만듭니다.
[bsyu@p57a22 data]$ nvidia-docker run -ti --rm -v /home/bsyu/files:/mnt bsyu/rhel75_ppc64le_cuda92_all:v0.1 bash
----inside docker container------
[root@e8a6f36fb132 /]# nvidia-smi
Thu Aug 23 01:28:52 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.26 Driver Version: 396.26 |
|-------------------------------+----------------------+----------------------+
| 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 28C P0 29W / 300W | 10MiB / 16280MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla P100-SXM2... Off | 00000003:01:00.0 Off | 0 |
| N/A 30C P0 32W / 300W | 10MiB / 16280MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 Tesla P100-SXM2... Off | 0000000A:01:00.0 Off | 0 |
| N/A 28C P0 29W / 300W | 10MiB / 16280MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 Tesla P100-SXM2... Off | 0000000B:01:00.0 Off | 0 |
| N/A 31C P0 29W / 300W | 10MiB / 16280MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
댓글 없음:
댓글 쓰기