Création d'un environnement d'apprentissage HPC à l'aide de Docker Compose (C, Python, Fortran)

J'ai toujours voulu étudier le HPC (High Performance Computing) une fois que j'ai un GPU. Cependant, créer un environnement est une tâche très fastidieuse (à bien des égards). Lorsque je me demandais si je pouvais facilement créer un environnement d'apprentissage, j'ai eu l'idée de créer un environnement à l'aide de Docker et Docker Compose. Dans cet article, nous allons créer une bibliothèque HPC basée sur le langage C tel que CUDA et OpenCL, et un environnement de conteneur qui peut exécuter PyCUDA et PyOpenCL qui réalisent HPC avec Python.

buts finaux

Créez un environnement de développement de bibliothèque lié au HPC sur le conteneur à l'aide de Docker. En outre, définissez le port pour ouvrir afin que vous puissiez embarquer avec SSH. Ceci est fait pour créer un environnement dans lequel vous pouvez entrer dans le conteneur avec SSH et développer en utilisant la fonction de l'extension de développement à distance de VS Code.

Bibliothèque à présenter

Répertoriez les bibliothèques à installer. Parmi celles-ci, pour les bibliothèques autres que OpenCL, PyCUDA et PyOpenCL, installez celles incluses dans le SDK NVIDIA HPC.

Nom Langue Remarques
CUDA C Extension propriétaire basée sur CUDA version C par défaut
CUDA Fortran[^fortran] Sortie du compilateur officiel NVIDIA nvfortran
OpenCL C Bibliothèque de calcul parallèle appelée CUDA et les deux géants
PyCUDA Python Wrapper pour exécuter CUDA à partir de Python
PyOpenCL Python Wrapper pour exécuter OpenCL à partir de Python
OpenMP C Une bibliothèque qui facilite l'utilisation de processeurs multicœurs
OpenACC C Bibliothèque pour le calcul parallèle à l'aide de GPU

Construction d'environnement à l'aide de Docker Composee

Créez le Dockerfile et le docker-compose.yml utilisés pour créer l'environnement comme suit. Docker Compose est à l'origine une application pratique pour créer un environnement qui démarre plusieurs conteneurs et construit un réseau entre les conteneurs, mais je pense que je l'utilise souvent comme Make. Le Dockerfile a été créé en référence au contenu de certaines images de conteneurs officielles passées. Étant donné que cuDNN, PyCUDA, OpenCL et PyOpenCL ne sont pas inclus dans le SDK NVIDIA HPC, nous avons adopté la méthode d'installation basée sur l'image officielle du conteneur de la version CUDA 10.1. En outre, le mot de passe de connexion peut être passé comme argument au moment de la construction afin que vous puissiez vous connecter au conteneur avec SSH.

2020/9/21 postscript: Dans cette construction, l'environnement est construit dans le but d'effectuer une connexion SSH à distance à partir du terminal client final et de l'utiliser comme environnement de développement. Par conséquent, si vous n'effectuez pas l'opération pour accéder à partir du terminal client, il n'est pas nécessaire de décrire la partie de paramétrage SSH (# Setup SSH partie) à la fin du Dockerfile.

Dockerfile


FROM nvidia/cuda:10.1-cudnn7-devel

ARG PASSWD
ENV CUDA_VERSION=10.1

# Upgrade OS
RUN apt update && apt upgrade -y

# Install some ruquirements
RUN apt install -y bash-completion build-essential gfortran vim wget git openssh-server python3-pip

# Install NVIDA HPC SDK
RUN wget https://developer.download.nvidia.com/hpc-sdk/nvhpc-20-7_20.7_amd64.deb \
    https://developer.download.nvidia.com/hpc-sdk/nvhpc-2020_20.7_amd64.deb \
    https://developer.download.nvidia.com/hpc-sdk/nvhpc-20-7-cuda-multi_20.7_amd64.deb
RUN apt install -y ./nvhpc-20-7_20.7_amd64.deb ./nvhpc-2020_20.7_amd64.deb ./nvhpc-20-7-cuda-multi_20.7_amd64.deb

# Install cuDNN
ENV CUDNN_VERSION=7.6.5.32
RUN apt install -y --no-install-recommends libcudnn7=$CUDNN_VERSION-1+cuda$CUDA_VERSION && \
    apt-mark hold libcudnn7 && rm -rf /var/lib/apt/lists/*

# Install OpenCL
RUN apt update && apt install -y --no-install-recommends ocl-icd-opencl-dev && rm -rf /var/lib/apt/lists/*

RUN ln -fs /usr/bin/python3 /usr/bin/python
RUN ln -fs /usr/bin/pip3 /usr/bin/pip
ENV PATH=/usr/local/cuda-$CUDA_VERSION/bin:$PATH
ENV CPATH=/usr/local/cuda-$CUDA_VERSION/include:$CPATH
ENV LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:$LIBRARY_PATH

# Install PyCUDA
RUN pip install pycuda

# Install PyOpenCL
RUN pip install pyopencl 

# Setup SSH
RUN mkdir /var/run/sshd
# Set "root" as root's password
RUN echo 'root:'${PASSWD} | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed -i 's/#PasswordAuthetication/PasswordAuthetication/' /etc/ssh/sshd_config
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

docker-compose.yml


version: "2.4"                                                                                                                                               
services:
    hpc_env:
        build:
            context: .
            dockerfile: Dockerfile
            args:
                - PASSWD=${PASSWD}
        runtime: nvidia
        ports:
            - '12345:22'
        environment:
            - NVIDIA_VISIBLE_DEVICES=all
            - NVIDIA_DRIVER_CAPABILITIES=all
        volumes:
            - ../work:/root/work
        restart: always

Construire l'image

Créez une image de conteneur à partir du Dockerfile. Il n'est pas souhaitable que le mot de passe reste dans .bash_history, alors passez le contenu lu depuis le fichier externe (auth.txt: le mot de passe que vous voulez définir dans le fichier) comme argument. Le fichier shell qui décrit l'opération de commande est illustré ci-dessous.

build_env.sh


#!/bin/bash                                                                                                                                                  

cat auth.txt | xargs -n 1 sh -c 'docker-compose build --build-arg PASSWD=$0'

Exécuter la construction

Exécutez simplement le fichier shell. Le processus au milieu est omis, mais si le message "Avec succès ..." est émis à la fin, il réussit. Au milieu de la configuration de cuDNN, apt peut se terminer par une erreur, mais vous pouvez le créer en réessayant plusieurs fois. (La raison détaillée est inconnue)

$ ./build_env.sh
...
...
Successfully tagged building-hpc-env_hpc_env:latest

Démarrer le conteneur

Tout ce que vous avez à faire est de démarrer le conteneur. Il y a un avertissement indiquant que la valeur PASSWD n'est pas définie, mais qu'il s'agit d'une valeur temporaire utilisée au moment de la construction, vous pouvez donc l'ignorer en toute sécurité.

$ docker-compose up -d
WARNING: The PASSWD variable is not set. Defaulting to a blank string.
Creating network "building-hpc-env_default" with the default driver
Creating building-hpc-env_hpc_env_1 ... done

Vérifier la connexion au conteneur

Vérifiez si vous pouvez vous connecter avec SSH. J'ai pu me connecter avec mon mot de passe en toute sécurité.

2020/9/21 postscript: Ici, la connexion est confirmée avec localhost, ssh -p 12345 root@<REMOTE_IP_ADDRESS> Mais vous pouvez vous connecter. Vous pouvez vous connecter à l'aide de l'extension de développement à distance à partir de VS Code sur le client.

$ ssh -p 12345 root@localhost
root@localhost's password: 
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-45-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@bd12d0a840e6:~# 

Bonus 1: Coopération avec VS Code

Bien que la méthode de construction détaillée ne soit pas décrite, vous pouvez étudier HPC à partir de VS Code comme suit en utilisant la fonction d'extension appelée Extension de développement à distance de VS Code. (La figure montre le fichier cuf)

hpcenv

Bonus 2: SDK NVIDIA HPC

Il est fourni comme un environnement de développement pour les bibliothèques et les compilateurs pour le calcul haute performance publié par NVIDIA en août 2020. Le support technique est disponible moyennant des frais, mais il est gratuit si vous utilisez simplement la bibliothèque ou le compilateur. Dans le passé, le compilateur CUDA Fortran nécessitait un compilateur tiers appelé compilateur PGI, mais avec le compilateur NVIDIA, CUDA peut être utilisé à la fois en C et en Fortran. Vous trouverez ci-dessous une liste des compilateurs inclus. C'est un endroit comme une sélection.

hpcsdk

/opt/nvidia/hpc_sdk/Linux_x86_64/20.7/compilers/L'intérieur du bac ressemble à une sélection


# ls
addlocalrc                 jide-common.jar  ncu               nvaccelinfo  nvcudainit  nvprof        pgaccelinfo  pgf77      pgsize               tools
balloontip.jar             jide-dock.jar    nsight-sys        nvc          nvdecode    nvsize        pgc++        pgf90      pgunzip
cuda-gdb                   llvmversionrc    nsys              nvc++        nvextract   nvunzip       pgcc         pgf95      pgzip
cudarc                     localrc          nv-nsight-cu-cli  nvcc         nvfortran   nvzip         pgcpuid      pgfortran  rcfiles
ganymed-ssh2-build251.jar  makelocalrc      nvaccelerror      nvcpuid      nvprepro    pgaccelerror  pgcudainit   pgprepro   rsyntaxtextarea.jar

Résumé

Développement d'une bibliothèque pour HPC, ce qui est compliqué et gênant pour créer un environnement En utilisant Docker, nous l'avons rendu simple et sans tracas. J'ai plusieurs livres spécialisés en HPC sous la main, je vais donc les utiliser pour mes études.

Reference

[^ fortran]: J'ai décidé de le rendre compatible avec CUDA Fortran car je vais l'utiliser pour mes amis qui traitent avec Fortran en affaires.

Recommended Posts

Création d'un environnement d'apprentissage HPC à l'aide de Docker Compose (C, Python, Fortran)
[Definitive Edition] Création d'un environnement d'apprentissage "machine learning" à l'aide de Python sous Windows
[Definitive Edition] Création d'un environnement pour l'apprentissage du «machine learning» à l'aide de Python sur Mac
Mémo de construction d'environnement d'apprentissage automatique par Python
Créer un environnement d'apprentissage automatique à l'aide de Python sur MacOSX
Créer un environnement d'auto-apprentissage qui semi-automatise l'apprentissage automatique (Mac et Docker)
Créez et essayez un environnement OpenCV et Python en quelques minutes à l'aide de Docker
[Python] Création d'un environnement avec Anaconda [Mac]
Créer un environnement qui utilise Python avec Eclipse
Créer un environnement pour exécuter des scripts Python (pour Mac)
Construire un environnement Anaconda pour Python avec pyenv
Introduction à Python "Re" 1 Construction d'un environnement d'exécution
Créez un environnement interactif pour l'apprentissage automatique avec Python
Création d'un environnement de travail Docker R et Python
Créer un environnement pour le traitement du langage naturel avec Python
Créer un environnement pour afficher des composés organiques à l'aide de RDKit
Construire un environnement Python sur un Mac, jusqu'au point d'utiliser Jupyter Lab
Créez un environnement pour "Deep Learning from scratch" avec Docker
Mémo pour la création d'un environnement Python à l'aide de Docker sur Windows 10 Famille
Création d'un environnement pour exécuter des programmes Python sur AWS EC2
Préparer l'environnement python3 avec Docker
Construire un environnement virtuel Python
Construire un environnement virtuel Python
Création de l'environnement de travail Docker R et Python 2: prise en charge du japonais
Que diriez-vous d'Anaconda pour créer un environnement d'apprentissage automatique avec Python?
Création d'un environnement Windows 7 pour une introduction à l'apprentissage automatique avec Python
(Remarque) Remarques sur la création de l'environnement TensorFlow + Flask + Nginx avec Docker Compose
Créez un environnement d'apprentissage automatique arbitraire avec GCP + Docker + Jupyter Lab
Construire un environnement Python sur Mac
Construction d'un environnement d'apprentissage amélioré Python + Unity
Créer un environnement go à l'aide de Docker
Construire un environnement Python sur Ubuntu
Django débutant a essayé de créer l'environnement
Construire un environnement Mysql + Python avec docker
Créer un environnement virtuel avec Python 3
[docker] Construction de l'environnement python3.5 + numpy + matplotlib
Construction de l'environnement Python3.6 (à l'aide de l'environnement Win Anaconda)
(Remarque) Remarques sur la création d'un environnement Tensor Flow avec Docker Compose (un seul conteneur)
Préparer un environnement pour toucher les fichiers au format grib2 avec python (édition Docker)
[Mac] Créez un environnement Python 3.x à la vitesse la plus rapide à l'aide de Docker