Optimum 文档

分布式训练

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

并获得增强的文档体验

开始使用

分布式训练

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

多 CPU 分布式训练通过 mpirun 启动,它支持 Gloo 和 oneCCL 作为集合通信后端。为了性能考虑,英特尔推荐使用 oneCCL 后端。

Intel® 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 后端进行分布式训练。

Intel® oneCCL Bindings for 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 配合使用

适用于 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

适用于 Intel® oneCCL 版本 < 1.12.0

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 中运行以下命令,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 上更新