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