2019년 4월 8일 월요일

ppc64le Redhat 7 환경에서의 nvidia-docker2 대신 nvidia-container-runtime 사용


nvidia-docker는 현재 버전 2가 나와 있습니다만, 아직 Redhat 7 ppc64le에서는 버전 1만 지원이 되고 있습니다.   그렇다고 nvidia-docker2를 Redhat 7 ppc64le에서는 완전히 못 쓰는 것은 아닙니다.  수동으로 nvidia-container-runtime을 설치해주면 되기 때문입니다.   여기에 정리된 것은 아래 site에 나온 수동 등록 방법을 직접 ppc64le 아키텍처의 GPU 서버인 IBM AC922에서 수행해본 결과입니다.

https://github.com/nvidia/nvidia-container-runtime#docker-engine-setup

먼저 docker-ce를 설치하기 위해 docker.repo를 등록합니다.

[root@ac922 home]# vi /etc/yum.repos.d/docker.repo
[docker]
name=Docker
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7/docker-ppc64el/
enabled=1
gpgcheck=0

아래와 같이 nvidia-container-runtime.repo를 등록합니다.

[root@ac922 home]# distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

[root@ac922 home]# echo $distribution
rhel7.5

[root@ac922 home]# curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.repo | sudo tee /etc/yum.repos.d/nvidia-container-runtime.repo
[libnvidia-container]
name=libnvidia-container
baseurl=https://nvidia.github.io/libnvidia-container/centos7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://nvidia.github.io/libnvidia-container/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

[nvidia-container-runtime]
name=nvidia-container-runtime
baseurl=https://nvidia.github.io/nvidia-container-runtime/centos7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://nvidia.github.io/nvidia-container-runtime/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

이제 gpg 관련해서 key를 지울텐데, 여기서는 기존에 f796ecb0 key가 설치된 적이 없었기 때문에 error가 납니다.  에러는 무시하셔도 됩니다.

[root@ac922 home]# gpg --homedir /var/lib/yum/repos/ppc64le/7Server/nvidia-container-runtime/gpgdir --delete-key f796ecb0
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: keyblock resource `/var/lib/yum/repos/ppc64le/7Server/nvidia-container-runtime/gpgdir/secring.gpg': No such file or directory
gpg: keyblock resource `/var/lib/yum/repos/ppc64le/7Server/nvidia-container-runtime/gpgdir/pubring.gpg': No such file or directory
gpg: key "f796ecb0" not found: Unknown system error
gpg: f796ecb0: delete key failed: Unknown system error


다만 다음과 같은 error가 나는 경우가 있는데, 이는 어떻게든 고치셔야 합니다.

Repository cuda is listed more than once in the configuration
https://nvidia.github.io/libnvidia-container/centos7/ppc64le/repodata/repomd.xml: [Errno -1] repomd.xml signature could not be verified for libnvidia-container
Trying other mirror

가장 쉬운 방법은 아래와 같이 repo_gpgcheck=1을 0으로 바꿔서 repo에 대한 gpg check을 안 하도록 하는 것입니다.

[root@ac922 home]# vi /etc/yum.repos.d/nvidia-container-runtime.repo
...
#repo_gpgcheck=1
repo_gpgcheck=0


그 다음으로 yum makecache를 수행합니다.  일부 존재하지 않는 mirror site에 대해서 error가 날텐데, 무시하셔도 됩니다.

[root@ac922 home]# yum makecache
...

failure: repodata/6f7751fe9609cd7adda0ef3002368400ba63b01793d8a0fe0fea8ae56c3265c65015c9b5d274fbfab7b6c4aa8738a3df7e53c8de1987a410c91624412330825c-filelists.xml.xz from nvidia-container-runtime: [Errno 256] No more mirrors to try.
https://nvidia.github.io/nvidia-container-runtime/centos7/ppc64le/repodata/6f7751fe9609cd7adda0ef3002368400ba63b01793d8a0fe0fea8ae56c3265c65015c9b5d274fbfab7b6c4aa8738a3df7e53c8de1987a410c91624412330825c-filelists.xml.xz: [Errno 14] HTTPS Error 404 - Not Found


중요한 것은 아래와 같이 그 다음에 수행하는 yum list에서 nvidia-container가 보이기만 하면 된다는 것입니다.

[root@ac922 home]# yum list | grep nvidia | grep container
libnvidia-container-devel.ppc64le          1.0.0-1                 libnvidia-container
libnvidia-container-static.ppc64le         1.0.0-1                 libnvidia-container
libnvidia-container-tools.ppc64le          1.0.0-1                 libnvidia-container
libnvidia-container1.ppc64le               1.0.0-1                 libnvidia-container
libnvidia-container1-debuginfo.ppc64le     1.0.0-1                 libnvidia-container
nvidia-container-runtime.ppc64le           2.0.0-1.docker18.03.1   nvidia-container-runtime
nvidia-container-runtime-hook.ppc64le      1.4.0-2                 nvidia-container-runtime

이제 docker-ce를 설치합니다.

[root@ac922 home]# yum install -y docker-ce

이어서 nvidia-container-runtime를 설치합니다.

[root@ac922 home]# yum install -y libnvidia-container-devel nvidia-container-runtime

그리고나서 nvidia-runtime을 docker에 등록하기 위해 daemon configuration file을 아래와 같이 등록합니다.   이 방법 말고 위 site에서는 systemd drop-in file이라는 것을 써도 된다고 되어 있는데, 제가 해보니 그 방법은 뭐가 잘못 되었는지 error가 나더군요.  그러니 아래 방법을 쓰십시요.

[root@ac922 home]# vi /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

이제 위 config file에 따라 아래와 같이 docker를 시작합니다.

[root@ac922 home]# systemctl daemon-reload

[root@ac922 home]# systemctl start docker

이제 docker를 run 시켜 봅니다.  기존 nvidia-docker version 1과의 차이점은 이제 nvidia-docker라는 명령을 쓰는 것이 아니라 --runtime=nvidia라고 쓰면 된다는 것입니다.  이제 테스트를 위해 기존에 만들어 두었던 tensorflow 1.3을 담은 docker image를 구동시켜 보겠습니다.

[root@ac922 home]# docker run --runtime=nvidia --rm -ti bsyu/tf1.3-ppc64le:v0.1
...
root@d72b1ea6b739:/# python
Python 3.6.1 |Anaconda custom (64-bit)| (default, May 11 2017, 15:31:35)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

아래와 같이 GPU를 제대로 잡아오는지 보겠습니다.  잘 됩니다.

>>> sess=tf.Session()
2019-04-08 08:26:15.424143: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties:
name: Tesla V100-SXM2-32GB
...
2019-04-08 08:26:15.730328: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 1 2 3
2019-04-08 08:26:15.730347: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0:   Y Y Y Y
2019-04-08 08:26:15.730365: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 1:   Y Y Y Y
2019-04-08 08:26:15.730382: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 2:   Y Y Y Y
2019-04-08 08:26:15.730397: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 3:   Y Y Y Y
2019-04-08 08:26:15.730428: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla V100-SXM2-32GB, pci bus id: 0004:04:00.0)
2019-04-08 08:26:15.730450: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla V100-SXM2-32GB, pci bus id: 0004:05:00.0)
2019-04-08 08:26:15.730468: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:2) -> (device: 2, name: Tesla V100-SXM2-32GB, pci bus id: 0035:03:00.0)
2019-04-08 08:26:15.730488: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:3) -> (device: 3, name: Tesla V100-SXM2-32GB, pci bus id: 0035:04:00.0)

Parent OS에서 본 nvidia-smi에서도 python이 GPU를 점거하는 모습을 보실 수 있습니다.

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.40.04    Driver Version: 418.40.04    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| 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 V100-SXM2...  On   | 00000004:04:00.0 Off |                    0 |
| N/A   40C    P0    65W / 300W |  30175MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-SXM2...  On   | 00000004:05:00.0 Off |                    0 |
| N/A   41C    P0    70W / 300W |  30173MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-SXM2...  On   | 00000035:03:00.0 Off |                    0 |
| N/A   41C    P0    65W / 300W |  30173MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-SXM2...  On   | 00000035:04:00.0 Off |                    0 |
| N/A   42C    P0    66W / 300W |  30173MiB / 32480MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     14371      C   python                                     30165MiB |
|    1     14371      C   python                                     30163MiB |
|    2     14371      C   python                                     30163MiB |
|    3     14371      C   python                                     30163MiB |
+-----------------------------------------------------------------------------+



PS.   아예 --runtime=nvidia 옵션 없이 그냥 docker 명령만 써서 nvidia-container-runtime을 구동하고 싶다면 다음과 같이  "default-runtime": "nvidia" 을 /etc/docker/daemon.json에 추가해주시면 됩니다.


[root@ac922 home]# vi /etc/docker/daemon.json
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

댓글 없음:

댓글 쓰기