Transformers documentation
CPU
CPU
CPU는 가속기 없이 cpu라는 device 문자열을 사용하여 Transformers 모델을 실행합니다. GPU가 사용 불가능한 경우나 비용 효율적인 구성을 원할 때 추론과 학습에 사용할 수 있습니다.
추론 실행
device_map를 전달하지 않으면 모델은 기본적으로 CPU에 로드되며, 가속기가 없는 경우 pipeline()은 CPU를 사용합니다. 가속기가 있는 머신에서 CPU를 사용하려면 device_map="cpu" 또는 device="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로 학습
최근 Intel 및 AMD 프로세서와 같이 bf16을 지원하는 CPU는 PyTorch의 AMP를 사용하여 bf16 혼합 정밀도 훈련을 수행할 수 있으며, 이를 통해 메모리 사용량을 줄이고 훈련 속도를 높일 수 있습니다.
아래 예제는 CPU 1개에서 CPU 1개가 너무 느릴 때 여러 대의 머신을 사용하는 세 가지 구성을 다룹니다:
- 단일 CPU
- multiple processes on one machine (one per CPU socket)
- 여러 대의 머신에 걸친 여러 프로세스
단일 노드 및 다중 노드 예제는 Intel oneAPI HPC Toolkit의 일부인 Intel MPI의 mpirun으로 프로세스를 시작하며, Trainer는 gloo 백엔드를 통해 DDP를 실행합니다.
bf16=True와 use_cpu=True를 TrainingArguments에 설정하거나, 학습 스크립트에 --bf16와 --use_cpu를 전달하세요. CPU에서는 수치적으로 더 안정적이므로 fp16보다 bf16을 사용하는 것이 좋습니다.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
use_cpu=True,
)듀얼 소켓 CPU에서는 소켓당 하나의 프로세스를 실행하세요. 메모리 접근을 각 소켓에 로컬로 유지하면 처리량이 향상됩니다. 아래 예제는 train.py가 Trainer 학습 스크립트인 단일 머신에서 소켓당 하나의 프로세스씩 두 프로세스를 시작합니다.
OMP_NUM_THREADS를 하나의 소켓에 있는 물리 코어 수에서 OS를 위해 예약된 1코어를 뺀 값으로 설정하세요. 예를 들어, 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)에 걸쳐 4개의 프로세스로 학습을 확장합니다. -n 4 플래그는 프로세스의 총 수를 설정합니다. -ppn 2는 노드당 2개의 프로세스(소켓당 1개)를 설정합니다.
메인 프로세스로 작동하는 node0에서 이 스크립트를 실행합니다.
OMP_NUM_THREADS를 하나의 소켓에 있는 물리 코어 수에서 OS를 위해 예약된 1코어를 뺀 값으로 설정하세요. 예를 들어, 24코어 소켓의 경우OMP_NUM_THREADS=23으로 설정합니다.
각 노드의 IP 주소를 포함하여 hostfile을 생성합니다.
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 \
--bf16CPU 성능 조정
CPU 학습의 오버헤드를 줄이기 위해 더 빠른 메모리 할당기와 Intel의 OpenMP 런타임을 사전 로드합니다. google-perftools(libtcmalloc용)와 intel-openmp Python 패키지(libiomp5용)를 설치한 후, 학습을 시작하기 전에 두 라이브러리를 모두 LD_PRELOAD 환경 변수에 추가합니다.
OMP_NUM_THREADS를 각 프로세스가 사용할 수 있는 코어 수로 설정합니다. CPU 제한이 있는 컨테이너 또는 클러스터 작업의 경우, 이는 할당된 CPU 단위 수이므로 시스템 프로세스를 위해 일부 코어를 할당하지 않는 것이 좋습니다.
다음 단계
- 현대 Intel 하드웨어에서 BF16 성능을 심층적으로 살펴보기 위해 Accelerating PyTorch Transformers with Intel Sapphire Rapids 블로그 게시물을 읽어보세요.
- 멀티프로세스 예제에서 사용하는 분산 전략에 대한 자세한 내용은 DDP를 참고하세요.
OMP_NUM_THREADS가 성능에 어떤 영향을 미치는지 알아보려면 PyTorch CPU 스레딩 참고 문서를 읽어보세요.- Kubernetes에서 분산 CPU 학습을 실행하려면 Kubeflow PyTorchJob 가이드를 읽어보세요.