# Entraînement sur CPU Intel

## Fonctionnement Pour l'optimisation de l'entraînement sur CPU

Accelerate prend entièrement en charge les processeurs Intel. Il vous suffit de l'activer via la configuration.

**Scénario 1** : Accélération de l'entraînement CPU sans distribution

Exécutez accelerate config sur votre machine :

```bash
$ accelerate config
-----------------------------------------------------------------------------------------------------------------------------------------------------------
In which compute environment are you running?
This machine
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Which type of machine are you using?
No distributed training
Do you want to run your training on CPU only (even if a GPU / Apple Silicon device is available)? [yes/NO]:yes
Do you wish to optimize your script with torch dynamo?[yes/NO]:NO
Do you want to use DeepSpeed? [yes/NO]: NO
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Do you wish to use FP16 or BF16 (mixed precision)?
bf16
```
Cela génère un fichier de configuration qui sera utilisé automatiquement pour définir correctement les options par défaut lors de

```bash
accelerate launch my_script.py --args_to_my_script
```

Par exemple, voici comment exécuter l’exemple NLP `examples/nlp_example.py` (depuis la racine du dépôt) avec `default_config.yaml`, généré par `accelerate config`

```bash
compute_environment: LOCAL_MACHINE
distributed_type: 'NO'
downcast_bf16: 'no'
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 1
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: true
```
```bash
accelerate launch examples/nlp_example.py
```

> [!CAUTION]
> `accelerator.prepare` ne peut actuellement gérer que la préparation simultanée de plusieurs modèles (sans optimiseur) ou d’une seule paire modèle-optimiseur pour l’entraînement. Toute autre tentative (par exemple, deux paires modèle-optimiseur) déclenchera une erreur détaillée. Pour contourner cette limitation, envisagez d’utiliser séparément `accelerator.prepare` pour chaque paire modèle-optimiseur.

**Scénario 2** : Accélération de l’entraînement distribué sur CPU. Nous utilisons Intel oneCCL pour la communication, combiné à la bibliothèque Intel® MPI pour fournir un messagerie de cluster flexible, efficace et évolutive sur l’architecture Intel®. Vous pouvez consulter [ici](https://huggingface.co/docs/transformers/perf_train_cpu_many) le guide d’installation.

Exécutez accelerate config sur votre machine (node0) :

```bash
$ accelerate config
-----------------------------------------------------------------------------------------------------------------------------------------------------------
In which compute environment are you running?
This machine
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Which type of machine are you using?
multi-CPU
How many different machines will you use (use more than 1 for multi-node training)? [1]: 4
-----------------------------------------------------------------------------------------------------------------------------------------------------------
What is the rank of this machine?
0
What is the IP address of the machine that will host the main process? 36.112.23.24
What is the port you will use to communicate with the main process? 29500
Are all the machines on the same local network? Answer `no` if nodes are on the cloud and/or on different network hosts [YES/no]: yes
Do you want accelerate to launch mpirun? [yes/NO]: yes
Please enter the path to the hostfile to use with mpirun [~/hostfile]: ~/hostfile
Enter the number of oneCCL worker threads [1]: 1
Do you wish to optimize your script with torch dynamo?[yes/NO]:NO
How many processes should be used for distributed training? [1]:16
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Do you wish to use FP16 or BF16 (mixed precision)?
bf16
```
Par exemple, voici comment exécuter l’exemple NLP `examples/nlp_example.py` (depuis la racine du dépôt) pour l’entraînement CPU distribué.

`default_config.yaml` généré par `accelerate config`
```bash
compute_environment: LOCAL_MACHINE
distributed_type: MULTI_CPU
downcast_bf16: 'no'
machine_rank: 0
main_process_ip: 36.112.23.24
main_process_port: 29500
main_training_function: main
mixed_precision: bf16
mpirun_config:
  mpirun_hostfile: /home/user/hostfile
num_machines: 4
num_processes: 16
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: true
```

Définissez les variables d’environnement suivantes et utilisez MPI d’Intel pour lancer l’entraînement

Dans `node0`, vous devez créer un fichier de configuration contenant les adresses IP de chaque nœud (par exemple hostfile) et passer le chemin de ce fichier de configuration en argument.

Si vous avez choisi de laisser Accelerate lancer `mpirun`, assurez-vous que l'emplacement de votre fichier d'hôtes correspond au chemin défini dans la configuration.

```bash
$ cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ip
xxx.xxx.xxx.xxx #node2 ip
xxx.xxx.xxx.xxx #node3 ip
```

```bash
accelerate launch examples/nlp_example.py
```

Vous pouvez également lancer directement l’entraînement distribué avec la commande `mpirun`. Il faut exécuter la commande suivante sur node0, et **16DDP** sera activé sur node0, node1, node2 et node3 avec la précision mixte BF16. Lorsque vous utilisez cette méthode, le script Python, l’environnement Python et le fichier de configuration accelerate doivent être disponibles sur toutes les machines utilisées pour l’entraînement multi-CPU.

```bash
export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip
mpirun -f hostfile -n 16 -ppn 4 accelerate launch examples/nlp_example.py
```

