Transformers documentation
CPU
CPU
CPU 使用设备字符串 cpu 来运行 Transformers 模型,无需加速器。在 GPU 不可用或希望采用更具成本效益的配置时,CPU 可用于推理和训练。
运行推理
在未传入 device_map 的情况下,模型默认加载到 CPU 上,并且当没有可用加速器时,pipeline() 会使用 CPU。如果机器上同时配备了加速器,请传入 device_map="cpu" 或 device="cpu" 以使用 CPU。
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"])使用 Trainer 进行训练
支持 bf16 的 CPU(例如较新的 Intel 和 AMD 处理器)可以使用 PyTorch 的 AMP 进行 bf16 混合精度训练,从而降低内存占用并加快训练速度。
以下示例涵盖了三种配置,从单 CPU 到多台机器(当单个 CPU 速度过慢时):
- 单个 CPU
- 一台机器上的多个进程(每个 CPU 插槽一个)
- 跨多台机器的多个进程
单节点和多节点示例使用 Intel MPI(Intel oneAPI HPC Toolkit 的一部分)中的 mpirun 来启动进程,并且 Trainer 通过 gloo 后端运行 DDP。
在 TrainingArguments 中设置 bf16=True 和 use_cpu=True,或者向训练脚本传递 --bf16 和 --use_cpu。在 CPU 上,请优先使用 bf16 而非 fp16,因为其数值稳定性更高。
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
use_cpu=True,
)在双路 CPU 上,每个插槽运行一个进程。将内存访问保持在每个插槽本地可以提高吞吐量。下面的示例在单台机器上启动两个进程,每个插槽一个进程,其中 train.py 是你的 Trainer 训练脚本。
将
OMP_NUM_THREADS设置为单个插槽的物理核心数,并减去一个为操作系统保留的核心。例如,在 24 核插槽上,请设置OMP_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使用列出每个节点 IP 地址的 hostfile,将训练扩展到两台机器(node0 和 node1)上的四个进程。-n 4 标志用于设置进程总数。-ppn 2 用于设置每个节点两个进程(每个插槽一个)。
在作为主进程的 node0 上运行此脚本。
将
OMP_NUM_THREADS设置为单个插槽的物理核心数,并减去一个为操作系统保留的核心。例如,在 24 核插槽上,请设置OMP_NUM_THREADS=23。
创建一个 hostfile,其中包含每个节点的 IP 地址。
cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ip然后运行训练脚本。
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调整 CPU 性能
预加载更快的内存分配器和 Intel 的 OpenMP 运行时,以降低 CPU 训练中的开销。安装 google-perftools(用于 libtcmalloc)和 intel-openmp Python 包(用于 libiomp5),然后在启动训练前将这两个库添加到 LD_PRELOAD 环境变量中。
将 OMP_NUM_THREADS 设置为每个进程可使用的核心数。在具有 CPU 限制的容器或集群作业中,该值应为已分配的 CPU 单元数,因此请预留部分核心供系统进程使用。
后续步骤
- 阅读 使用 Intel Sapphire Rapids 加速 PyTorch Transformers 博客文章,深入了解现代 Intel 硬件上的 BF16 性能。
- 有关多进程示例所使用的分布式策略,请参阅 DDP。
- 阅读 PyTorch 的 CPU 线程 说明,了解
OMP_NUM_THREADS如何影响性能。 - 阅读 Kubeflow 的 PyTorchJob 指南,以在 Kubernetes 上运行分布式 CPU 训练。