0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ubuntuでnvidia-dockerをsudoなしで実行するまで

Last updated at Posted at 2019-06-28

はじめに

Ubuntuにnvidia-dockerをインストールして,sudoなしで実行できるように設定します.
最後におまけとして,申し訳程度のセキュリティ対策を紹介します.

動作環境

動作OS

Ubuntu 14.04 or 16.04 or 18.04
今回,私はUbuntu 16.04での作業でしたが,18.04の方は同じ作業で問題ないはずです.
しかし,14.04の方は,最新のDockerが14.04に対応していないので,古いバージョンを入れなければなりません.
Docker関連のパッケージのバージョンの指定も行わなければならず,色々と面倒なので,大人しくOSのアップグレードをした方が良いかと思います.

Nvidiaドライバ

極端に古くなければ基本的にドライバのバージョンに関係なくnvidia-docker自体は動作します.
しかし.CUDA 9.0は384.81以上,10.0は410.48以上のように,Docker imageのCUDAのバージョンによって,求めるドライバが新しくなるので,できるだけ新しいものを入れておいた方が後々楽かと思います.

CUDA

ホストのCUDAは入れても入れなくても構いません.
DockerのCUDAとホストのCUDAは分離しているため,互いに影響はありません.

Dockerのインストール

Docker公式のドキュメントに記載されているとおりに作業していきます.

古いDockerがあれば削除

$ sudo apt-get remove docker docker-engine docker.io containerd runc

リポジトリの登録

$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

インストール

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

これでDockerのインストールは完了です.
次にnvidia-dockerのインストールに移ります.

nvidia-dockerのインストール

こちらも公式のリポジトリの通りに作業をしていきます.

古いnvidia-dockerの削除

nvidia-dockerをインストールしたことのない人は飛ばしてください

$ sudo docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
$ sudo apt-get purge -y nvidia-docker

リポジトリの追加

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
   sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
   sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update

インストール

$ sudo apt-get install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd

テスト

$ sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

以下のようにGPUの情報が表示されれば正常に動作しています.

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.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  GeForce GTX TIT...  Off  | 00000000:03:00.0 Off |                  N/A |
| 22%   37C    P8    14W / 250W |      1MiB / 12212MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX TIT...  Off  | 00000000:04:00.0  On |                  N/A |
| 22%   45C    P8    16W / 250W |    640MiB / 12204MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

sudoなしでDockerを動かす

以下のコマンドでユーザをdockerユーザグループに追加し,ログインし直せばsudoなしでDockerが動作します.

sudo usermod -aG docker $USER

おまけ

privileged オプションについて

通常,コンテナを起動するとrootユーザが動作しますが,ホストに対してその権限はありません.
なので,ホストのディレクトリをマウントしても,ファイルのパーミッション
コンテナ起動時にprivilegedオプションを付けると,ホストに対してもルート権限に準ずる権限を持つことになります.

つまり,ホストのディレクトリをマウントした状態でコンテナを起動して,

docker run -it -v /:/host ubuntu16.04 /bin/bash

こんなことをしてしまうと,

rm -rf /host

マウントされたホストのディレクトリがすべて削除されてしまいます,

なので.privilegedオプションをつけて起動できないようにしていきます.

ユーザ名前空間の有効化

これによってコンテナにホストのディレクトリをマウントしたときに,ホスト側のユーザと同等の権限でファイル操作が行えます.
同時にprivilegedが無効になります.

etc/subuid と /etc/subgid に下記を追加します.

dockremap:100000:65536

/etc/docker/daemon.json に以下を追加します.

"userns-remap": "default"

最後にDockerの再起動をして終了です.

sudo systemctl restart docker

おわりに

ほとんど公式ドキュメントの焼き直しになってしまいましたが,以上で快適にnvidia-dockerを使うことができるかと思います.

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?