分布式训练
当在单个 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