Transformers documentation
CPU
CPU
Les processeurs exécutent les modèles Transformers avec la chaîne de périphérique cpu, sans accélérateur. Ils fonctionnent pour l’inférence et l’entraînement lorsque les GPU ne sont pas disponibles, ou lorsque vous souhaitez une configuration économique.
Exécuter l'inférence
Les modèles sont chargés sur le CPU par défaut lorsque vous ne passez pas device_map, et pipeline() utilise le CPU lorsqu’aucun accélérateur n’est disponible. Passez device_map="cpu" ou device="cpu" pour utiliser le CPU sur une machine qui dispose également d’un accélérateur.
from transformers import pipeline
generator = pipeline("text-generation", model="Qwen/Qwen3-0.6B", device="cpu")
print(generator("CPUs are", max_new_tokens=50, do_sample=False)[0]["generated_text"])Entraîner avec Trainer
Les processeurs prenant en charge bf16, tels que les processeurs Intel et AMD récents, peuvent utiliser l’entraînement en précision mixte bf16 avec l’AMP de PyTorch, ce qui réduit l’utilisation de la mémoire et accélère l’entraînement.
Les exemples ci-dessous couvrent trois configurations, allant d'un seul CPU à plusieurs machines lorsqu'un CPU est trop lent :
- un seul CPU
- plusieurs processus sur une seule machine (un par socket CPU)
- plusieurs processus sur plusieurs machines
Les exemples à nœud unique et multi-nœuds lancent des processus avec mpirun de Intel MPI, qui fait partie du Intel oneAPI HPC Toolkit, et Trainer exécute le DDP sur le backend gloo.
Définissez bf16=True et use_cpu=True dans TrainingArguments, ou passez --bf16 et --use_cpu à un script d’entraînement. Préférez bf16 à fp16 sur CPU car il est plus stable numériquement.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
use_cpu=True,
)Sur un CPU à double socket, exécutez un processus par socket. Maintenir les accès mémoire locaux à chaque socket améliore le débit. L’exemple ci-dessous lance deux processus sur une seule machine, avec un processus par socket, où train.py est votre script d’entraînement Trainer.
Définissez
OMP_NUM_THREADSsur le nombre de cœurs physiques d’un socket, moins un cœur réservé au système d’exploitation. Par exemple, sur un socket à 24 cœurs, définissezOMP_NUM_THREADS=23.
export MASTER_ADDR=127.0.0.1
mpirun -n 2 -genv OMP_NUM_THREADS=23 \
python3 train.py \
--output_dir ./outputs \
--use_cpu \
--bf16Étendre l’entraînement à quatre processus répartis sur deux machines (node0 et node1) à l’aide d’un hostfile qui répertorie l’adresse IP de chaque nœud. L’option -n 4 définit le nombre total de processus. -ppn 2 définit deux processus par nœud (un par socket).
Exécutez ce script depuis node0, qui agit en tant que processus principal.
Définissez
OMP_NUM_THREADSsur le nombre de cœurs physiques d’un socket, moins un cœur réservé au système d’exploitation. Par exemple, sur un socket à 24 cœurs, définissezOMP_NUM_THREADS=23.
Créez un fichier hostfile avec l'adresse IP de chaque nœud.
cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ipPuis exécutez le script d'entraînement.
export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip
mpirun -f hostfile -n 4 -ppn 2 \
-genv OMP_NUM_THREADS=23 \
python3 train.py \
--output_dir ./outputs \
--use_cpu \
--bf16Optimiser les performances du processeur
Préchargez un allocateur de mémoire plus rapide et le runtime OpenMP d’Intel pour réduire les surcoûts lors de l’entraînement sur CPU. Installez google-perftools (pour libtcmalloc) et le package Python intel-openmp (pour libiomp5), puis ajoutez les deux bibliothèques à la variable d’environnement LD_PRELOAD avant de lancer l’entraînement.
Définissez OMP_NUM_THREADS sur le nombre de cœurs que chaque processus peut utiliser. Dans un conteneur ou un travail de cluster avec des limites CPU, il s’agit du nombre d’unités CPU allouées, il convient donc de laisser certains cœurs non alloués pour les processus système.
Étapes suivantes
- Lisez le billet de blog Accelerating PyTorch Transformers with Intel Sapphire Rapids pour une analyse approfondie des performances BF16 sur le matériel Intel moderne.
- Consultez DDP pour en savoir plus sur la stratégie distribuée utilisée par les exemples multi-processus.
- Lisez les notes sur le threading CPU de PyTorch pour comprendre comment
OMP_NUM_THREADSaffecte les performances. - Consultez le guide PyTorchJob de Kubeflow pour exécuter une formation distribuée sur CPU dans Kubernetes.