2018.08.07

GPUを利用するためのDocker プラグイン「NVIDIA Docker」とは?導入手順は?(前編)

岡田一哉
SB C&S株式会社
ICT事業本部 MD本部 ICTソリューション販売推進統括部
新規事業推進部 NVIDIA&AI事業推進課
このエントリーをはてなブックマークに追加

GPUを利用した学習処理において、NVIDIAのGPUは事実上必須となっています。
TensorFlowや、ChainerのようなディープラーニングフレームワークでもGPUを使用する場合の例を検索すると、ほぼ全てがNVIDIAのGPU(CUDA)を使用した事例となっているかと思います。

通常Dockerコンテナ内からNVIDIAのGPUを利用する場合は、DockerエンジンがGPUをネイティブにサポートしておらず、ホスト側とコンテナ内に同じバージョンのGPUドライバをインストールしなければなりません。これではコンテナがホストOS側のドライババージョンに依存してしまい、可搬性が失われてしまうことになります。

また、ディープラーニングフレームワークは前提とするCUDAバージョンがそれぞれ違い、多人数、他PJでGPUサーバーを共有する場合、それぞれのコンテナ内に環境を構築したほうが、環境管理がしやすくなります。

環境管理専門の人材がいればまだいいですが、そうでない場合、希少なディープラーニングの専門家の時間を環境管理に煩わせることになってしまい、非常にもったいないですね。

そこで登場したのが、NVIDIAがDockerのアドオンとして開発した「nvidia-docker」です。

nvidia-dockerとは

「nvidia-docker」とは、NVIDIAのGPUとドライバがインストールされたマシン上で稼働するように開発された、Dockerコンテナプラグインです。

コンテナ内にCUDAやcuDNNなどのライブラリがインストールされており、「nvidia-docker」の拡張により、コンテナ内からGPUを使用することが可能です。


180803_nvidia_1.jpg
180803_nvidia_2.jpg

NVIDIA/nvidia-docker
https://github.com/NVIDIA/nvidia-docker/wiki

NVIDIA HPC/ディープラーニング系製品階層
180803_nvidia_3.jpg

それでは、さっそく「nvidia-docker」をインストールしていきたいと思います。

nvidia-dockerのインストール手順

今回のインストール先サーバー情報

サーバー: HPE ML350 Gen10
OS: CentOS 7.3(64bit)
GPU: NVIDIA Tesla P40
Docker: DockerCE 18.03.1-ce

参照した公式手順

  1. Nvidia-docker2
    https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0)
  2. NVIDIAドライバ(CUDAToolkit)
    https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
    ※nvidia-dockerの推奨に従い、ドライバ単独の手動インストールではなくパッケージマネージャを利用したCUDAToolkitごとインストールする手順を採用しております。
  3. Docker-CE
    https://docs.docker.com/install/linux/docker-ce/centos/

全体の流れ

  1. 前提条件確認/事前作業
  2. NVIDIAドライバインストール
  3. Dockerインストール
  4. NVIDIA Dockerインストール

1. 前提条件確認/事前作業

まず、GPUが認識しているかを確認します。

$ sudo lspci | grep -i nvidia
b1:00.0 3D controller: NVIDIA Corporation Device 1b38 (rev a1)

下記ページを参照して使っているGPUがCUDAに対応しているかを確認します。
https://developer.nvidia.com/cuda-gpus


180803_nvidia_4.jpg

今回はTeslaP40なので、CUDAに対応していることが確認できました。

次に、対象のCUDAバージョンでサポートされいているOS/gccバージョンであるかを確認します。
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#system-requirements


180803_nvidia_5.jpg

OSバージョン

$ uname -m && cat /etc/*release
~
CentOS Linux release 7.3.1611 (Core)

gccのインストール有無、インストールバージョンを確認

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)

Linuxカーネルバージョンを確認

# uname -r
3.10.0-514.el7.x86_64

次に、カーネル対応ヘッダ、開発パッケージを更新します。
公式ページの解説によると、ドライバ(CUDA Toolkit)のインストールにはカーネルに対応したバージョンのヘッダ/開発パッケージが必要ですが、後述のRPMのインストールでは最新のバージョンがインストールされてしまう為、カーネルバージョンに対応したヘッダ/開発パッケージをインストールします。

# sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)


NVIDIAドライバ(CUDAツールキット)をダウンロードします。

URL取得

ダウンロードページアクセス
https://developer.nvidia.com/cuda-downloads

対応するプラットフォームを選択(Intall Typeは[rpm(local)]を選択)
Base Installerの横のDownload(x.xGB)のリンクをコピーします。

Wgetでサーバー上にダウンロード

# wget https://developer.nvidia.com/compute/cuda/9.2/Prod2/local_installers/cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64
--2018-07-13 17:33:44-- https://developer.nvidia.com/compute/cuda/9.2/Prod2/local_installers/cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64
~
2018-07-13 17:38:22 (6.03 MB/s) - `cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64' へ保存完了 [1718223108/1718223108]

2. NVIDIAドライバインストール

ダウンロードしたリポジトリを登録します。

# sudo rpm --install cuda-repo-rhel7-9-2-local-9.2.148-1.x86_64

yumキャッシュ削除、アップデート更新

# sudo yum clean expire-cache
読み込んだプラグイン:fastestmirror, langpacks
リポジトリーを清掃しています: base cuda-9-2-local docker-ce-stable extras libnvidia-container nvidia-container-runtime
: nvidia-docker updates
10 個の metadata ファイルを削除しました


CUDA Toolkitが必要とするRPMリポジトリ(DKMS等)をインストールします。
https://fedoraproject.org/wiki/EPEL

リポジトリを登録

# sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

インストール:
epel-release.noarch 0:7-11

完了しました!


ドライバ(CUDA Toolkit)インストール

yumコマンドで CUDA Toolkitをインストール

[tesla1@nv-ai ~]# sudo yum install cuda

インストール:
cuda.x86_64 0:9.2.148-1

依存性関連をインストールしました:

完了しました!


インストール確認

nvidia-smi(GPU管理コマンド)コマンドの正常動作を確認

[tesla1@nv-ai ~]$ nvidia-smi
Fri Jul 13 18:52:04 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.37 Driver Version: 396.37 |
|-------------------------------+----------------------+----------------------+
| 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 P40 Off | 00000000:B1:00.0 Off | 0 |
| N/A 79C P0 54W / 250W | 0MiB / 22919MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

これでNVIDIAのGPUドライバのインストールができました。
後編では、docker、nvidia-dockerをインストールしていきたいと思います。

この記事の著者:岡田一哉

SB C&S株式会社
ICT事業本部 MD本部 ICTソリューション販売推進統括部
新規事業推進部 NVIDIA&AI事業推進課

以前はSEとして、アプリケーション基盤や、SSOシステムなどの構築・運用、オフショア移管などを担当。
その後、SB C&S社内で業務システムへの機械学習導入を担当し、
現在はその経験を活かし、NVIDIAのGPU製品についてセミナー、ハンズオンなどの販促活動を担当している。


DevOps Hubのアカウントをフォローして
更新情報を受け取る

  • Like on Feedly
    follow us in feedly

関連記事

このエントリーをはてなブックマークに追加

お問い合わせ

DevOpsに関することなら
お気軽にご相談ください。

Facebook、TwitterでDevOpsに関する
情報配信を行っています。