Utiliser les GPU de vesta

Auteur·rice

Augustin Chevallier

1 Les GPU de vesta : AMD Instinct MI210

Les nœuds de calcul de vesta sont équipés de cartes AMD Instinct MI210 (2022, architecture CDNA 2). Ce sont des cartes conçues uniquement pour le calcul : elles n’ont pas de sortie vidéo.

Pour comparaison, la NVIDIA T4 est le GPU proposé gratuitement sur Google Colab.

Caractéristique AMD Instinct MI210 (vesta) NVIDIA T4 (Colab)
Année, architecture 2022, CDNA 2 2018, Turing
Mémoire 64 Go HBM2e 16 Go GDDR6
Bande passante mémoire 1,6 To/s 320 Go/s
Unités de calcul 104 (6 656 cœurs) 2 560 cœurs CUDA, 320 Tensor Cores
FP64 23 TFLOPS (45 en calcul matriciel) 0,25 TFLOPS
FP32 23 TFLOPS (45 en calcul matriciel) 8,1 TFLOPS
FP16 (calcul matriciel) 181 TFLOPS 65 TFLOPS
BF16 (calcul matriciel) 181 TFLOPS non supporté
Consommation 300 W 70 W

Les TFLOPS sont des valeurs maximales théoriques : en pratique, l’écart dépend du modèle, et un petit modèle peut être limité par autre chose que le GPU (chargement des données, Python…).

Deux conséquences pour l’apprentissage profond :

  • 64 Go de mémoire permettent d’entraîner des modèles et des batchs bien plus gros que sur un ordinateur portable, dont le GPU a en général quelques Go de mémoire.
  • Les calculs en 16 bits (FP16, BF16) sont environ 4 fois plus rapides qu’en 32 bits. C’est l’intérêt de l’entraînement en précision mixte (torch.autocast).
Remarque

Les GPU AMD utilisent la plateforme ROCm, et non CUDA comme les GPU NVIDIA. Mais PyTorch garde les mêmes noms : on écrit torch.device("cuda") et torch.cuda.is_available() comme avec une carte NVIDIA. Le code des TD fonctionne sans modification.

2 Connexion ssh

  1. Télécharger le fichier config sur Moodle.
  2. Le déplacer dans le dossier ~/.ssh.
  3. Remplacer unistrausername par votre nom d’utilisateur.
  4. Tester la connexion dans un terminal :
ssh vesta

3 Installer uv (une seule fois)

uv est un gestionnaire de paquets pour Python. Sur vesta, avant de charger un module :

python3 -m pip install --user uv
Avertissement

Cette commande ne fonctionne pas après module load py-torch/2.12.0. Si un module est déjà chargé, se déconnecter puis se reconnecter avant de la lancer.

Vérifier que la commande uv est trouvée :

uv --version
Si uv n’est pas trouvé

Ajouter le dossier ~/.local/bin au PATH, puis se déconnecter et se reconnecter :

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

4 Créer le projet M2 (une seule fois)

PyTorch est fourni par le module py-torch, compilé pour les GPU AMD de vesta. On crée un environnement Python pour le projet, qui utilise ce PyTorch, et dans lequel on installe les autres paquets avec uv.

module load py-torch/2.12.0
export UV_PYTHON_DOWNLOADS=never
SITE_MODULE=$(python -c "import site; print(site.getsitepackages()[0])")

uv init M2
cd M2
uv python pin 3.14
uv venv --python "$(which python)"
echo "$SITE_MODULE" > .venv/lib/python3.14/site-packages/module_torch.pth
uv add transformers datasets
  • UV_PYTHON_DOWNLOADS=never empêche uv de télécharger son propre Python : il faut utiliser celui du module, pour lequel PyTorch a été compilé.
  • Le module py-torch est lui-même un environnement Python. Le fichier module_torch.pth ajoute ses paquets (dont PyTorch) à l’environnement du projet. Les paquets installés avec uv add restent prioritaires.

Vérifier que PyTorch est bien celui du module :

source .venv/bin/activate
python -c "import torch; print(torch.__file__, torch.version.hip)"

Le chemin affiché doit commencer par /nfs/vesta/sw/py-torch/.

Remarque

Sur le nœud de connexion, un avertissement sysfs nodes path '/sys/class/kfd/kfd/topology/nodes' does not exist peut s’afficher. C’est normal : il n’y a pas de GPU sur ce nœud. Les calculs sur GPU se font dans un job (Section 8).

5 Ajouter un paquet plus tard

module load py-torch/2.12.0
export UV_PYTHON_DOWNLOADS=never
cd ~/M2
uv add nom_du_paquet
Avertissement

Ne jamais faire uv add torch. Si un paquet installe sa propre version de PyTorch, celle-ci remplace la version du module et le GPU n’est plus utilisé. Après chaque uv add, refaire la vérification de la partie précédente.

6 Connexion via Visual Studio Code

  1. Ouvrir VS Code.
  2. Cliquer sur l’icône >< en bas à gauche, puis Connect to Host, puis vesta.
  3. Ouvrir le répertoire M2.
  4. Télécharger le fichier example.batch sur Moodle, et le glisser-déposer dans la liste de fichiers de VS Code pour le déposer sur le serveur.
  5. Faire de même pour les fichiers test.py et telecharger.py.

7 Télécharger les données (une seule fois)

Les jobs n’ont pas accès à internet. Il faut donc télécharger les données avant, depuis le nœud de connexion (sans sbatch) :

module load py-torch/2.12.0
cd ~/M2
source .venv/bin/activate
python telecharger.py
Remarque

Les données sont enregistrées dans le cache de Hugging Face (~/.cache/huggingface), où les jobs les retrouvent. Pour utiliser d’autres données dans un TD ou un projet, les ajouter dans telecharger.py et le relancer.

8 Lancer un job sur GPU

Le fichier example.batch doit contenir, après les lignes #SBATCH :

module load py-torch/2.12.0
export HF_HUB_OFFLINE=1
cd ~/M2
source .venv/bin/activate
python -u test.py
Remarque
  • HF_HUB_OFFLINE=1 indique à Hugging Face de lire uniquement le cache, sans essayer de se connecter à internet.
  • L’option -u force Python à écrire les messages immédiatement dans le fichier log. Sans elle, ils n’apparaissent qu’à la fin du job.

Lancer le job, puis suivre son état :

sbatch example.batch
squeue -u $USER

Le script test.py charge le dataset TinyStories, puis entraîne un petit réseau sur des données aléatoires. Pendant et après le job, dans le répertoire M2 :

  • slurm-<numéro du job>.out contient tous les messages du script : le GPU utilisé, le chargement du dataset, puis une ligne par epoch ;
  • resultats_<numéro du job>.csv contient une ligne par epoch (loss d’entraînement, précision sur le test, durée), écrite au fur et à mesure.

La précision sur le test doit augmenter au fil des epochs, bien au-delà de 50 %.