Erstellen einer HPC-Lernumgebung mit Docker Compose (C, Python, Fortran)

Ich wollte schon immer HPC (High Performance Computing) studieren, wenn ich eine GPU habe. Das Erstellen einer Umgebung ist jedoch (in vielerlei Hinsicht) eine sehr mühsame Aufgabe. Als ich mich fragte, ob ich leicht eine Lernumgebung erstellen könnte, kam mir die Idee, eine Umgebung mit Docker und Docker Compose zu erstellen. In diesem Artikel werden wir eine Containerumgebung erstellen, die PyCUDA und PyOpenCL ausführen kann, die HPC mit Python und Bibliotheken für HPC basierend auf C-Sprache wie CUDA und OpenCL realisieren.

Endziele

Erstellen Sie mit Docker eine HPC-bezogene Bibliotheksentwicklungsumgebung auf dem Container. Stellen Sie den Port außerdem so ein, dass er geöffnet ist, damit Sie mit SSH einsteigen können. Dies geschieht, um eine Umgebung zu realisieren, in der Sie mit SSH in den Container gelangen und mithilfe der Funktion der Remote Development Extension von VS Code entwickeln können.

Bibliothek eingeführt werden

Listen Sie die zu installierenden Bibliotheken auf. Installieren Sie für andere Bibliotheken als OpenCL, PyCUDA und PyOpenCL die im NVIDIA HPC SDK enthaltenen.

Name Sprache Bemerkungen
CUDA C CUDA-Standardversion C-basierte proprietäre Erweiterung
CUDA Fortran[^fortran] NVIDIA offizieller Compiler nvfortran veröffentlicht
OpenCL C Parallele Berechnungsbibliothek namens CUDA und die beiden Riesen
PyCUDA Python Wrapper zum Ausführen von CUDA aus Python
PyOpenCL Python Wrapper zum Ausführen von OpenCL aus Python
OpenMP C Eine Bibliothek, die die Verwendung von Multi-Core-CPUs vereinfacht
OpenACC C Bibliothek zur parallelen Berechnung mit GPU

Umgebungskonstruktion mit Docker Composee

Erstellen Sie die Docker-Datei und die Datei docker-compose.yml, mit denen die Umgebung wie folgt erstellt wird. Docker Compose ist ursprünglich eine Anwendung, die zum Erstellen einer Umgebung geeignet ist, in der mehrere Container gestartet und ein Netzwerk zwischen den Containern aufgebaut werden. Ich denke jedoch, dass ich sie häufig wie Make verwende. Die Docker-Datei wurde unter Bezugnahme auf den Inhalt einiger früherer offizieller Container-Bilder erstellt. Da cuDNN, PyCUDA, OpenCL und PyOpenCL nicht im NVIDIA HPC SDK enthalten sind, haben wir die Installationsmethode basierend auf dem offiziellen Container-Image der CUDA 10.1-Version übernommen. Außerdem kann das Anmeldekennwort beim Erstellen als Argument übergeben werden, damit Sie sich mit SSH beim Container anmelden können.

Nachtrag 2020/9/21: In dieser Konstruktion wird die Umgebung so konstruiert, dass eine Remote-SSH-Anmeldung vom endgültigen Client-Terminal aus durchgeführt und als Entwicklungsumgebung verwendet wird. Wenn Sie den Vorgang für den Zugriff vom Client-Terminal nicht ausführen, ist es daher nicht erforderlich, den SSH-Einstellungsteil (# SSH-Teil einrichten) am Ende der Docker-Datei zu beschreiben.

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

Image erstellen

Erstellen Sie ein Container-Image aus der Docker-Datei. Es ist nicht wünschenswert, dass das Kennwort in ".bash_history" verbleibt. Übergeben Sie daher den aus der externen Datei gelesenen Inhalt (auth.txt: das Kennwort, das Sie in der Datei festlegen möchten) als Argument. Die Shell-Datei, die die Befehlsoperation beschreibt, wird unten gezeigt.

build_env.sh


#!/bin/bash                                                                                                                                                  

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

Führen Sie build aus

Führen Sie einfach die Shell-Datei aus. Der Prozess in der Mitte wird weggelassen, aber wenn am Ende die Meldung "Erfolgreich ..." ausgegeben wird, ist sie erfolgreich. Während der Einrichtung von cuDNN endet apt möglicherweise mit einem Fehler. Sie können ihn jedoch erstellen, indem Sie es mehrmals versuchen. (Detaillierter Grund unbekannt)

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

Container starten

Alles was Sie tun müssen, ist den Container zu starten. Es wird eine Warnung angezeigt, dass der PASSWD-Wert nicht festgelegt ist, es sich jedoch um einen temporären Wert handelt, der zur Erstellungszeit verwendet wird, sodass Sie ihn sicher ignorieren können.

$ 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

Überprüfen Sie die Verbindung zum Container

Überprüfen Sie, ob Sie eine Verbindung mit SSH herstellen können. Ich konnte mich sicher mit meinem Passwort anmelden.

Nachtrag 2020/9/21: Hier wird die Verbindung mit localhost bestätigt, ssh -p 12345 root@<REMOTE_IP_ADDRESS> Aber du kannst dich verbinden. Sie können eine Verbindung mit der Remote Development Extension von VS Code auf dem Client herstellen.

$ 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: Zusammenarbeit mit VS Code

Obwohl die detaillierte Konstruktionsmethode nicht beschrieben wird, können Sie HPC aus VS Code wie folgt untersuchen, indem Sie die Erweiterungsfunktion namens Remote Development Extension von VS Code verwenden. (Die Abbildung zeigt die Manschettendatei)

hpcenv

Bonus 2: NVIDIA HPC SDK

Es wird als Entwicklungsumgebung für Bibliotheken und Compiler für High Performance Computing bereitgestellt, die von NVIDIA im August 2020 veröffentlicht wurden. Technischer Support ist gegen eine Gebühr verfügbar, aber kostenlos, wenn Sie nur die Bibliothek oder den Compiler verwenden. In der Vergangenheit benötigte der CUDA Fortran-Compiler einen Drittanbieter-Compiler namens PGI-Compiler. Mit dem NVIDIA-Compiler kann CUDA jedoch sowohl in C als auch in Fortran verwendet werden. Unten finden Sie eine Liste der enthaltenen Compiler. Es ist ein Ort wie eine Auswahl.

hpcsdk

/opt/nvidia/hpc_sdk/Linux_x86_64/20.7/compilers/Das Innere des Behälters sieht aus wie eine Auswahl


# 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

Zusammenfassung

Entwicklung einer Bibliothek für HPC, deren Aufbau kompliziert und mühsam ist Durch die Verwendung von Docker haben wir es einfach und problemlos gemacht. Ich habe mehrere HPC-Fachbücher zur Hand, daher werde ich sie für mein Studium verwenden.

Reference

[^ fortran]: Ich habe beschlossen, es mit CUDA Fortran kompatibel zu machen, weil ich möchte, dass meine Freunde, die mit Fortran umgehen, es verwenden.

Recommended Posts

Erstellen einer HPC-Lernumgebung mit Docker Compose (C, Python, Fortran)
[Definitive Edition] Erstellen einer Umgebung zum Erlernen des "maschinellen Lernens" mit Python unter Windows
[Definitive Edition] Erstellen einer Umgebung zum Erlernen des "maschinellen Lernens" mit Python auf dem Mac
Konstruktionsnotiz für eine maschinelle Lernumgebung von Python
Erstellen Sie eine Umgebung für maschinelles Lernen mit Python unter MacOSX
Aufbau einer Auto-Sklearn-Umgebung, die maschinelles Lernen halbautomatisiert (Mac & Docker)
Erstellen und testen Sie mit Docker in wenigen Minuten eine OpenCV- und Python-Umgebung
[Python] Erstellen einer Umgebung mit Anaconda [Mac]
Erstellen einer Umgebung, die Python mit Eclipse verwendet
Erstellen einer Umgebung zum Ausführen von Python-Skripten (für Mac)
Erstellen einer Anaconda-Umgebung für Python mit pyenv
Einführung in Python "Re" 1 Erstellen einer Ausführungsumgebung
Erstellen Sie mit Python eine interaktive Umgebung für maschinelles Lernen
Erstellen einer R- und Python Docker-Arbeitsumgebung
Erstellen einer Umgebung für die Verarbeitung natürlicher Sprache mit Python
Aufbau einer Umgebung zur Anzeige organischer Verbindungen mit RDKit
Erstellen einer Python-Umgebung auf einem Mac bis zur Verwendung von Jupyter Lab
Erstellen Sie mit Docker eine Umgebung für "Deep Learning von Grund auf neu"
Memo zum Erstellen einer Python-Umgebung mit Docker unter Windows 10 Home
Erstellen einer Umgebung zum Ausführen von Python-Programmen unter AWS EC2
Bereiten Sie die Python3-Umgebung mit Docker vor
Erstellen einer virtuellen Python-Umgebung
Erstellen einer virtuellen Python-Umgebung
Erstellen einer Docker-Arbeitsumgebung für R und Python 2: Japanische Unterstützung
Wie wäre es mit Anaconda zum Erstellen einer maschinellen Lernumgebung mit Python?
Erstellen einer Windows 7-Umgebung für eine Einführung in das maschinelle Lernen mit Python
(Hinweis) Hinweise zum Erstellen einer TensorFlow + Flask + Nginx-Umgebung mit Docker Compose
Erstellen Sie mit GCP + Docker + Jupyter Lab eine beliebige Umgebung für maschinelles Lernen
Erstellen einer Python-Umgebung auf einem Mac
Python + Unity Verbesserte Erstellung von Lernumgebungen
Erstellen Sie mit Docker eine Go-Umgebung
Erstellen einer Python-Umgebung unter Ubuntu
Django-Anfänger versuchten, die Umgebung aufzubauen
Erstellen Sie eine MySQL + Python-Umgebung mit Docker
Erstellen einer virtuellen Umgebung mit Python 3
[Docker] Python3.5 + Numpy + Matplotlib-Umgebungskonstruktion
Python3.6-Umgebungskonstruktion (unter Verwendung der Win-Umgebung Anaconda)
(Hinweis) Hinweise zum Erstellen einer Tensor Flow-Umgebung mit Docker Compose (nur ein Container)
Bereiten Sie eine Umgebung zum Berühren von Dateien im Grib2-Format mit Python vor (Docker Edition).
[Mac] Erstellen Sie mit Docker eine Python 3.x-Umgebung mit der schnellsten Geschwindigkeit