Aller au contenu principal

Accelerate HuggingFace

Accelerate est une bibliothèque d'HuggingFace permettant de faciliter l'usage des accélérateurs (GPU dans le cas de Jean Zay).

Mono-nœud

Vous pouvez normalement déjà utiliser Accelerate en mono-nœud aisément avec la documentation d'HuggingFace.

Multi-nœud

Dans le cas d'une utilisation en multi-nœud, il est nécessaire de générer un ou plusieurs fichiers de configuration yaml et de les transmettre au code Accelerate avec le paramètre --config_file (ou --config pour les anciennes versions). De plus, il faut une exécution par nœud avec pour chaque exécution le bon fichier de configuration.

Il est possible d'utiliser facilement Accelerate en multi-noeud sur Jean Zay grâce au lanceur idr_accelerate. Cet outil implémenté par l'IDRIS est disponible sur la majorité des modules Jean Zay.

Ce lanceur gère pour vous les contraintes mentionnées précédemment en créant et exécutant les codes Accelerate pour vous. Il vient remplacer le lanceur Accelerate de la manière suivante : accelerate launch train.py devient idr_accelerate train.py.

Pour utiliser idr_accelerate en multi-nœud, il faut simplement configurer 1 tâche par nœud et utiliser srun pour lancer une exécution par nœud. Voici un exemple simple:

#!/bin/bash
#SBATCH --job-name=accelerate_multi-node
#SBATCH --gres=gpu:4
#SBATCH --ntasks-per-node=1
#SBATCH --nodes=2
#SBATCH --cpus-per-task=40
#SBATCH --hint=nomultithread
#SBATCH --time=02:00:00
#SBATCH --qos=qos_gpu-dev
#SBATCH --account=account@v100

## load module
module purge
module load pytorch-gpu

srun idr_accelerate train.py --lr 0.5 --epochs 10

Un exemple complet d'utilisation d'Accelerate pour faire de la DDP est disponible sur notre git d'exemples de LLM.

Deepspeed via Accelerate

Accelerate permet une utilisation "simplifiée" de DeepSpeed. Cela permet notamment de profiter de certaines optimisations comme ZeRO. La documentation deepspeed accelerate permet de comprendre le fonctionnement de base et fournit quelques exemples.

Vous pouvez utiliser DeepSpeed de 3 manières différentes avec idr_accelerate :

# On donne uniquement des flags d'utilisation (simple mais peu d'options possibles)
srun idr_accelerate --use_deepspeed --zero_stage 2 --mixed_precision fp16 train.py --lr 0.5

# On donne un fichier de configuration accelerate contenant les paramètres DeepSpeed à utiliser
srun idr_accelerate --config_file configs/accelerate_deepspeed.yaml train.py --lr 0.5

# On donne un fichier de configuration accelerate qui pointe vers un fichier de configuration DeepSpeed
# (méthode la plus complexe mais aussi avec le plus d'options)
srun idr_accelerate --config_file=configs/accelerate_deepspeed-config.yaml train.py --lr 0.5