Construction de l'environnement GPU avec Docker [version d'octobre 2020]

Aperçu

Dans cet article, nous utiliserons Docker pour créer un environnement pour tensorflow2.3 + Python3.8. Vous pouvez facilement créer un environnement en réécrivant le contenu de cet article dans les versions CUDA et Python correspondantes de n'importe quelle version de TensorFlow ou PyTorch. Puisqu'il existe un mélange d'articles liés à la création d'un environnement GPU avec Docker, j'organiserai ce que j'ai fait à partir d'octobre 2020 avec un mémorandum.

Dans cet article, j'ai installé Python3.8 et Poetry basés sur l'image nvidia / cuda: 10.1-cudnn7-devel-ubuntu18.04 et utilisé Poetry pour exécuter tensorflow2.3 Installez-le.

Public cible

--Docker débutant

environnement

Le 1 ~ 3 suivant semble être plus facile à faire dans cet article (je ne l'ai pas essayé moi-même) [Que se passe-t-il avec NVIDIA Docker maintenant? (Version 20.09)](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86 % E3% 81% AA% E3% 81% A3% E3% 81% A6% E3% 82% 8B% E3% 81% AE-20-09-% E7% 89% 88-558fae883f44)

1. Installez le pilote NVIDIA

Vérifiez le type de GPU (vérifiez qu'il y en a un fabriqué par NVIDIA).

$ lspci | grep VGA
03:00.0 VGA compatible controller: NVIDIA Corporation Device 1b80 (rev a1)
04:00.0 VGA compatible controller: NVIDIA Corporation Device 1b80 (rev a1)

Si vous avez déjà installé le pilote NVIDIA, supprimez-le.

$ dpkg -l | grep nvidia-
$ sudo apt-get purge nvidia-*

Ajoutez le référentiel de pilotes.

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update

Vérifiez le pilote recommandé.

$ sudo ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0 ==
modalias : pci:v000010DEd00001B80sv00001462sd0000336Bbc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-430 - third-party free recommended
driver   : nvidia-415 - third-party free
driver   : xserver-xorg-video-nouveau - distro free builtin

Installez le nvidia-430 recommandé.

$ sudo apt-get install nvidia-driver-430
$ sudo ubuntu-drivers autoinstall

Redémarrez le système d'exploitation.

$ sudo reboot

Vérifiez si le pilote NVIDIA est correctement installé.

$ nvidia-smi
Thu Oct 15 16:49:51 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.64       Driver Version: 430.64       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  GeForce GTX 1080    Off  | 00000000:03:00.0 Off |                  N/A |
| 28%   40C    P8    10W / 180W |      2MiB /  8119MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 1080    Off  | 00000000:04:00.0  On |                  N/A |
| 28%   41C    P8    13W / 180W |    533MiB /  8085MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    1      1247      G   /usr/lib/xorg/Xorg                           422MiB |
|    1      1583      G   compiz                                       108MiB |
+-----------------------------------------------------------------------------+

2. Installez Docker

Vous pouvez installer Docker conformément au Document officiel. Ce qui suit est un copier-coller d'une partie du document officiel, veuillez donc lire le document pour plus de détails.

SET UP THE REPOSITORY 1. Update the apt package index and install packages to allow apt to use a repository over HTTPS:

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

2. Add Docker’s official GPG key:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <[email protected]>
sub   rsa4096 2017-02-22 [S]

3. Use the following command to set up the stable repository.

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

INSTALL DOCKER ENGINE 1. Update the apt package index, and install the latest version of Docker Engine and containerd, or go to the next step to install a specific version:

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

3. Verify that Docker Engine is installed correctly by running the hello-world image.

$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Vérifiez si Docker est correctement installé.

$ dpkg -l | grep -e docker -e containerd.io
ii  containerd.io                                            1.3.7-1                                       amd64        An open and reliable container runtime
ii  docker-ce                                                5:19.03.13~3-0~ubuntu-xenial                  amd64        Docker: the open-source application container engine
ii  docker-ce-cli                                            5:19.03.13~3-0~ubuntu-xenial                  amd64        Docker CLI: the open-source application container engine
$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:02:59 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:01:30 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
$ sudo docker images
REPOSITORY          TAG                             IMAGE ID            CREATED             SIZE
hello-world         latest                          bf756fb1ae65        9 months ago        13.3kB

[Facultatif] Permet aux commandes du menu fixe d'être exécutées sans sudo.

$ sudo usermod -aG docker $USER

3. Installez NVIDIA Container Toolkit

Avec la mise à jour de septembre 2020, il semble que tout ce que vous ayez à faire est d'installer nvidia-docker2. ([Que se passe-t-il avec NVIDIA Docker maintenant? (Version 20.09)](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A % E3% 81% A9% E3% 81% 86% E3% 81% AA% E3% 81% A3% E3% 81% A6% E3% 82% 8B% E3% 81% AE-20-09-% E7% 89% 88-558fae883f44))) (Si vous installez nvidia-docker2, nvidia-container-toolkit sera également installé.)

$ 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-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker

4. Créez un environnement pour tensorflow2.3 + Python3.8 avec Docker

Écrivez le contenu suivant dans Dockerfile_gpu. Sélectionnez la version de CUDA et cuDNN en fonction de la version du framework que vous souhaitez installer. Ici, selon tensorflow2.3, [Image of CUDA10.1 + cuDNN7](https://hub.docker.com/r/nvidia/cuda/tags?page=1&name=10.1-cudnn7-devel-ubuntu18. Basé sur 04).

Dockerfile_gpu


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

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends tzdata
RUN apt-get update && apt-get install -y --no-install-recommends \
    wget \
    curl \
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    llvm \
    libncurses5-dev \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libffi-dev \
    liblzma-dev \
    vim \
    graphviz

ENV TZ Asia/Tokyo

WORKDIR /root/
RUN wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz \
    && tar xvf Python-3.8.5.tar.xz \
    && cd Python-3.8.5 \
    && ./configure --enable-optimizations \
    && make install
RUN rm Python-3.8.5.tar.xz

WORKDIR /root/Python-3.8.5
RUN ln -fs /root/Python-3.8.5/python /usr/bin/python
RUN curl -kL https://bootstrap.pypa.io/get-pip.py | python 
RUN rm -rf /var/lib/apt/lists/*

RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
ENV SHELL /bin/bash -l

ENV POETRY_CACHE /work/.cache/poetry
ENV PIP_CACHE_DIR /work/.cache/pip

RUN $HOME/.poetry/bin/poetry config virtualenvs.path $POETRY_CACHE

ENV PATH ${PATH}:/root/.poetry/bin:/bin:/usr/local/bin:/usr/bin

CMD ["bash", "-l"]

Écrivez le contenu suivant dans Makefile (réécrivez ʻIMAGE_NAME` comme il convient).

Makefile


FOLDER=$$(pwd)
IMAGE_NAME=test:latest

.PHONY: build-gpu
build-gpu: # Build docker image
    echo "Building Dockerfile"
    docker build -t ${IMAGE_NAME} . -f Dockerfile_gpu

.PHONY: start-gpu
start-gpu: build-gpu # Start docker container
    echo "Starting container ${IMAGE_NAME}"
    docker run --gpus all --rm -it -v ${FOLDER}:/work -w /work ${IMAGE_NAME}

Créez une image Docke pour créer un conteneur Docker.

$ make start-gpu

Installez tensorflow-gpu 2.3 avec Poetry.

# poetry init
# poetry add tensorflow-gpu==2.3

Exécutez n'importe quel fichier.

# poetry run python file_name.py

Sommaire

Dans cet article, j'ai résumé la procédure de création d'un environnement pour tensorflow2.3 + Python3.8 à l'aide de Docker dans un mémorandum. Il est pratique de n'avoir que le pilote NVIDIA, Docker et NVIDIA Container Toolkit installés sur le système d'exploitation hôte. Dans cet article, TensorFlow a été installé avec Poetry, mais bien sûr, il est possible d'installer avec Dockerfile.

Troubleshooting apt update Erreurs liées à Google Chrome https://sicklylife.hatenablog.com/entry/2017/08/08/193118

"Impossible d'ouvrir" le fichier de liste en raison d'une erreur "autorisation refusée" https://askubuntu.com/a/1146593

nouveau Désactiver nouveau https://qiita.com/kawazu191128/items/8a46308be6949f5bda57#nouveau%E7%84%A1%E5%8A%B9%E5%8C%96

apt-get install nvidia-driver-300 Si le démarrage sécurisé UEFI est activé, vous devez désactiver le démarrage sécurisé ou définir une clé.

Temporary failure resolving '....com' https://github.com/moby/moby/issues/5779#issuecomment-323433618

Spécifiez le serveur DNS

https://mzryuka.hatenablog.jp/entry/2019/08/07/235613

Recommended Posts

Construction de l'environnement GPU avec Docker [version d'octobre 2020]
[Docker] Construction de l'environnement Rails 5.2 avec docker
Créer un environnement Node.js avec Docker Compose
Construction d'environnement avec Docker pour les débutants
[Construction de l'environnement avec Docker] Rails 6 et MySQL 8
Construction d'environnement de rails avec Docker (apocalypse personnelle)
Construction de l'environnement de développement Laravel avec Docker (Mac)
Construire un environnement pour Laravel + MySQL + phpMyadmin avec Docker
Construction de l'environnement Rails Docker
Procédure de construction et de développement de l'environnement local Wordpress avec Docker
Mémo de construction de l'environnement MySQL 5.7 (Docker)
Mémo de construction de l'environnement Redmine (Docker)
Créer un environnement Docker avec WSL
Gérer la version de CocoaPods avec Docker
Construction de l'environnement Docker × Spring Boot
[Docker] postgres, construction de l'environnement pgadmin4
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Créez un environnement de développement d'applications Rails avec Docker [Docker, Rails, Puma, Nginx, MySQL]
Créez un environnement Vue3 avec Docker!
Créer un environnement local Couchbase avec Docker
Créer un environnement Node.js avec Docker
Résumé de la construction de l'environnement Ruby ~ Version Mac ~
Construction de l'environnement d'utilisation Laravel + Docker Laradock
Créer un environnement de vérification SolrCloud avec Docker
Rails sur la procédure de construction de l'environnement Docker
Créez un environnement Docker + Laravel avec Laradock
Création d'un environnement de développement pour Ruby on Rails à l'aide de Docker + VSCode (Remote Container)
Construire un environnement PostgreSQL avec Docker (de la configuration à juste avant le développement)
Comment créer un environnement Rails + Vue + MySQL avec Docker [dernière version 2020/09]
Procédure de construction de l'environnement Docker "Rails 6 x MySQL 8" à partager avec les équipes
[Note] Procédure d'acquisition de l'environnement Docker version Db2
Apprentissage des instructions SQL ~ Construction de l'environnement ~ Docker + MySQL
Construction de Rails 6 et environnement PostgreSQL avec Docker
Sapper × Go (écho) × Construction de l'environnement de développement Docker
Créer un environnement de développement PureScript avec Docker
Construire un environnement Rails 6 + MySQL avec Docker compose
Modifier Mysql avec des commandes dans l'environnement Docker
Créer un environnement de développement Spring Boot-gradle-mysql avec Docker
[Docker] Construction de l'environnement de développement Rails6 / Ruby2.7 / MySQL8
[Docker] Créez un environnement Node.js + express + webpack avec Docker
Construction de l'environnement de développement Java Spring Boot + Docker
Créer un environnement de développement Wordpress avec Docker
Reconnaissance GPU avec docker utilisant WSL2 (août 2020)
[Docker] Construisez l'environnement d'exécution de Jupyter Lab avec Docker