Transformers documentation
CPU
CPU
Процессоры выполняют модели Transformers с использованием строки устройства cpu, без ускорителя. Они подходят для инференса и обучения, когда GPU недоступны или когда требуется экономичная конфигурация.
Запуск вывода
По умолчанию модели загружаются на CPU, если не передать device_map, а 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, такие как современные процессоры Intel и AMD, могут использовать обучение с смешанной точностью bf16 с помощью AMP в PyTorch, что снижает потребление памяти и ускоряет обучение.
Приведённые ниже примеры охватывают три конфигурации: от одного CPU до нескольких машин, когда одного CPU недостаточно:
- один CPU
- несколько процессов на одной машине (по одному на каждый сокет CPU)
- несколько процессов на нескольких машинах
Примеры для одного и нескольких узлов запускают процессы с помощью mpirun из Intel MPI, входящего в состав Intel oneAPI HPC Toolkit, а Trainer выполняет DDP через бэкенд gloo.
Установите bf16=True и use_cpu=True в TrainingArguments или передайте --bf16 и --use_cpu в скрипт обучения. На CPU предпочтительнее использовать bf16, а не fp16, так как он обеспечивает большую численную устойчивость.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
use_cpu=True,
)На процессоре с двумя сокетами запускайте по одному процессу на сокет. Ограничение доступа к памяти рамками каждого сокета повышает пропускную способность. В примере ниже на одном компьютере запускаются два процесса — по одному на сокет, где 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Масштабируйте обучение до четырёх процессов на двух машинах (node0 и node1) с помощью hostfile, в котором указан IP-адрес каждого узла. Флаг -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) и пакет Python intel-openmp (для libiomp5), затем добавьте обе библиотеки в переменную окружения LD_PRELOAD перед запуском обучения.
Установите OMP_NUM_THREADS в значение количества ядер, доступных каждому процессу. В контейнере или в кластерной задаче с ограничениями по CPU это количество выделенных CPU-единиц, поэтому оставьте часть ядер незанятыми для системных процессов.
Дальнейшие шаги
- Ознакомьтесь с публикацией Accelerating PyTorch Transformers with Intel Sapphire Rapids, чтобы подробнее узнать о производительности BF16 на современном оборудовании Intel.
- Подробнее о распределённой стратегии, используемой в примерах с несколькими процессами, читайте в DDP.
- Ознакомьтесь с заметками PyTorch о потоках CPU, чтобы узнать, как
OMP_NUM_THREADSвлияет на производительность. - Ознакомьтесь с руководством PyTorchJob Kubeflow, чтобы выполнять распределённое обучение на CPU в Kubernetes.