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.
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.
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 |
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
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é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
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é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:~#
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)
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.
/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
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