Accelerate Huggingface

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

Mono-noeud

Vous pouvez normalement déjà utiliser Accelerate en mono-noeud aisément avec la documentation classique d’HuggingFace.

Multi-noeud

Dans le cas d'une utilisation en multi-noeud, 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 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-noeuds, 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 llm
 
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 certaine optimisation comme ZeRO. La documentation deepspeed accelerate permet de comprendre le fonctionnement de base et fourni 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'option possible)
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'option)
srun idr_accelerate --config_file=configs/accelerate_deepspeed-config.yaml train.py --lr 0.5