"# Skalierbare Methoden der Künstlichen Intelligenz\n",
"Dr. Charlotte Debus (charlotte.debus@kit.edu) \n",
"Dr. Markus Götz (markus.goetz@kit.edu) \n",
"Dr. Marie Weiel (marie.weiel@kit.edu)\n",
"Dr. Marie Weiel (marie.weiel@kit.edu)\n",
"Dr. Kaleb Phipps (kaleb.phipps@kit.edu)\n",
"\n",
"## Übung 1 am 19.11.24: Paralleles k-Means-Clustering\n",
"In der ersten Übung beschäftigen wir uns mit der k-Means-Clusteranalyse und möglichen Parallelisierungsansätzen (siehe Vorlesung vom 07.11.24). Dazu verwenden wir den [Cityscapes](https://www.cityscapes-dataset.com/)-Datensatz. Dieser Datensatz bietet unter anderem 5000 hochaufgelöste Bilder von Straßenszenen aus 50 verschiedenen Städten.\n",
"Jedes dieser Bilder besteht aus 2048 x 1024 Pixeln mit drei 256-Bit RGB-Farbkanälen pro Pixel, die in einer \"Short-Fat\"-Matrix mit 5000 x 6 291 456 seriellen Einträgen zusammengefasst sind: 5000 Bilder x (3 Kanäle x 2048 Pixel x 1024 Pixel) = 5000 x 6 291 456 \n",
"Für unsere Aufgabe benutzen wir 300 dieser Samples. Sie finden diese auf dem bwUniCluster im Workspace `VL_ScalableAI` unter folgendem Pfad: \n",
"Untenstehend finden Sie eine serielle Implementierung des k-Means-Algorithmus in Python 3 unter Verwendung der Programmbibliothek für maschinelles Lernen [PyTorch](https://pytorch.org/). \n",
"Führen Sie den Code auf einem CPU-basierten Knoten bzw. einer GPU auf dem bwUniCluster aus. Beachten Sie dabei, dass der Code für die GPU-Nutzung angepasst werden muss. Vergleichen Sie die Laufzeit. Was fällt Ihnen auf? \n",
...
...
@@ -65,8 +65,9 @@
"\"\"\"\n",
"Serial implementation of k-means clustering in PyTorch\n",
"\"\"\"\n",
"import h5py\n",
"import time\n",
"\n",
"import h5py\n",
"import torch\n",
"\n",
"\n",
...
...
@@ -114,11 +115,11 @@
" tol : float\n",
" The tolerance for the convergence criterion.\n",
" \"\"\"\n",
" self.n_clusters = n_clusters # number of clusters\n",
" self.max_iter = max_iter # maximum number of iterations\n",
" self.n_clusters = n_clusters # Number of clusters\n",
" self.max_iter = max_iter # Maximum number of iterations\n",
" self._centroids = None\n",
" self._matching_centroids = None\n",
" self.tol = tol # tolerance for convergence criterion\n",
" self.tol = tol # Tolerance for convergence criterion\n",
# Skalierbare Methoden der Künstlichen Intelligenz
Dr. Charlotte Debus (charlotte.debus@kit.edu)
Dr. Markus Götz (markus.goetz@kit.edu)
Dr. Marie Weiel (marie.weiel@kit.edu)
Dr. Kaleb Phipps (kaleb.phipps@kit.edu)
## Übung 1 am 19.11.24: Paralleles k-Means-Clustering
In der ersten Übung beschäftigen wir uns mit der k-Means-Clusteranalyse und möglichen Parallelisierungsansätzen (siehe Vorlesung vom 07.11.24). Dazu verwenden wir den [Cityscapes](https://www.cityscapes-dataset.com/)-Datensatz. Dieser Datensatz bietet unter anderem 5000 hochaufgelöste Bilder von Straßenszenen aus 50 verschiedenen Städten.
Jedes dieser Bilder besteht aus 2048 x 1024 Pixeln mit drei 256-Bit RGB-Farbkanälen pro Pixel, die in einer "Short-Fat"-Matrix mit 5000 x 6 291 456 seriellen Einträgen zusammengefasst sind: 5000 Bilder x (3 Kanäle x 2048 Pixel x 1024 Pixel) = 5000 x 6 291 456
Für unsere Aufgabe benutzen wir 300 dieser Samples. Sie finden diese auf dem bwUniCluster im Workspace `VL_ScalableAI` unter folgendem Pfad:
Untenstehend finden Sie eine serielle Implementierung des k-Means-Algorithmus in Python 3 unter Verwendung der Programmbibliothek für maschinelles Lernen [PyTorch](https://pytorch.org/).
Führen Sie den Code auf einem CPU-basierten Knoten bzw. einer GPU auf dem bwUniCluster aus. Beachten Sie dabei, dass der Code für die GPU-Nutzung angepasst werden muss. Vergleichen Sie die Laufzeit. Was fällt Ihnen auf?
*Hinweis: Laden Sie zunächst die benötigten Module auf dem bwUniCluster. Setzen Sie dann eine virtuelle Umgebung mit Python auf, in der Sie die benötigten Pythonpakete installieren. Erstellen Sie basierend auf untenstehendem Code ein Python-Skript, welches Sie mithilfe eines Bash-Skripts über SLURM auf dem Cluster submitten (siehe Übung vom 05.11.24). Nachfolgend finden Sie ein Template für das Submit-Skript für den CPU-Job inklusive der benötigten Module. Für die GPU-Nutzung müssen die #SBATCH-Optionen entsprechend angepasst werden. Weitere Informationen dazu finden Sie [hier](https://wiki.bwhpc.de/e/BwUniCluster_2.0_Slurm_common_Features).*
%% Cell type:code id:27a9e43b tags:
``` python
#!/bin/bash
#SBATCH --job-name=kmeans_cpu # job name
#SBATCH --partition=single # queue for resource allocation
#SBATCH --time=30:00 # wall-clock time limit
#SBATCH --mem=40000 # memory
#SBATCH --nodes=1 # number of nodes to be used
#SBATCH --mail-type=ALL # Notify user by email when certain event types occur.
print(f"DONE.\nRun time: \t{time.perf_counter()-start} s")# Measure and print runtime.
```
%% Cell type:markdown id:6c7900f7 tags:
### Aufgabe 2
Implementieren Sie ausgehend von obigem Code eine Sample-parallele Version des k-Means-Algorithmus. Orientieren Sie sich dabei an der obenstehenden seriellen Implementierung.
Das Interface bzw. die Benutzung der Klasse im eigentlichen Ausführungsteil des Codes soll gleich bleiben. Für die Parallelisierung benötigen Sie einen entsprechend parallelisierten Dataloader. Diesen finden Sie im untenstehenden Code-Fragment. Testen Sie Ihren Code auf vier Knoten des bwUniClusters. Untenstehend finden Sie ein entsprechendes Submit-Skript in bash.
%% Cell type:code id:691eeb17 tags:
``` python
#!/bin/bash
#SBATCH --job-name=kmeans_sample # job name
#SBATCH --partition=multiple # queue for the resource allocation.
#SBATCH --time=30:00 # wall-clock time limit
#SBATCH --mem=40000 # memory per node
#SBATCH --nodes=4 # number of nodes to be used
#SBATCH --cpus-per-task=40 # number of CPUs required per MPI task
#SBATCH --ntasks-per-node=1 # maximum count of tasks per node
#SBATCH --mail-type=ALL # Notify user by email when certain event types occur.
kmeans_clusterer.fit(data)# Perform actual k-means clustering.
ifrank==0:
print(f"DONE.\nRun time:\t{time.perf_counter()-start} s")# Measure and print runtime.
```
%% Cell type:markdown id:d5379ea7 tags:
### Aufgabe 3
Implementieren Sie ausgehend von obigem Code eine Feature-parallele Version des k-Means-Algorithmus. Den entsprechend parallelisierten Dataloader finden Sie im untenstehenden Code-Fragment. Testen Sie Ihren Code auf vier Knoten des bwUniClusters.
%% Cell type:code id:217173aa tags:
``` python
"""
Feature-parallel implementation of k-means clustering in PyTorch using MPI
"""
importh5py
importtime
importh5py
importtorch
frommpi4pyimportMPI
classKMeans:
"""
Feature-parallel k-means clustering in PyTorch using MPI.