Optimum 文档

分布式训练

您正在查看 main 版本,该版本需要从源码安装。如果您想要常规 pip 安装,请查看最新的稳定版本 (v1.24.0)。
Hugging Face's logo
加入 Hugging Face 社区

并获取增强的文档体验

开始使用

分布式训练

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

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

Intel® oneCCL (collective communications library) 是一个用于高效分布式深度学习训练的库,实现了 allreduce、allgather、alltoall 等 collectives。有关 oneCCL 的更多信息,请参阅 oneCCL 文档oneCCL 规范

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

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

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

Intel® oneCCL PyTorch 绑定的安装

Wheel 文件适用于以下 Python 版本

扩展版本 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 兼容

用于 Intel® 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 的 Intel® 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 个进程进行训练,每个 socket 运行一个进程。变量 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,每个 socket 运行一个进程。变量 OMP_NUM_THREADS/CCL_WORKER_COUNT 可以进行调整以获得最佳性能。

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

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

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

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 上更新