Optimum 文档

分布式训练

您正在查看 主分支 版本,需要从源代码安装。如果您希望使用常规 pip 安装,请查看最新稳定版本(v1.23.1)。
Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

分布式训练

当在单个 CPU 上训练速度太慢时,我们可以使用多个 CPU。本指南重点介绍基于 PyTorch 的 DDP,它可以有效地实现分布式 CPU 训练。

多 CPU 上的分布式训练由 mpirun 启动,mpirun 支持 Gloo 和 oneCCL 作为集体通信后端。为了追求性能,英特尔建议使用 oneCCL 后端。

英特尔® oneCCL(集体通信库)是一个用于高效分布式深度学习训练的库,实现了诸如 allreduce、allgather、alltoall 等集体操作。有关 oneCCL 的更多信息,请参阅 oneCCL 文档oneCCL 规范

模块 oneccl_bindings_for_pytorch(1.12 版本之前为 torch_ccl)实现了 PyTorch C10D ProcessGroup API,可以作为外部 ProcessGroup 动态加载,目前仅在 Linux 平台上有效。

查看有关 oneccl_bind_pt 的更多详细信息。

我们将展示如何使用以下步骤使用基于 oneCCL 后端的分布式训练。

英特尔® oneCCL PyTorch 绑定安装

以下 Python 版本提供了 Wheel 文件

扩展版本 Python 3.6 Python 3.7 Python 3.8 Python 3.9 Python 3.10
1.12.1
1.12.0
1.11.0
1.10.0
pip install oneccl_bind_pt=={pytorch_version} -f https://software.intel.com/ipex-whl-stable

其中 {pytorch_version} 应为您的 PyTorch 版本,例如 1.12.0。oneCCL 和 PyTorch 的版本必须匹配。oneccl_bindings_for_pytorch 1.12.0 预构建的 wheel 不适用于 PyTorch 1.12.1(它是为 PyTorch 1.12.0 而设计的)。PyTorch 1.12.1 应与 oneccl_bindings_for_pytorch 1.12.1 配合使用。

英特尔® oneCCL 1.12.0 的 MPI 工具集

oneccl_bindings_for_pytorch_path=$(python -c "from oneccl_bindings_for_pytorch import cwd; print(cwd)")
source $oneccl_bindings_for_pytorch_path/env/setvars.sh

对于版本 < 1.12.0 的英特尔® oneCCL

torch_ccl_path=$(python -c "import torch; import torch_ccl; import os;  print(os.path.abspath(os.path.dirname(torch_ccl.__file__)))")
source $torch_ccl_path/env/setvars.sh

以下命令启用在一个节点上使用 2 个进程进行训练,每个套接字运行一个进程。可以调整变量 OMP_NUM_THREADS/CCL_WORKER_COUNT 以获得最佳性能。

export CCL_WORKER_COUNT=1
export MASTER_ADDR=127.0.0.1
mpirun -n 2 -genv OMP_NUM_THREADS=23 \
python3 run_qa.py \
    --model_name_or_path distilbert-base-uncased-distilled-squad \
    --dataset_name squad \
    --apply_quantization \
    --quantization_approach static \
    --do_train \
    --do_eval \
    --verify_loading \
    --output_dir /tmp/squad_output \
    --no_cuda \
    --xpu_backend ccl

以下命令启用在两个节点(node0 和 node1,以 node0 作为主进程)上总共四个进程进行训练,ppn(每个节点的进程数)设置为 2,每个套接字运行一个进程。可以调整变量 OMP_NUM_THREADS/CCL_WORKER_COUNT 以获得最佳性能。

在 node0 中,您需要创建一个包含每个节点 IP 地址的配置文件(例如 hostfile),并将该配置文件路径作为参数传递。

 cat hostfile
 xxx.xxx.xxx.xxx #node0 ip
 xxx.xxx.xxx.xxx #node1 ip

现在,在 node0 中运行以下命令,并且 **4DDP** 将在 node0 和 node1 中启用。

export CCL_WORKER_COUNT=1
export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip
mpirun -f hostfile -n 4 -ppn 2 \
-genv OMP_NUM_THREADS=23 \
python3 run_qa.py \
    --model_name_or_path distilbert-base-uncased-distilled-squad \
    --dataset_name squad \
    --apply_quantization \
    --quantization_approach static \
    --do_train \
    --do_eval \
    --verify_loading \
    --output_dir /tmp/squad_output \
    --no_cuda \
    --xpu_backend ccl
< > 在 GitHub 上更新