Transformers documentation
CPU
CPU
CPU chạy các mô hình Transformers với chuỗi thiết bị cpu, không có bộ tăng tốc. Chúng hoạt động cho suy luận và huấn luyện khi không có GPU, hoặc khi bạn muốn một cấu hình tiết kiệm chi phí.
Chạy suy luận
Các mô hình được nạp lên CPU theo mặc định khi bạn không truyền device_map, và pipeline() sẽ sử dụng CPU khi không có bộ tăng tốc nào khả dụng. Hãy truyền device_map="cpu" hoặc device="cpu" để sử dụng CPU trên một máy cũng có bộ tăng tốc.
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"])Huấn luyện với Trainer
CPU hỗ trợ bf16, chẳng hạn như các bộ xử lý Intel và AMD đời mới, có thể sử dụng huấn luyện độ chính xác hỗn hợp bf16 với AMP của PyTorch, giúp giảm lượng bộ nhớ sử dụng và tăng tốc độ huấn luyện.
Các ví dụ bên dưới bao gồm ba cấu hình, từ một CPU đơn lẻ đến nhiều máy khi một CPU quá chậm:
- một CPU đơn
- nhiều tiến trình trên một máy (một tiến trình cho mỗi socket CPU)
- nhiều tiến trình trên nhiều máy
Các ví dụ đơn nút và đa nút khởi chạy các tiến trình bằng mpirun từ Intel MPI, một phần của Intel oneAPI HPC Toolkit, và Trainer chạy DDP trên backend gloo.
Đặt bf16=True và use_cpu=True trong TrainingArguments, hoặc truyền --bf16 và --use_cpu cho một script huấn luyện. Nên ưu tiên bf16 hơn fp16 trên CPU vì nó ổn định hơn về mặt số học.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
use_cpu=True,
)Trên CPU hai socket, hãy chạy một tiến trình cho mỗi socket. Việc giữ các truy cập bộ nhớ cục bộ cho từng socket giúp cải thiện thông lượng. Ví dụ bên dưới khởi chạy hai tiến trình trên một máy duy nhất với một tiến trình cho mỗi socket, trong đó train.py là script huấn luyện Trainer của bạn.
Đặt
OMP_NUM_THREADSbằng số nhân vật lý trên một socket, trừ đi một nhân dành cho hệ điều hành. Ví dụ, trên một socket 24 nhân, hãy đặtOMP_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 \
--bf16Mở rộng huấn luyện lên bốn tiến trình trên hai máy (node0 và node1) bằng cách sử dụng hostfile liệt kê địa chỉ IP của từng node. Cờ -n 4 đặt tổng số tiến trình. -ppn 2 đặt hai tiến trình trên mỗi node (một tiến trình trên mỗi socket).
Chạy script này từ node0, đóng vai trò là tiến trình chính.
Đặt
OMP_NUM_THREADSbằng số nhân vật lý trên một socket, trừ đi một nhân dành cho hệ điều hành. Ví dụ, trên một socket 24 nhân, hãy đặtOMP_NUM_THREADS=23.
Tạo một hostfile chứa địa chỉ IP của từng node.
cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ipSau đó, chạy script huấn luyện.
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 \
--bf16Tối ưu hiệu năng CPU
Tải trước bộ cấp phát bộ nhớ nhanh hơn và runtime OpenMP của Intel để giảm overhead trong huấn luyện CPU. Cài đặt google-perftools (cho libtcmalloc) và gói Python intel-openmp (cho libiomp5), sau đó thêm cả hai thư viện vào biến môi trường LD_PRELOAD trước khi bạn khởi chạy huấn luyện.
Đặt OMP_NUM_THREADS bằng số lõi mà mỗi tiến trình có thể sử dụng. Trong một container hoặc một tác vụ cụm có giới hạn CPU, đó là số đơn vị CPU được cấp phát, vì vậy hãy để một số lõi chưa được cấp phát cho các tiến trình hệ thống.
Các bước tiếp theo
- Đọc bài đăng trên blog Tăng tốc PyTorch Transformers với Intel Sapphire Rapids để tìm hiểu sâu hơn về hiệu năng BF16 trên phần cứng Intel hiện đại.
- Đọc DDP để tìm hiểu thêm về chiến lược phân tán mà các ví dụ đa tiến trình sử dụng.
- Đọc ghi chú về luồng CPU của PyTorch để tìm hiểu cách
OMP_NUM_THREADSảnh hưởng đến hiệu suất. - Đọc hướng dẫn PyTorchJob của Kubeflow để chạy huấn luyện CPU phân tán trên Kubernetes.