Optimum 文档
分布式训练
并获得增强的文档体验
开始使用
分布式训练
当单个 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