#
在CPU上进行高效训练

本指南将重点介绍如何在CPU上高效训练大型模型。

##
使用IPEX进行混合精度训练

混合精度训练在模型中可以同时使用单精度（fp32）和半精度（bf16/fp16）的数据类型来加速训练或推理过程，并且仍然能保留大部分单精度的准确性。现代的CPU，例如第三代、第四代和第五代Intel® Xeon® Scalable处理器，原生支持bf16，而第六代Intel® Xeon® Scalable处理器原生支持bf16和fp16。您在训练时启用bf16或fp16的混合精度训练可以直接提高处理性能。

为了进一步最大化训练性能，您可以使用Intel® PyTorch扩展（IPEX）。IPEX是一个基于PyTorch构建的库，增加了额外的CPU指令集架构（ISA）级别的支持，比如Intel®高级向量扩展512（Intel® AVX512-VNNI）和Intel®高级矩阵扩展（Intel® AMX）。这为Intel CPU提供额外的性能提升。然而，仅支持AVX2的CPU（例如AMD或较旧的Intel CPU）在使用IPEX时并不保证能提高性能。

从PyTorch 1.10版本起，CPU后端已经启用了自动混合精度（AMP）。IPEX还支持bf16/fp16的AMP和bf16/fp16算子优化，并且部分功能已经上游到PyTorch主分支。通过IPEX AMP，您可以获得更好的性能和用户体验。

点击这里查看自动混合精度的更多详细信息。

###
IPEX 安装:

IPEX 的发布与 PyTorch 一致，您可以通过 pip 安装：

PyTorch Version | IPEX version
--- | ---
2.5.0 | 2.5.0+cpu
2.4.0 | 2.4.0+cpu
2.3.0 | 2.3.0+cpu
2.2.0 | 2.2.0+cpu

请运行 `pip list | grep torch` 以获取您的 `pytorch_version`，然后根据该版本安装相应的 `IPEX version_name`。

    pip install intel_extension_for_pytorch==<version_name> -f https://developer.intel.com/ipex-whl-stable-cpu

如果需要的话，您可以在 ipex-whl-stable-cpu 查看最新版本。

查看更多 安装IPEX 的方法。

###
在 Trainer 中使用 IPEX

在 Trainer 中使用 IPEX 时，您应在训练命令参数中添加 `use_ipex`、`bf16` 或 `fp16` 以及 `no_cuda` 来启用自动混合精度。

以 Transformers 问答任务为例：

- 在 CPU 上使用 BF16 自动混合精度训练 IPEX 的示例如下：

       python examples/pytorch/question-answering/run_qa.py \
      --model_name_or_path google-bert/bert-base-uncased \
      --dataset_name squad \
      --do_train \
      --do_eval \
      --per_device_train_batch_size 12 \
      --learning_rate 3e-5 \
      --num_train_epochs 2 \
      --max_seq_length 384 \
      --doc_stride 128 \
      --output_dir /tmp/debug_squad/ \
      --use_ipex \
      --bf16 \
      --use_cpu

如果您想在脚本中启用 `use_ipex` 和 `bf16`，请像下面这样将这些参数添加到 `TrainingArguments` 中：

    training_args = TrainingArguments(
        output_dir=args.output_path,
    +   bf16=True,
    +   use_ipex=True,
    +   use_cpu=True,
        **kwargs
    )

###
实践示例

博客: 使用 Intel Sapphire Rapids 加速 PyTorch Transformers

< > Update on GitHub