Kinaconの技術ブログ

Ubuntuはじめました。

dockerをインストールする(Ubuntu 18.04 )

docker-install

REF

https://docs.docker.com/engine/install/ubuntu/


環境


必須パッケージのインストール

sudo apt update

sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common


GPG-keyの追加

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"


dockerのインストール

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


sudoなしで起動できるようにする

# $USERをdockerグループに追加する
sudo usermod -aG docker $USER

# dockerが使用するソケットを一般ユーザでも読み込み出来るようにする
sudo chmod 666 /var/run/docker.sock


動作確認

# version確認
docker --version
# Docker version 19.03.8, build afacb8b7f0

# 動作確認
docker run hello-world

以上。

Ubuntuでローカル内のIPを調べる

arp-scan

sshで接続したいPCのIPを調べるときに便利。

インストール

sudo apt install arp-scan

使い方

sudo arp-scan -I enp3s0 -l
# enp3s0はNICのインターフェイス名

結果

nterface: wlp3s0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.x.xxx   aa:xx:bb:xx:95:xx   NEC AccessTechnica, Ltd.
192.168.x.xxx   aa:xx:bb:03:75:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:e3:70:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:e2:c6:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:02:07:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:1c:4b:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:2e:cc:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:6b:ec:xx   Hewlett Packard
192.168.x.xxx   aa:xx:bb:75:ec:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:b6:fc:xx   (Unknown)
192.168.x.xxx   aa:xx:bb:08:60:xx   (Unknown)

11 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 2.278 seconds (112.38 hosts/sec). 11 responded

````

以上。

OpenPoseを試してみた。

OpenPose-Tensorflow

本家CaffeベースのOpenPoseを試したが・・・
Check failed: error == cudaSuccess (2 vs. 0) out of memoryで断念。
Tensorflow版はうまく動いた。


  • 20/05/08
  • Ubuntu18.04.4
  • GeForce RTX 2060
  • Docker version 19.03.8


REF

https://github.com/ildoonet/tf-pose-estimation


  • dockerコンテナ上に環境を構築して実行した。


1. docker container

dockerfile

FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04

ENV DEBIAN_FRONTEND=noninteractive \
    LC_ALL=C.UTF-8 \
    LANG=C.UTF-8

RUN apt update && apt install -y --no-install-recommends \
    git curl wget \
    python3-dev \
    cython3 \
    python3-tk \
    libgtk2.0-dev \
    swig \
    imagemagick \
 && rm -rf /var/lib/apt/lists/*

RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
 && python3 get-pip.py \
 && rm get-pip.py

RUN pip3 install --no-cache-dir \
    numpy \
    tensorflow-gpu==1.15 \
    opencv-python==3.4.5.20

WORKDIR /workspace
RUN git clone https://www.github.com/ildoonet/tf-pose-estimation \
 && cd tf-pose-estimation \
 && pip3 install -r requirements.txt

WORKDIR /workspace/tf-pose-estimation/tf_pose/pafprocess
RUN swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace

WORKDIR /workspace/tf-pose-estimation/models/graph/cmu
RUN bash download.sh


build image

mkdir docker-build
cd docker-build

# dockerfileを作成
sudo gedit dockerfile

docker build -t openpose-tensorflow:1.15 .


run container

xhost +
docker run -it --rm --gpus all \
            -e DISPLAY=$DISPLAY \
            -v /tmp/.X11-unix:/tmp/.X11-unix \
            -v /etc/group:/etc/group:ro \
            -v /etc/passwd:/etc/passwd:ro \
            -u $(id -u $USER):$(id -g $USER) \
            -w /workspace/tf-pose-estimation/ \
            openpose-tensorflow:1.15


2. Run demo

python3 run.py --model=mobilenet_thin --resize=432x368 --image=./images/p1.jpg


result image

  • INFO inference image: ./images/p1.jpg in 0.2125 seconds

f:id:m-oota-711:20200508225413p:plain
result

以上。

MaskRCNNを試してみた。

MaskRCNN-tensorflow-keras

  • 20/05/06
  • Ubuntu18.04.4
  • GeForce RTX 2060
  • Docker version 19.03.8

Ref

https://github.com/matterport/Mask_RCNN


1. 実行環境の構築

事前準備

  • ローカルにリポジトリをクローンしてあとで編集可能にする。
  • 学習済みweightsもローカルにダウンロードしておく。


# リポジトリをクローン
git clone https://github.com/matterport/Mask_RCNN
cd Mask_RCNN
sudo rm -r .git

# wightsをダウンロード
mkdir weights
wget -P ./weights https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5


コンテナイメージの作成


FROM nvidia/cuda:10.1-devel-ubuntu18.04
# FROM nvcr.io/nvidia/tensorflow:20.02-tf1-py3

ENV DEBIAN_FRONTEND=noninteractive \
    LC_ALL=C.UTF-8 \
    LANG=C.UTF-8

RUN apt update && apt install -y --no-install-recommends \
    git curl \
    python3-dev \
    python3-tk \
    libgtk2.0-dev \
    imagemagick \
 && rm -rf /var/lib/apt/lists/*

RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \
 && python3 get-pip.py \
 && rm get-pip.py

# MaskRCNN requirements
WORKDIR /workspace
RUN git clone https://github.com/matterport/Mask_RCNN  
WORKDIR /workspace/Mask_RCNN
# requirements.txtを修正
RUN sed -i -e 's/tensorflow>=1.3.0/tensorflow==1.3.0/g' requirements.txt \
 && sed -i -e 's/opencv-python/opencv-python==3.4.5.20/g' requirements.txt \
 && sed -i -e 's/keras>=2.0.8/keras==2.2.0/g' requirements.txt \
 && pip3 install -r requirements.txt \
 && python3 setup.py install

# coco pythonapi
RUN pip3 install pycocotools

WORKDIR /workspace
ENV QT_X11_NO_MITSHM=1
CMD ["/bin/bash"]


# dockerfileの作成
mkdir docker-build
cd docker-build
sudo gedit dockerfile # dockerfileを作成

# コンテナイメージのビルド
docker build -t maskrcnn-tensorflow/keras .


2. 推論用コードの作成

  • demo.ipyndをpyコードに変換し、修正したdemo.pyを作成した。
  • ipynd > py はjupyter nbconvert --to script demo.ipynb


#!/usr/bin/env python
# coding: utf-8

# # Mask R-CNN Demo
# 
# A quick intro to using the pre-trained model to detect and segment objects.

import os
import sys
import random
import math
import numpy as np
import skimage.io
import matplotlib
import matplotlib.pyplot as plt

# Root directory of the project
# ROOT_DIR = os.path.abspath("../")
ROOT_DIR = os.path.abspath("/workspace/Mask_RCNN")

# Import Mask RCNN
sys.path.append(ROOT_DIR)  # To find local version of the library
from mrcnn import utils
import mrcnn.model as modellib
from mrcnn import visualize

# Import COCO config
sys.path.append(os.path.join(ROOT_DIR, "samples/coco/"))  # To find local version
import coco

# Directory to save logs and trained model
MODEL_DIR = os.path.join(ROOT_DIR, "logs")

# Local path to trained weights file
# COCO_MODEL_PATH = os.path.join(ROOT_DIR, "mask_rcnn_coco.h5")
COCO_MODEL_PATH = os.path.join(ROOT_DIR, "weights/mask_rcnn_coco.h5")

# Download COCO trained weights from Releases if needed
if not os.path.exists(COCO_MODEL_PATH):
    utils.download_trained_weights(COCO_MODEL_PATH)

# Directory of images to run detection on
IMAGE_DIR = os.path.join(ROOT_DIR, "images")

# ## 1.Configurations

class InferenceConfig(coco.CocoConfig):
    # Set batch size to 1 since we'll be running inference on
    # one image at a time. Batch size = GPU_COUNT * IMAGES_PER_GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1

config = InferenceConfig()
config.display()


# ## 2.Create Model and Load Trained Weights

# Create model object in inference mode.
model = modellib.MaskRCNN(mode="inference", model_dir=MODEL_DIR, config=config)

# Load weights trained on MS-COCO
model.load_weights(COCO_MODEL_PATH, by_name=True)


# ## 3.Class Names

# COCO Class names
# Index of the class in the list is its ID.
# For example, to get ID of the teddy bear class,
# use: class_names.index('teddy bear')
class_names = ['BG', 'person', 'bicycle', 'car', 'motorcycle', 'airplane',
               'bus', 'train', 'truck', 'boat', 'traffic light',
               'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird',
               'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear',
               'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
               'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
               'kite', 'baseball bat', 'baseball glove', 'skateboard',
               'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
               'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
               'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
               'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
               'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
               'keyboard', 'cell phone', 'microwave', 'oven', 'toaster',
               'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
               'teddy bear', 'hair drier', 'toothbrush']


# ## 4.Run Object Detection

# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))

# Run detection
results = model.detect([image], verbose=1)

# Visualize results
r = results[0]
visualize.display_instances(image, r['rois'], r['masks'], r['class_ids'], 
                            class_names, r['scores'])


3. 推論を試行

  • コンテナを起動して実行


# コンテナを起動
# cd Mask_RCNN
xhost +
docker run -it --rm --gpus all \
            -e DISPLAY=$DISPLAY \
            -v /tmp/.X11-unix:/tmp/.X11-unix \
            -v /etc/group:/etc/group:ro \
            -v /etc/passwd:/etc/passwd:ro \
            -u $(id -u $USER):$(id -g $USER) \
            -v $PWD:/workspace/Mask_RCNN \
            -w /workspace/Mask_RCNN \
            maskrcnn-tensorflow/keras

# 推論を試行
cd sample
python3 demo.py


結果画像例

f:id:m-oota-711:20200506051029p:plain
MaskRCNN_Result

以上。

PytorchでYOLOv3とYOLOv4の推論を実行した。

  • 20/05/03
  • Ubuntu18.04.4
  • GeForce RTX 2060
  • Docker version 19.03.8

ref

  • Darknetより扱いやすい
  • Yolov4も実行できた。


Darknetは以下の記事参照

kinacon.hatenablog.com


1. Dockerで実行環境を構築

# Pull Image
docker pull ultralytics/yolov3:v0

# Rename Image
docker tag ultralytics/yolov3:v0 yolo-pytorch
docker image rm ultralytics/yolov3:v0

# Make Workspace
mkdir YOLOv3-PyTorch
cd YOLOv3-PyTorch

# Clone repogitry
git clone https://github.com/ultralytics/yolov3.git
cd yolov3
sudo rm -r .git

# Run Container 
# $PWD=~/YOLOv3-PyTorch/yolov3
docker run -it --rm \
    --gpus all \
    --ipc=host \
    -v /etc/group:/etc/group:ro \
    -v /etc/passwd:/etc/passwd:ro \
    -u $(id -u $USER):$(id -g $USER) \
    -v $PWD:/workspace/yolov3 \
    -w /workspace/yolov3 \
    yolo-pytorch


2. 推論を実行

## on Container
# Inference yolov3-tiny
python3 detect.py --cfg cfg/yolov3-tiny.cfg --weights yolov3-tiny.pt --img-size 416 --source data/samples/zidane.jpg


Results are stored in /workspace/yolov3/output

f:id:m-oota-711:20200503095801j:plain
test


3. Darknet weight to Pytorch weight

weights/yolov3/weightsに格納する。


weightsを変換

# YOLOv4
python3 -c "from models import *; convert('cfg/yolov4.cfg', 'weights/yolov4.weights')"
mv converted.pt yolov4.pt

# YOLOv3
python3 -c "from models import *; convert('cfg/yolov3.cfg', 'weights/yolov3.weights')"
mv converted.pt yolov3.pt


4. Inference YOLOv4 & YOLOv3


Inference

# Yolov4 処理時間:0.040s
python3 detect.py --cfg cfg/yolov4.cfg --weights yolov4.pt --img-size 608 --source data/samples/japan-4141578_1920.jpg --output output_yolov4_608

# Yolov3 処理時間:0.019s
python3 detect.py --cfg cfg/yolov3.cfg --weights yolov3.pt --img-size 416 --source data/samples/japan-4141578_1920.jpg --output output_yolov3_416

# Yolov3-tiny 処理時間:0.005s
python3 detect.py --cfg cfg/yolov3-tiny.cfg --weights yolov3-tiny.pt --img-size 416 --source data/samples/japan-4141578_1920.jpg --output output_yolov3-tiny

YOLOv4 結果画像

f:id:m-oota-711:20200503100649j:plain
YOLOv4

YOLOv3 結果画像

f:id:m-oota-711:20200503095517j:plain
YOLOv3

YOLOv3-tiny 結果画像

f:id:m-oota-711:20200503095541j:plain
YOLOv3-tiny

以上。

DarknetでYolov4の推論を実行してみた。

  • 20/05/02
  • Ubuntu18.04.4
  • GeForce RTX 2060
  • Docker version 19.03.8

1. Darknetコンテナを作成

dockerfileで一気に作成したかったがうまく行かなかったので以下の手順を踏んだ。

  • GPU有効化イメージでOpenCV-CUDAをインストールしたコンテナを作成。
  • コンテナでDarknetをビルド。
  • コンテナをイメージ化して保存。


dockerfile

FROM nvcr.io/nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04

ENV DEBIAN_FRONTEND=noninteractive

# OpenCV
# ref:https://www.pyimagesearch.com/2020/02/03/how-to-use-opencvs-dnn-module-with-nvidia-gpus-cuda-and-cudnn/

RUN apt update && apt install -y --no-install-recommends \
       build-essential cmake unzip pkg-config \
       libjpeg-dev libpng-dev libtiff-dev \
       libavcodec-dev libavformat-dev libswscale-dev \
       libv4l-dev libxvidcore-dev libx264-dev \
       libgtk-3-dev \
       libatlas-base-dev gfortran \
       ffmpeg \
       python3-dev nano curl git \        
 && rm -rf /var/lib/apt/lists/*

RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
RUN python3 get-pip.py && rm get-pip.py
RUN pip3 install --no-cache-dir \
       numpy

WORKDIR /opt
ENV CV_VER=3.4.0
RUN curl -L https://github.com/opencv/opencv/archive/${CV_VER}.zip -o opencv-${CV_VER}.zip \
 && curl -L https://github.com/opencv/opencv_contrib/archive/${CV_VER}.zip -o opencv_contrib-${CV_VER}.zip

RUN unzip opencv-${CV_VER}.zip \ 
 && unzip opencv_contrib-${CV_VER}.zip \
 && rm opencv-${CV_VER}.zip opencv_contrib-${CV_VER}.zip

# pascal(GTX1060 ...) -D CUDA_ARCH_BIN=6.1
WORKDIR /opt/opencv-${CV_VER}
RUN mkdir build && cd build \
 && cmake -D WITH_CUDA=ON \
       -D WITH_CUDNN=ON \
       -D OPENCV_DNN_CUDA=ON \
       -D ENABLE_FAST_MATH=1 \
       -D CUDA_FAST_MATH=1 \
       -D CUDA_ARCH_BIN=7.5 \
       -D WITH_CUBLAS=1 \
       -D BUILD_opencv_python3=ON \
       -D BUILD_opencv_python2=OFF \
       -D BUILD_TESTS=OFF \
       -D BUILD_PERF_TESTS=OFF \
       -D BUILD_EXAMPLES=OFF \
       -D CMAKE_BUILD_TYPE=RELEASE \
       -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${CV_VER}/modules \
       -D CMAKE_INSTALL_PREFIX=/usr/local .. \
 && make -j"$(nproc)" \
 && make install -j"$(nproc)" \
 && make clean

RUN echo $(pkg-config --modversion opencv)


Darknetコンテナの作成・起動

# OpenCV-CUDAコンテナ作成
cd docker-build
docker build -t opencv/cuda:3.4.0 .

# コンテナ起動
docker run -it --rm --gpus all -w /workspace opencv/cuda:3.4.0

# Darknetをコンパイル
git clone https://github.com/AlexeyAB/darknet.git \
&& cd darknet \
&& mkdir build-release \
&& cd build-release \
&& cmake .. \
&& make \
&& make install \
&& make clean

# コンテナから抜ける(ctl+p ctrl+q)
# コンテナIDを確認
docker container ls

# コンテナをイメージ化
docker commit <container id> darknet:yolov4

# コンテナを止める
docker stop <container id>

# コンテナにマウントするディレクトリを作成
cd ~/Darknet
mkdir -p data/{weights,cfg,inputs,outputs}

# 学習済みwightsをダウンロード
wget --inet4-only -P ./weights https://pjreddie.com/media/files/yolov3.weights \
                  https://pjreddie.com/media/files/yolov3-tiny.weights \
                  https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

# コンテナを起動する
xhost +
docker run -it --rm --gpus all \
            -e DISPLAY=$DISPLAY \
            -v /tmp/.X11-unix:/tmp/.X11-unix \
            -v /etc/group:/etc/group:ro \
            -v /etc/passwd:/etc/passwd:ro \
            -u $(id -u $USER):$(id -g $USER) \
            -v ~/Darknet/data:/workspace/data \
            -w /workspace/darknet \
            darknet:yolov4


2. 推論の試行

# 1画像の推論結果を画面表示する(./predictions.jpgとして結果画像も作成される)
./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights data/dog.jpg

# ホスト側で確認できるようにデータを移動する(もっと良い方法があれば・・・)
mv ./predictions.jpg /workspace/data/outputs/dog-predictions.jpg

# 複数画像の推論結果を画面表示する(filelistの最後の画像のみ./predictions.jpgとして作成される)

# /data内のjpgファイルを/workspace/data/inputsにコピーする
cp data/*.jpg /workspace/data/inputs/

# filelistを作成する
cd /workspace/data/inputs/
find $PWD -name "*.jpg" > filelist.txt 

# filelist.txtを渡して実行
cd /workspace/darknet
./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights </workspace/data/inputs/filelist.txt

# 複数画像の推論結果を保存する(入力画像と同じディレクトリに同名のtxtファイルができる)
./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights -dont_show -save_labels </workspace/data/inputs/filelist.txt

# 確認
cat /workspace/data/inputs/dog.txt

58 0.9106 0.2290 0.0476 0.0789
16 0.2877 0.6653 0.2401 0.5495
7 0.7477 0.2140 0.2874 0.1618
1 0.4473 0.4807 0.5964 0.5186


3. yolov4 vs yolov3 vs Yolov3-tiny

テスト画像リンク

Sofia TerzoniによるPixabayからの画像


# Yolov4 処理時間:36.516000 msec
./darknet detector test cfg/coco.data cfg/yolov4.cfg /workspace/data/weights/yolov4.weights /workspace/data/inputs/japan-4141578_1920.jpg

# Yolov3 処理時間:16.956000 msec
./darknet detector test cfg/coco.data cfg/yolov3.cfg /workspace/data/weights/yolov3.weights /workspace/data/inputs/japan-4141578_1920.jpg

#Yolov3-tiny 処理時間:3.018000 msec
./darknet detector test cfg/coco.data cfg/yolov3-tiny.cfg /workspace/data/weights/yolov3-tiny.weights /workspace/data/inputs/japan-4141578_1920.jpg

Yolov4 結果画像

f:id:m-oota-711:20200502221806j:plain
yolov4

Yolov3 結果画像

f:id:m-oota-711:20200502221841j:plain
yolov3

Yolov3-tiny 結果画像

f:id:m-oota-711:20200502221921j:plain
yolov3-tiny

以上。

DockerでGPUを使用する

DockerコンテナでGPUを使用するための備忘録

1. PCがGPUを認識しているか確認する

lspci -vv|grep -i nvidia

#####################################################################################################
01:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] (rev a1) (prog-if 00 [VGA controller])
    Kernel modules: nvidiafb, nouveau
01:00.1 Audio device: NVIDIA Corporation GP107GL High Definition Audio Controller (rev a1)


2. 既存のグラフィックドライバ(nouveau)の無効化

nouveauが有効か確認 (何も出なければ無効)

lsmod | grep -i nouveau

##################################################
              1892352  3
mxm_wmi                16384  1 nouveau
ttm                   102400  1 nouveau
drm_kms_helper        180224  1 nouveau
drm                   491520  6 drm_kms_helper,ttm,nouveau
i2c_algo_bit           16384  1 nouveau
wmi                    32768  3 wmi_bmof,mxm_wmi,nouveau
video                  49152  1 nouveau


nouveauを無効化

# /etc/modprobe.d/blacklist-nouveau.confを作成
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

# 以下を入力
#################################################
blacklist nouveau
options nouveau modeset=0

# initramfsの更新
$ sudo update-initramfs -u

# 再起動
$ sudo reboot
# 再起動後、画面の解像度が低くなれば無効化OK


3. cuda-driversのインストール

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda-drivers

# 再起動
sudo reboot


driverが有効化を確認

nvidia-smi

###############################################################################
Fri Mar 13 21:57:50 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00    Driver Version: 440.64.00    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 105...  On   | 00000000:01:00.0  On |                  N/A |
| 41%   36C    P8    N/A /  75W |    223MiB /  4038MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1400      G   /usr/lib/xorg/Xorg                            18MiB |
|    0      1444      G   /usr/bin/gnome-shell                          46MiB |
|    0      1765      G   /usr/lib/xorg/Xorg                            86MiB |
|    0      1893      G   /usr/bin/gnome-shell                          67MiB |
+-----------------------------------------------------------------------------+

4. Dockerをインストール

sudo apt update
sudo apt 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 update
sudo apt install docker-ce docker-ce-cli containerd.io

# version確認(dockerがインストールできているか確認)
sudo docker --version

########################################
Docker version 19.03.8, build afacb8b7f0

5. Dockerをsudoなしで起動できるようにする

sudo usermod -aG docker kinacon


6. DockerでGPUを起動できるようにする

nvidia-container-runtimeのインストール

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

sudo apt update
sudo apt install nvidia-container-runtime

# 再起動
sudo reboot


7. コンテナでGPUの状態を確認

コンテナでGPUを認識できるか確認

docker run --gpus all --rm nvidia/cuda nvidia-smi

###############################################################################
Fri Mar 13 13:49:53 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.64.00    Driver Version: 440.64.00    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 105...  On   | 00000000:01:00.0  On |                  N/A |
| 41%   34C    P8    N/A /  75W |    223MiB /  4038MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

以上。

nvidia-container-toolkitのインストール

nvidia-container-toolkitのインストール

Docker 19.03よりNvidia GPUがDocker-runtimeのデバイスとしてサポートされ、
nvidia-docker2がnvidia-container-toolkitに変わった。
すでにnvidia-docker2のパッケージの使用は推奨されていない。


私の場合はNvidia-docker2がインストールしていて
runtimeのオプションが変更されると困る場合があるため、
どちらでも実行できるようにしました。


nvidia-docker2を導入していない場合は以下参照

github.com


nvidia-container-toolkitのインストール

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
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 update && sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker


nvidia-docker2を使用したアップグレード

sudo apt update
sudo apt --only-upgrade install docker-ce nvidia-docker2
sudo systemctl restart docker


確認

docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
docker run --runtime nvidia nvidia/cuda:9.0-base nvidia-smi
nvidia-docker run nvidia/cuda:9.0-base nvidia-smi

すべてnvidia-smiが表示されればOK

以上。