# CPU

CPU menjalankan model Transformers dengan string perangkat `cpu`, tanpa akselerator. CPU berfungsi untuk inferensi dan pelatihan ketika GPU tidak tersedia, atau ketika Anda menginginkan setup yang hemat biaya.

## Jalankan inferensi

Model dimuat di CPU secara default jika Anda tidak meneruskan `device_map`, dan [pipeline()](/docs/transformers/main/id/main_classes/pipelines#transformers.pipeline) menggunakan CPU jika tidak ada akselerator yang tersedia. Teruskan `device_map="cpu"` atau `device="cpu"` untuk menggunakan CPU pada mesin yang juga memiliki akselerator.

```py
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"])
```

## Latih dengan Trainer

CPU dengan dukungan bf16, seperti prosesor Intel dan AMD terbaru, dapat menggunakan pelatihan presisi campuran bf16 dengan [AMP PyTorch](https://docs.pytorch.org/docs/stable/amp), yang mengurangi penggunaan memori dan mempercepat pelatihan.

Contoh di bawah ini mencakup tiga konfigurasi, dari satu CPU hingga beberapa mesin ketika satu CPU terlalu lambat:

- satu CPU
- beberapa proses pada satu mesin (satu per soket CPU)
- beberapa proses di beberapa mesin

Contoh single-node dan multi-node meluncurkan proses dengan `mpirun` dari [Intel MPI](https://www.intel.com/content/www/us/en/developer/tools/oneapi/mpi-library.html), bagian dari [Intel oneAPI HPC Toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/hpc-toolkit.html), dan [Trainer](/docs/transformers/main/id/main_classes/trainer#transformers.Trainer) menjalankan DDP di atas backend `gloo`.

Setel `bf16=True` dan `use_cpu=True` di [TrainingArguments](/docs/transformers/main/id/main_classes/trainer#transformers.TrainingArguments), atau berikan `--bf16` dan `--use_cpu` ke skrip pelatihan. Utamakan bf16 daripada fp16 pada CPU karena lebih stabil secara numerik.

```py
from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./outputs",
    bf16=True,
    use_cpu=True,
)
```

Pada CPU dual-socket, jalankan satu proses per socket. Menjaga akses memori tetap lokal di setiap socket meningkatkan throughput. Contoh di bawah ini meluncurkan dua proses pada satu mesin dengan satu proses per socket, di mana `train.py` adalah skrip pelatihan `Trainer` Anda.

> [!TIP]
> Set `OMP_NUM_THREADS` ke jumlah core fisik pada satu socket, dikurangi satu core yang dicadangkan untuk OS. Misalnya, pada socket 24-core, set `OMP_NUM_THREADS=23`.

```bash
export MASTER_ADDR=127.0.0.1
mpirun -n 2 -genv OMP_NUM_THREADS=23 \
python3 train.py \
 --output_dir ./outputs \
 --use_cpu \
 --bf16
```

Skalakan pelatihan ke empat proses di dua mesin (`node0` dan `node1`) menggunakan `hostfile` yang mencantumkan alamat IP setiap node. Flag `-n 4` mengatur jumlah total proses. `-ppn 2` mengatur dua proses per node (satu per socket).

Jalankan skrip ini dari `node0`, yang bertindak sebagai proses utama.

> [!TIP]
> Set `OMP_NUM_THREADS` ke jumlah core fisik pada satu socket, dikurangi satu core yang dicadangkan untuk OS. Misalnya, pada socket 24-core, set `OMP_NUM_THREADS=23`.

Buat hostfile dengan alamat IP dari setiap node.

```bash
cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ip
```

Lalu jalankan skrip pelatihan.

```bash
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 \
 --bf16
```

## Sesuaikan kinerja CPU

Pramuatkan allocator memori yang lebih cepat dan runtime OpenMP dari Intel untuk mengurangi overhead dalam pelatihan CPU. Instal `google-perftools` (untuk `libtcmalloc`) dan paket Python `intel-openmp` (untuk `libiomp5`), lalu tambahkan kedua pustaka tersebut ke variabel lingkungan `LD_PRELOAD` sebelum Anda memulai pelatihan.

Set `OMP_NUM_THREADS` ke jumlah core yang dapat digunakan oleh setiap proses. Dalam container atau job cluster dengan batas CPU, itu adalah jumlah unit CPU yang dialokasikan, jadi sisakan beberapa core yang tidak dialokasikan untuk proses sistem.

## Langkah selanjutnya

- Baca artikel blog [Accelerating PyTorch Transformers with Intel Sapphire Rapids](https://huggingface.co/blog/intel-sapphire-rapids) untuk melihat lebih dalam tentang kinerja BF16 pada perangkat keras Intel modern.
- Baca [DDP](./ddp) untuk informasi lebih lanjut tentang strategi distribusi yang digunakan oleh contoh multi-proses.
- Baca catatan [threading CPU](https://docs.pytorch.org/docs/stable/notes/cpu_threading_torchscript_inference.html) PyTorch untuk mempelajari bagaimana `OMP_NUM_THREADS` memengaruhi kinerja.
- Baca [panduan PyTorchJob](https://www.kubeflow.org/docs/components/training/user-guides/pytorch/) Kubeflow untuk menjalankan pelatihan CPU terdistribusi di Kubernetes.

