Mini projet HPC
F. Diakhaté, R. Fihue
Date: 18/11/2018
Ce mini projet vous plongera au coeur de monde AWS, et vous permettra de mieux appréhender les différents composants. Vous rencontrerez des difficultés mais ceci donnera un sens à tout ces composants et vous donnera un bonne expérience Cloud à faire valoir plus tard.
L’objectif de ce projet est de vous faire utiliser un outil d’orchestration Cloud. Cet outil, simple d’utilisation, permet d’exprimer une infrastructure avec du code et ainsi d’en contrôler les changements et leurs impacts.
Pour faire le lien avec notre métier, le HPC, nous allons déployer un cluster typique HPC dans le Cloud. Ici ce n’est pas les performance que l’on recherche mais la flexibilité du Cloud pour le rendre plus ou moins gros.
En effet, un cluster HPC est typiquement de taille fixe et ceci entraîne 2 chose : pas assez de charge équivaut à gâcher des ressources (electricité), trop de charge et les utilisateurs voient leur temps d’attente augmenter. Néanmoins ceci permet d’avoir accès à du matériel véritablement orienté HPC (très spécifique)
Avec le Cloud, le matériel n’est plus spécifique mais la flexibilité est présente. Le cluster grandit/réduit en fonction de la charge, ainsi les coûts réels sont en fonction de l’utilisation du cluster. Tout n’est pas parfait néanmoins, la perte de performance peut être significative (réseau notamment) et le coût par coeur de calcul est supérieur.
Nous allons utiliser AWS comme plateforme cloud et terraform comme outil d’orchestration.
Vous aurez également accès à des scripts et fichiers de configuration vous permettant de configurer un cluster HPC dans le cloud. Vous aurez ainsi un moyen générique de lancer un cluster HPC, il n’y aura plus qu’à l'orchestrer.
Les liens de documentation suivants seront des aides précieuses:
On commence petit avec un cluster qui n’en est pas un : un seul noeud qui fait controlleur et noeud de calcul.
Le controlleur d’un cluster HPC gère, entres autres, l’allocation des ressources de calcul aux différents utilisateurs à l’aide du produit Slurm un ordonnanceur de job.
Complétez (remplacez les %TODO%) puis lancez le manifest Terraform disponible ici :
https://shell.aimnor.me/tf/1-controller.tf
Vous aurez besoin de :
Après avoir lancé votre cluster (terraform apply), vous pouvez lancer des job avec srun.
$ ssh -i %PATH_PRIV_KEY% centos@%IP_CONTROLLER% ip-172-31-32-17.eu-west-3.compute.internal # Lance 2 hostname, mais 1 seul coeur dispo $ srun -n 2 hostname srun: Requested partition configuration not available now srun: job 7 queued and waiting for resources ^C # Lance 2 hostname avec de l’overcommit (2 tâche sur un seul CPU) $ srun -n 2 --overcommit hostname ip-172-31-32-17.eu-west-3.compute.internal ip-172-31-32-17.eu-west-3.compute.internal |
Notre petit cluster est loin d’être “HPC” avec 1 seul coeur et 1 seul noeud. Il faut ajouter des noeuds.
Pour cela slurm supporte un mode cloud qui permet de lancer des noeuds à la demande. Si vous demandez des ressources qui ne sont pas disponible, slurm lancera un ou plusieurs noeuds supplémentaires.
Pour cela, ajoutez (wget) les manifests terraform suivants :
Complétez les (remplacez les %TODO%), puis mettez jour votre infrastructure à l’aide de Terraform (terraform apply).
$ ssh -i %PATH_PRIV_KEY% centos@%IP_CONTROLLER% $ srun hostname # Lance 1 hostname ip-172-31-32-17.eu-west-3.compute.internal # Lance 3 hostname ce qui déclenche le déploiement de 3 noeuds $ srun -n 3 hostname ip-172-31-37-90.eu-west-3.compute.internal ip-172-31-38-179.eu-west-3.compute.internal ip-172-31-46-182.eu-west-3.compute.internal |
Cette infrastructure est certe fonctionne mais possède plusieurs problèmes (dans l’ordre de criticité) :
Toutes ces solutions sont à implémenter avec Terraform, l’ordre d’implémentation n’est pas important. Afin de bien suivre les différentes étapes, implémenter chaque solution dans des fichiers différents en utilisant (entre autres) des fichier *_override surchangeant les ressources dejà présentes (cf. fichiers override déjà présents). Par exemple:
$ ls -rw-rw-r--. 1 fihuer fihuer 5,7K 17 nov. 16:07 1-controller.tf |
A l’aide du service RDS d’AWS, et des fichiers de configuration suivants installez slurm-slurmdbd, configurez et lancez le service slurmdbd sur le noeud controleur..
#/etc/slurm/slurmdbd.conf |
#/etc/slurm/slurm.conf |
A l’aide de nouveaux sous-réseaux, isolez les noeuds de calcul d’un accès direct depuis Internet. Un schéma du réseau attendu :
Les sous-réseaux des différents noeuds de calcul doivent être distincts et dans des zones de disponibilité distinctes. La configuration de slurm pourra ressembler à :
#/etc/slurm/slurm.conf.d/slurm_nodes.conf [...] |
Le script de lancement (start_ec2_compute) est à adapter également.
A l’image des contrôleurs et leur système de fichier partagé, ajoutez un espace partagé AWS FSx entre tous les noeuds de calcul et montez le au démarrage.
Vous pourrez vérifier le bon fonctionnement avec
srun -n 3 df -h |
Votre filesystem devrait apparaître dans la sortie.
A l’aide d’API Gateway, Lambda et SSM implémentez une façon de soumettre des jobs avec une interface REST minimale ie.
curl -X POST -d @- https://????.execute-api.eu-west-1.amazonaws.com/prod/submit date hostname ^D |
Pour soumettre un job avec slurm :
sbatch %BATCH_FILE% |
ou
echo -e '#!/bin/bash -x\nsleep 30' | sbatch |
Le résultat de ce TP devra être sous la forme de plusieurs fichiers Terraform (.tf). Versionnez ces fichiers et soumettez les nous à chaque version fonctionnelle ie. pour chaque amélioration que vous aurez implémenté avec une description sommaire de l’infrastructure déployée.
Ne restez pas coincés, ce n’est pas l’objectif de ce TP. En cas de problème ou si vous avez questions, contactez nous. Dans certains cas, nous pourrons vous donner des indices ou un bout de la réponse.